blob: 5fce339f27146c24572d74b95f07a675fdce0cbc [file] [log] [blame]
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001/*
Wenzel Jakob48548ea2016-01-17 22:36:44 +01002 pybind11/pybind11.h: Main header file of the C++11 python
3 binding generator library
Wenzel Jakob38bd7112015-07-05 20:05:44 +02004
Wenzel Jakob8cb6cb32016-04-17 20:21:41 +02005 Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
Wenzel Jakob38bd7112015-07-05 20:05:44 +02006
7 All rights reserved. Use of this source code is governed by a
8 BSD-style license that can be found in the LICENSE file.
9*/
10
Wenzel Jakobbd4a5292015-07-11 17:41:48 +020011#pragma once
Wenzel Jakob38bd7112015-07-05 20:05:44 +020012
Baljak81da9882018-11-20 23:22:02 +010013#if defined(__INTEL_COMPILER)
14# pragma warning push
15# pragma warning disable 68 // integer conversion resulted in a change of sign
16# pragma warning disable 186 // pointless comparison of unsigned integer with zero
17# pragma warning disable 878 // incompatible exception specifications
18# pragma warning disable 1334 // the "template" keyword used for syntactic disambiguation may only be used within a template
19# pragma warning disable 1682 // implicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
20# pragma warning disable 1786 // function "strdup" was declared deprecated
21# pragma warning disable 1875 // offsetof applied to non-POD (Plain Old Data) types is nonstandard
22# pragma warning disable 2196 // warning #2196: routine is both "inline" and "noinline"
23#elif defined(_MSC_VER)
Wenzel Jakob48548ea2016-01-17 22:36:44 +010024# pragma warning(push)
Wenzel Jakob1ffce742016-08-25 01:43:33 +020025# pragma warning(disable: 4100) // warning C4100: Unreferenced formal parameter
Wenzel Jakob48548ea2016-01-17 22:36:44 +010026# pragma warning(disable: 4127) // warning C4127: Conditional expression is constant
Wenzel Jakob1ffce742016-08-25 01:43:33 +020027# pragma warning(disable: 4512) // warning C4512: Assignment operator was implicitly defined as deleted
Wenzel Jakob48548ea2016-01-17 22:36:44 +010028# pragma warning(disable: 4800) // warning C4800: 'int': forcing value to bool 'true' or 'false' (performance warning)
29# pragma warning(disable: 4996) // warning C4996: The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +090030# pragma warning(disable: 4702) // warning C4702: unreachable code
Dean Moldovan2bab5792016-09-23 00:27:59 +020031# pragma warning(disable: 4522) // warning C4522: multiple assignment operators specified
Wenzel Jakob6d252962016-05-01 20:47:49 +020032#elif defined(__GNUG__) && !defined(__clang__)
Wenzel Jakob48548ea2016-01-17 22:36:44 +010033# pragma GCC diagnostic push
34# pragma GCC diagnostic ignored "-Wunused-but-set-parameter"
35# pragma GCC diagnostic ignored "-Wunused-but-set-variable"
36# pragma GCC diagnostic ignored "-Wmissing-field-initializers"
Wenzel Jakobdeeab552016-05-15 23:54:34 +020037# pragma GCC diagnostic ignored "-Wstrict-aliasing"
38# pragma GCC diagnostic ignored "-Wattributes"
Jason Rhinelanderd15b2172017-05-09 14:46:15 -040039# if __GNUC__ >= 7
40# pragma GCC diagnostic ignored "-Wnoexcept-type"
41# endif
Wenzel Jakob38bd7112015-07-05 20:05:44 +020042#endif
43
Wenzel Jakob48548ea2016-01-17 22:36:44 +010044#include "attr.h"
Alexander Stukowski9a110e62016-11-15 12:38:05 +010045#include "options.h"
Dean Moldovanf5806492017-08-14 00:35:53 +020046#include "detail/class.h"
Jason Rhinelander464d9892017-06-12 21:52:48 -040047#include "detail/init.h"
Wenzel Jakob38bd7112015-07-05 20:05:44 +020048
Wenzel Jakoba1b71df2019-06-19 10:48:36 +020049#if defined(__GNUG__) && !defined(__clang__)
50# include <cxxabi.h>
51#endif
52
Yannick Jadoulf980d762020-07-09 00:14:41 +020053PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
Wenzel Jakob38bd7112015-07-05 20:05:44 +020054
Wenzel Jakobd4258ba2015-07-26 16:33:49 +020055/// Wraps an arbitrary C++ function/method/lambda function/.. into a callable Python object
Wenzel Jakobbd4a5292015-07-11 17:41:48 +020056class cpp_function : public function {
Wenzel Jakobd4258ba2015-07-26 16:33:49 +020057public:
Henry Schreinerb491b462020-09-10 23:15:22 -040058 cpp_function() = default;
Ted Drain0a0758c2017-11-07 08:35:27 -080059 cpp_function(std::nullptr_t) { }
Wenzel Jakob38bd7112015-07-05 20:05:44 +020060
Wenzel Jakob5984baa2016-05-10 15:05:03 +010061 /// Construct a cpp_function from a vanilla function pointer
Jason Rhinelander1d7998e2017-02-17 06:56:41 -050062 template <typename Return, typename... Args, typename... Extra>
63 cpp_function(Return (*f)(Args...), const Extra&... extra) {
Wenzel Jakob5984baa2016-05-10 15:05:03 +010064 initialize(f, f, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +020065 }
Wenzel Jakobd4258ba2015-07-26 16:33:49 +020066
Wenzel Jakob5984baa2016-05-10 15:05:03 +010067 /// Construct a cpp_function from a lambda function (possibly with internal state)
Jason Rhinelanderb4bf5ed2017-05-10 01:51:08 -040068 template <typename Func, typename... Extra,
69 typename = detail::enable_if_t<detail::is_lambda<Func>::value>>
Jason Rhinelander1d7998e2017-02-17 06:56:41 -050070 cpp_function(Func &&f, const Extra&... extra) {
Wenzel Jakob71867832015-07-29 17:43:52 +020071 initialize(std::forward<Func>(f),
Jason Rhinelanderb4bf5ed2017-05-10 01:51:08 -040072 (detail::function_signature_t<Func> *) nullptr, extra...);
Wenzel Jakobd4258ba2015-07-26 16:33:49 +020073 }
74
Clemens Sielaff63df87f2020-06-10 04:35:10 -070075 /// Construct a cpp_function from a class method (non-const, no ref-qualifier)
Jason Rhinelander1d7998e2017-02-17 06:56:41 -050076 template <typename Return, typename Class, typename... Arg, typename... Extra>
77 cpp_function(Return (Class::*f)(Arg...), const Extra&... extra) {
Robert Haschkef2226ae2020-07-07 15:56:07 +020078 initialize([f](Class *c, Arg... args) -> Return { return (c->*f)(std::forward<Arg>(args)...); },
Jason Rhinelander1d7998e2017-02-17 06:56:41 -050079 (Return (*) (Class *, Arg...)) nullptr, extra...);
Wenzel Jakobd4258ba2015-07-26 16:33:49 +020080 }
81
Clemens Sielaff63df87f2020-06-10 04:35:10 -070082 /// Construct a cpp_function from a class method (non-const, lvalue ref-qualifier)
83 /// A copy of the overload for non-const functions without explicit ref-qualifier
84 /// but with an added `&`.
85 template <typename Return, typename Class, typename... Arg, typename... Extra>
86 cpp_function(Return (Class::*f)(Arg...)&, const Extra&... extra) {
87 initialize([f](Class *c, Arg... args) -> Return { return (c->*f)(args...); },
88 (Return (*) (Class *, Arg...)) nullptr, extra...);
89 }
90
91 /// Construct a cpp_function from a class method (const, no ref-qualifier)
Jason Rhinelander1d7998e2017-02-17 06:56:41 -050092 template <typename Return, typename Class, typename... Arg, typename... Extra>
93 cpp_function(Return (Class::*f)(Arg...) const, const Extra&... extra) {
Robert Haschkef2226ae2020-07-07 15:56:07 +020094 initialize([f](const Class *c, Arg... args) -> Return { return (c->*f)(std::forward<Arg>(args)...); },
Jason Rhinelander1d7998e2017-02-17 06:56:41 -050095 (Return (*)(const Class *, Arg ...)) nullptr, extra...);
Wenzel Jakobd4258ba2015-07-26 16:33:49 +020096 }
97
Clemens Sielaff63df87f2020-06-10 04:35:10 -070098 /// Construct a cpp_function from a class method (const, lvalue ref-qualifier)
99 /// A copy of the overload for const functions without explicit ref-qualifier
100 /// but with an added `&`.
101 template <typename Return, typename Class, typename... Arg, typename... Extra>
102 cpp_function(Return (Class::*f)(Arg...) const&, const Extra&... extra) {
103 initialize([f](const Class *c, Arg... args) -> Return { return (c->*f)(args...); },
104 (Return (*)(const Class *, Arg ...)) nullptr, extra...);
105 }
106
Wenzel Jakob57082212015-09-04 23:42:12 +0200107 /// Return the function name
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100108 object name() const { return attr("__name__"); }
Wenzel Jakob57082212015-09-04 23:42:12 +0200109
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100110protected:
Wenzel Jakob382484a2016-09-10 15:28:37 +0900111 /// Space optimization: don't inline this frequently instantiated fragment
112 PYBIND11_NOINLINE detail::function_record *make_function_record() {
113 return new detail::function_record();
114 }
115
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100116 /// Special internal constructor for functors, lambda functions, etc.
Jason Rhinelander1d7998e2017-02-17 06:56:41 -0500117 template <typename Func, typename Return, typename... Args, typename... Extra>
118 void initialize(Func &&f, Return (*)(Args...), const Extra&... extra) {
Dean Moldovan56613942017-07-02 12:52:00 +0200119 using namespace detail;
Jason Rhinelander657a51e2018-01-12 12:06:46 -0400120 struct capture { remove_reference_t<Func> f; };
Wenzel Jakobd4258ba2015-07-26 16:33:49 +0200121
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100122 /* Store the function including any extra state it might have (e.g. a lambda capture object) */
Wenzel Jakob382484a2016-09-10 15:28:37 +0900123 auto rec = make_function_record();
Wenzel Jakob71867832015-07-29 17:43:52 +0200124
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100125 /* Store the capture object directly in the function record if there is enough space */
126 if (sizeof(capture) <= sizeof(rec->data)) {
Wenzel Jakob954b7932016-07-10 10:13:18 +0200127 /* Without these pragmas, GCC warns that there might not be
128 enough space to use the placement new operator. However, the
129 'if' statement above ensures that this is the case. */
Jason Rhinelander0b12f912016-07-07 16:26:04 -0400130#if defined(__GNUG__) && !defined(__clang__) && __GNUC__ >= 6
Jason Rhinelandercae0e002016-07-07 16:11:42 -0400131# pragma GCC diagnostic push
132# pragma GCC diagnostic ignored "-Wplacement-new"
133#endif
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100134 new ((capture *) &rec->data) capture { std::forward<Func>(f) };
Jason Rhinelander0b12f912016-07-07 16:26:04 -0400135#if defined(__GNUG__) && !defined(__clang__) && __GNUC__ >= 6
Jason Rhinelandercae0e002016-07-07 16:11:42 -0400136# pragma GCC diagnostic pop
137#endif
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100138 if (!std::is_trivially_destructible<Func>::value)
Jason Rhinelander657a51e2018-01-12 12:06:46 -0400139 rec->free_data = [](function_record *r) { ((capture *) &r->data)->~capture(); };
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100140 } else {
141 rec->data[0] = new capture { std::forward<Func>(f) };
Jason Rhinelander657a51e2018-01-12 12:06:46 -0400142 rec->free_data = [](function_record *r) { delete ((capture *) r->data[0]); };
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100143 }
Wenzel Jakob19208fe2015-10-13 17:37:25 +0200144
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100145 /* Type casters for the function arguments and return value */
Jason Rhinelander657a51e2018-01-12 12:06:46 -0400146 using cast_in = argument_loader<Args...>;
147 using cast_out = make_caster<
148 conditional_t<std::is_void<Return>::value, void_type, Return>
Dean Moldovan719c1732016-11-27 18:19:34 +0100149 >;
Wenzel Jakob71867832015-07-29 17:43:52 +0200150
Jason Rhinelander657a51e2018-01-12 12:06:46 -0400151 static_assert(expected_num_args<Extra...>(sizeof...(Args), cast_in::has_args, cast_in::has_kwargs),
Jason Rhinelander0f5ec0a2017-03-19 12:36:18 -0300152 "The number of argument annotations does not match the number of function arguments");
Jason Rhinelander2686da82017-01-21 23:42:14 -0500153
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100154 /* Dispatch code which converts function arguments and performs the actual function call */
Jason Rhinelander657a51e2018-01-12 12:06:46 -0400155 rec->impl = [](function_call &call) -> handle {
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100156 cast_in args_converter;
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100157
158 /* Try to cast the function arguments into the C++ domain */
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500159 if (!args_converter.load_args(call))
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100160 return PYBIND11_TRY_NEXT_OVERLOAD;
161
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100162 /* Invoke call policy pre-call hook */
Jason Rhinelander657a51e2018-01-12 12:06:46 -0400163 process_attributes<Extra...>::precall(call);
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100164
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100165 /* Get a pointer to the capture object */
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500166 auto data = (sizeof(capture) <= sizeof(call.func.data)
167 ? &call.func.data : call.func.data[0]);
168 capture *cap = const_cast<capture *>(reinterpret_cast<const capture *>(data));
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100169
Jason Rhinelander546f6fc2017-01-20 00:59:26 -0500170 /* Override policy for rvalues -- usually to enforce rvp::move on an rvalue */
Wenzel Jakobcbd16a82018-07-17 16:56:26 +0200171 return_value_policy policy = return_value_policy_override<Return>::policy(call.func.policy);
Dean Moldovand079f412016-11-20 05:31:02 +0100172
Dean Moldovan1ac19032017-03-16 11:22:26 +0100173 /* Function scope guard -- defaults to the compile-to-nothing `void_type` */
Jason Rhinelander657a51e2018-01-12 12:06:46 -0400174 using Guard = extract_guard_t<Extra...>;
Dean Moldovan1ac19032017-03-16 11:22:26 +0100175
Wenzel Jakob954b7932016-07-10 10:13:18 +0200176 /* Perform the function call */
Jason Rhinelander813d7e82017-05-14 15:57:26 -0400177 handle result = cast_out::cast(
178 std::move(args_converter).template call<Return, Guard>(cap->f), policy, call.parent);
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100179
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100180 /* Invoke call policy post-call hook */
Jason Rhinelander657a51e2018-01-12 12:06:46 -0400181 process_attributes<Extra...>::postcall(call, result);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100182
Wenzel Jakob5f218b32016-01-17 22:36:39 +0100183 return result;
Wenzel Jakob71867832015-07-29 17:43:52 +0200184 };
185
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100186 /* Process any user-provided function attributes */
Jason Rhinelander657a51e2018-01-12 12:06:46 -0400187 process_attributes<Extra...>::init(extra..., rec);
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100188
Jason Rhinelanderbe0d8042017-12-23 18:56:07 -0400189 {
Henry Schreiner0dbda6e2020-09-04 20:02:05 -0400190 constexpr bool has_kw_only_args = any_of<std::is_same<kw_only, Extra>...>::value,
191 has_pos_only_args = any_of<std::is_same<pos_only, Extra>...>::value,
Jason Rhinelanderbe0d8042017-12-23 18:56:07 -0400192 has_args = any_of<std::is_same<args, Args>...>::value,
193 has_arg_annotations = any_of<is_keyword<Extra>...>::value;
Henry Schreiner0dbda6e2020-09-04 20:02:05 -0400194 static_assert(has_arg_annotations || !has_kw_only_args, "py::kw_only requires the use of argument annotations");
195 static_assert(has_arg_annotations || !has_pos_only_args, "py::pos_only requires the use of argument annotations (for docstrings and aligning the annotations to the argument)");
196 static_assert(!(has_args && has_kw_only_args), "py::kw_only cannot be combined with a py::args argument");
Jason Rhinelanderbe0d8042017-12-23 18:56:07 -0400197 }
198
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100199 /* Generate a readable signature describing the function's arguments and return value types */
Dean Moldovan56613942017-07-02 12:52:00 +0200200 static constexpr auto signature = _("(") + cast_in::arg_names + _(") -> ") + cast_out::name;
201 PYBIND11_DESCR_CONSTEXPR auto types = decltype(signature)::types();
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100202
203 /* Register the function with Python from generic (non-templated) code */
Dean Moldovan56613942017-07-02 12:52:00 +0200204 initialize_generic(rec, signature.text, types.data(), sizeof...(Args));
Wenzel Jakob178c8a82016-05-10 15:59:01 +0100205
206 if (cast_in::has_args) rec->has_args = true;
207 if (cast_in::has_kwargs) rec->has_kwargs = true;
Wenzel Jakob954b7932016-07-10 10:13:18 +0200208
209 /* Stash some additional information used by an important optimization in 'functional.h' */
Jason Rhinelander1d7998e2017-02-17 06:56:41 -0500210 using FunctionType = Return (*)(Args...);
Wenzel Jakob954b7932016-07-10 10:13:18 +0200211 constexpr bool is_function_ptr =
212 std::is_convertible<Func, FunctionType>::value &&
213 sizeof(capture) == sizeof(void *);
214 if (is_function_ptr) {
215 rec->is_stateless = true;
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500216 rec->data[1] = const_cast<void *>(reinterpret_cast<const void *>(&typeid(FunctionType)));
Wenzel Jakob954b7932016-07-10 10:13:18 +0200217 }
Wenzel Jakob281aa0e2015-07-30 15:29:00 +0200218 }
219
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100220 /// Register a function call with Python (generic non-templated code goes here)
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100221 void initialize_generic(detail::function_record *rec, const char *text,
Dean Moldovanecced6c2016-07-31 20:03:18 +0200222 const std::type_info *const *types, size_t args) {
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100223
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100224 /* Create copies of all referenced C-style strings */
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100225 rec->name = strdup(rec->name ? rec->name : "");
226 if (rec->doc) rec->doc = strdup(rec->doc);
227 for (auto &a: rec->args) {
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100228 if (a.name)
229 a.name = strdup(a.name);
230 if (a.descr)
231 a.descr = strdup(a.descr);
232 else if (a.value)
Boris Staletic2819ce62020-07-24 18:43:59 +0200233 a.descr = strdup(repr(a.value).cast<std::string>().c_str());
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100234 }
Wenzel Jakob954b7932016-07-10 10:13:18 +0200235
Jason Rhinelander464d9892017-06-12 21:52:48 -0400236 rec->is_constructor = !strcmp(rec->name, "__init__") || !strcmp(rec->name, "__setstate__");
237
Dean Moldovanb8c5dbd2017-08-24 02:46:07 +0200238#if !defined(NDEBUG) && !defined(PYBIND11_DISABLE_NEW_STYLE_INIT_WARNING)
239 if (rec->is_constructor && !rec->is_new_style_constructor) {
240 const auto class_name = std::string(((PyTypeObject *) rec->scope.ptr())->tp_name);
241 const auto func_name = std::string(rec->name);
242 PyErr_WarnEx(
243 PyExc_FutureWarning,
244 ("pybind11-bound class '" + class_name + "' is using an old-style "
245 "placement-new '" + func_name + "' which has been deprecated. See "
246 "the upgrade guide in pybind11's docs. This message is only visible "
247 "when compiled in debug mode.").c_str(), 0
248 );
249 }
250#endif
251
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100252 /* Generate a proper function signature */
253 std::string signature;
Dean Moldovan0aef6422017-08-31 14:38:23 +0200254 size_t type_index = 0, arg_index = 0;
255 for (auto *pc = text; *pc != '\0'; ++pc) {
256 const auto c = *pc;
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100257
258 if (c == '{') {
Dean Moldovan0aef6422017-08-31 14:38:23 +0200259 // Write arg name for everything except *args and **kwargs.
260 if (*(pc + 1) == '*')
261 continue;
Henry Schreiner0dbda6e2020-09-04 20:02:05 -0400262 // Separator for keyword-only arguments, placed before the kw
263 // arguments start
264 if (rec->nargs_kw_only > 0 && arg_index + rec->nargs_kw_only == args)
265 signature += "*, ";
Dean Moldovan0aef6422017-08-31 14:38:23 +0200266 if (arg_index < rec->args.size() && rec->args[arg_index].name) {
267 signature += rec->args[arg_index].name;
268 } else if (arg_index == 0 && rec->is_method) {
269 signature += "self";
270 } else {
271 signature += "arg" + std::to_string(arg_index - (rec->is_method ? 1 : 0));
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100272 }
Dean Moldovan0aef6422017-08-31 14:38:23 +0200273 signature += ": ";
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100274 } else if (c == '}') {
Dean Moldovan0aef6422017-08-31 14:38:23 +0200275 // Write default value if available.
276 if (arg_index < rec->args.size() && rec->args[arg_index].descr) {
Antony Lee0826b3c2017-11-26 20:00:35 -0800277 signature += " = ";
Dean Moldovan0aef6422017-08-31 14:38:23 +0200278 signature += rec->args[arg_index].descr;
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100279 }
Henry Schreiner0dbda6e2020-09-04 20:02:05 -0400280 // Separator for positional-only arguments (placed after the
281 // argument, rather than before like *
282 if (rec->nargs_pos_only > 0 && (arg_index + 1) == rec->nargs_pos_only)
283 signature += ", /";
Dean Moldovan0aef6422017-08-31 14:38:23 +0200284 arg_index++;
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100285 } else if (c == '%') {
286 const std::type_info *t = types[type_index++];
Wenzel Jakobb2c2c792016-01-17 22:36:40 +0100287 if (!t)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100288 pybind11_fail("Internal error while parsing type signature (1)");
Ivan Smirnov8f3e0452016-10-23 15:43:03 +0100289 if (auto tinfo = detail::get_type_info(*t)) {
Jason Rhinelander71178922017-11-07 12:33:05 -0400290 handle th((PyObject *) tinfo->type);
291 signature +=
292 th.attr("__module__").cast<std::string>() + "." +
293 th.attr("__qualname__").cast<std::string>(); // Python 3.3+, but we backport it to earlier versions
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200294 } else if (rec->is_new_style_constructor && arg_index == 0) {
295 // A new-style `__init__` takes `self` as `value_and_holder`.
296 // Rewrite it to the proper class type.
Jason Rhinelander71178922017-11-07 12:33:05 -0400297 signature +=
298 rec->scope.attr("__module__").cast<std::string>() + "." +
299 rec->scope.attr("__qualname__").cast<std::string>();
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100300 } else {
301 std::string tname(t->name());
302 detail::clean_type_id(tname);
303 signature += tname;
304 }
305 } else {
306 signature += c;
307 }
308 }
Henry Schreiner0dbda6e2020-09-04 20:02:05 -0400309
Dean Moldovan0aef6422017-08-31 14:38:23 +0200310 if (arg_index != args || types[type_index] != nullptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100311 pybind11_fail("Internal error while parsing type signature (2)");
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100312
Wenzel Jakob57082212015-09-04 23:42:12 +0200313#if PY_MAJOR_VERSION < 3
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100314 if (strcmp(rec->name, "__next__") == 0) {
315 std::free(rec->name);
316 rec->name = strdup("next");
Wenzel Jakobd1bfc4e2016-05-16 18:52:46 +0200317 } else if (strcmp(rec->name, "__bool__") == 0) {
318 std::free(rec->name);
319 rec->name = strdup("__nonzero__");
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100320 }
Wenzel Jakob57082212015-09-04 23:42:12 +0200321#endif
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100322 rec->signature = strdup(signature.c_str());
323 rec->args.shrink_to_fit();
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500324 rec->nargs = (std::uint16_t) args;
Wenzel Jakobbd4a5292015-07-11 17:41:48 +0200325
Jason Rhinelander0a90b2d2017-04-16 20:30:52 -0400326 if (rec->sibling && PYBIND11_INSTANCE_METHOD_CHECK(rec->sibling.ptr()))
327 rec->sibling = PYBIND11_INSTANCE_METHOD_GET_FUNCTION(rec->sibling.ptr());
Wenzel Jakob57082212015-09-04 23:42:12 +0200328
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100329 detail::function_record *chain = nullptr, *chain_start = rec;
Jason Rhinelander6873c202016-10-24 21:58:22 -0400330 if (rec->sibling) {
331 if (PyCFunction_Check(rec->sibling.ptr())) {
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100332 auto rec_capsule = reinterpret_borrow<capsule>(PyCFunction_GET_SELF(rec->sibling.ptr()));
Jason Rhinelander6873c202016-10-24 21:58:22 -0400333 chain = (detail::function_record *) rec_capsule;
334 /* Never append a method to an overload chain of a parent class;
335 instead, hide the parent's overloads in this case */
Dean Moldovan36f0a152017-02-08 01:01:56 +0100336 if (!chain->scope.is(rec->scope))
Jason Rhinelander6873c202016-10-24 21:58:22 -0400337 chain = nullptr;
338 }
339 // Don't trigger for things like the default __init__, which are wrapper_descriptors that we are intentionally replacing
340 else if (!rec->sibling.is_none() && rec->name[0] != '_')
341 pybind11_fail("Cannot overload existing non-function object \"" + std::string(rec->name) +
342 "\" with a function of the same name");
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +0200343 }
344
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100345 if (!chain) {
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100346 /* No existing overload was found, create a new function object */
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100347 rec->def = new PyMethodDef();
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500348 std::memset(rec->def, 0, sizeof(PyMethodDef));
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100349 rec->def->ml_name = rec->name;
Antony Leebaf6b992018-06-24 15:38:09 +0200350 rec->def->ml_meth = reinterpret_cast<PyCFunction>(reinterpret_cast<void (*) (void)>(*dispatcher));
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100351 rec->def->ml_flags = METH_VARARGS | METH_KEYWORDS;
Wenzel Jakoba6501792016-02-04 23:02:07 +0100352
Wenzel Jakobb16421e2017-03-22 22:04:00 +0100353 capsule rec_capsule(rec, [](void *ptr) {
354 destruct((detail::function_record *) ptr);
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100355 });
Wenzel Jakoba6501792016-02-04 23:02:07 +0100356
357 object scope_module;
358 if (rec->scope) {
Dean Moldovan865e4302016-09-21 01:06:32 +0200359 if (hasattr(rec->scope, "__module__")) {
360 scope_module = rec->scope.attr("__module__");
361 } else if (hasattr(rec->scope, "__name__")) {
362 scope_module = rec->scope.attr("__name__");
363 }
Wenzel Jakoba6501792016-02-04 23:02:07 +0100364 }
365
366 m_ptr = PyCFunction_NewEx(rec->def, rec_capsule.ptr(), scope_module.ptr());
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200367 if (!m_ptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100368 pybind11_fail("cpp_function::cpp_function(): Could not allocate function object");
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200369 } else {
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100370 /* Append at the end of the overload chain */
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100371 m_ptr = rec->sibling.ptr();
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200372 inc_ref();
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100373 chain_start = chain;
Jason Rhinelanderd355f2f2017-04-16 22:31:13 -0400374 if (chain->is_method != rec->is_method)
375 pybind11_fail("overloading a method with both static and instance methods is not supported; "
376 #if defined(NDEBUG)
377 "compile in debug mode for more details"
378 #else
379 "error while attempting to bind " + std::string(rec->is_method ? "instance" : "static") + " method " +
380 std::string(pybind11::str(rec->scope.attr("__name__"))) + "." + std::string(rec->name) + signature
381 #endif
382 );
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100383 while (chain->next)
384 chain = chain->next;
385 chain->next = rec;
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200386 }
Wenzel Jakob281aa0e2015-07-30 15:29:00 +0200387
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200388 std::string signatures;
Wenzel Jakob71867832015-07-29 17:43:52 +0200389 int index = 0;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100390 /* Create a nice pydoc rec including all signatures and
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100391 docstrings of the functions in the overload chain */
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100392 if (chain && options::show_function_signatures()) {
Sylvain Corlay0e04fdf2016-03-08 16:42:12 -0500393 // First a generic signature
394 signatures += rec->name;
395 signatures += "(*args, **kwargs)\n";
396 signatures += "Overloaded function.\n\n";
397 }
398 // Then specific overload signatures
Jason Rhinelander10d13042017-03-08 12:32:42 -0500399 bool first_user_def = true;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100400 for (auto it = chain_start; it != nullptr; it = it->next) {
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100401 if (options::show_function_signatures()) {
Jason Rhinelander10d13042017-03-08 12:32:42 -0500402 if (index > 0) signatures += "\n";
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100403 if (chain)
404 signatures += std::to_string(++index) + ". ";
405 signatures += rec->name;
406 signatures += it->signature;
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100407 signatures += "\n";
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100408 }
409 if (it->doc && strlen(it->doc) > 0 && options::show_user_defined_docstrings()) {
Jason Rhinelander10d13042017-03-08 12:32:42 -0500410 // If we're appending another docstring, and aren't printing function signatures, we
411 // need to append a newline first:
412 if (!options::show_function_signatures()) {
413 if (first_user_def) first_user_def = false;
414 else signatures += "\n";
415 }
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100416 if (options::show_function_signatures()) signatures += "\n";
Wenzel Jakob218b6ce2016-02-28 23:52:37 +0100417 signatures += it->doc;
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100418 if (options::show_function_signatures()) signatures += "\n";
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100419 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200420 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100421
422 /* Install docstring */
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200423 PyCFunctionObject *func = (PyCFunctionObject *) m_ptr;
424 if (func->m_ml->ml_doc)
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500425 std::free(const_cast<char *>(func->m_ml->ml_doc));
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200426 func->m_ml->ml_doc = strdup(signatures.c_str());
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100427
Wenzel Jakob31fbf182016-11-20 05:27:05 +0100428 if (rec->is_method) {
429 m_ptr = PYBIND11_INSTANCE_METHOD_NEW(m_ptr, rec->scope.ptr());
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200430 if (!m_ptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100431 pybind11_fail("cpp_function::cpp_function(): Could not allocate instance method object");
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200432 Py_DECREF(func);
433 }
434 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100435
436 /// When a cpp_function is GCed, release any memory allocated by pybind11
437 static void destruct(detail::function_record *rec) {
438 while (rec) {
439 detail::function_record *next = rec->next;
440 if (rec->free_data)
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100441 rec->free_data(rec);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100442 std::free((char *) rec->name);
443 std::free((char *) rec->doc);
444 std::free((char *) rec->signature);
445 for (auto &arg: rec->args) {
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500446 std::free(const_cast<char *>(arg.name));
447 std::free(const_cast<char *>(arg.descr));
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100448 arg.value.dec_ref();
449 }
450 if (rec->def) {
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500451 std::free(const_cast<char *>(rec->def->ml_doc));
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100452 delete rec->def;
453 }
454 delete rec;
455 rec = next;
456 }
457 }
458
459 /// Main dispatch logic for calls to functions bound using pybind11
Jason Rhinelander2686da82017-01-21 23:42:14 -0500460 static PyObject *dispatcher(PyObject *self, PyObject *args_in, PyObject *kwargs_in) {
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500461 using namespace detail;
462
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100463 /* Iterator over the list of potentially admissible overloads */
oremanje7761e32018-09-25 14:55:18 -0700464 const function_record *overloads = (function_record *) PyCapsule_GetPointer(self, nullptr),
465 *it = overloads;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100466
467 /* Need to know how many arguments + keyword arguments there are to pick the right overload */
Jason Rhinelander2686da82017-01-21 23:42:14 -0500468 const size_t n_args_in = (size_t) PyTuple_GET_SIZE(args_in);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100469
Jason Rhinelander2686da82017-01-21 23:42:14 -0500470 handle parent = n_args_in > 0 ? PyTuple_GET_ITEM(args_in, 0) : nullptr,
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100471 result = PYBIND11_TRY_NEXT_OVERLOAD;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500472
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200473 auto self_value_and_holder = value_and_holder();
474 if (overloads->is_constructor) {
475 const auto tinfo = get_type_info((PyTypeObject *) overloads->scope.ptr());
476 const auto pi = reinterpret_cast<instance *>(parent.ptr());
477 self_value_and_holder = pi->get_value_and_holder(tinfo, false);
478
479 if (!self_value_and_holder.type || !self_value_and_holder.inst) {
480 PyErr_SetString(PyExc_TypeError, "__init__(self, ...) called with invalid `self` argument");
481 return nullptr;
482 }
483
484 // If this value is already registered it must mean __init__ is invoked multiple times;
485 // we really can't support that in C++, so just ignore the second __init__.
486 if (self_value_and_holder.instance_registered())
487 return none().release().ptr();
488 }
489
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100490 try {
Jason Rhinelandere5505892017-02-03 18:25:34 -0500491 // We do this in two passes: in the first pass, we load arguments with `convert=false`;
492 // in the second, we allow conversion (except for arguments with an explicit
493 // py::arg().noconvert()). This lets us prefer calls without conversion, with
494 // conversion as a fallback.
495 std::vector<function_call> second_pass;
496
497 // However, if there are no overloads, we can just skip the no-convert pass entirely
498 const bool overloaded = it != nullptr && it->next != nullptr;
499
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100500 for (; it != nullptr; it = it->next) {
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500501
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100502 /* For each overload:
Jason Rhinelander2686da82017-01-21 23:42:14 -0500503 1. Copy all positional arguments we were given, also checking to make sure that
504 named positional arguments weren't *also* specified via kwarg.
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100505 2. If we weren't given enough, try to make up the omitted ones by checking
Jason Rhinelander2686da82017-01-21 23:42:14 -0500506 whether they were provided by a kwarg matching the `py::arg("name")` name. If
507 so, use it (and remove it from kwargs; if not, see if the function binding
508 provided a default that we can use.
509 3. Ensure that either all keyword arguments were "consumed", or that the function
510 takes a kwargs argument to accept unconsumed kwargs.
511 4. Any positional arguments still left get put into a tuple (for args), and any
512 leftover kwargs get put into a dict.
513 5. Pack everything into a vector; if we have py::args or py::kwargs, they are an
514 extra tuple or dict at the end of the positional arguments.
515 6. Call the function call dispatcher (function_record::impl)
516
517 If one of these fail, move on to the next overload and keep trying until we get a
518 result other than PYBIND11_TRY_NEXT_OVERLOAD.
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100519 */
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100520
oremanje7761e32018-09-25 14:55:18 -0700521 const function_record &func = *it;
Jason Rhinelanderbe0d8042017-12-23 18:56:07 -0400522 size_t num_args = func.nargs; // Number of positional arguments that we need
523 if (func.has_args) --num_args; // (but don't count py::args
524 if (func.has_kwargs) --num_args; // or py::kwargs)
Henry Schreiner0dbda6e2020-09-04 20:02:05 -0400525 size_t pos_args = num_args - func.nargs_kw_only;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100526
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500527 if (!func.has_args && n_args_in > pos_args)
Jason Rhinelanderbe0d8042017-12-23 18:56:07 -0400528 continue; // Too many positional arguments for this overload
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100529
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500530 if (n_args_in < pos_args && func.args.size() < pos_args)
Jason Rhinelanderbe0d8042017-12-23 18:56:07 -0400531 continue; // Not enough positional arguments given, and not enough defaults to fill in the blanks
Jason Rhinelander2686da82017-01-21 23:42:14 -0500532
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500533 function_call call(func, parent);
Jason Rhinelander2686da82017-01-21 23:42:14 -0500534
Nathan9b3fb052019-07-18 01:01:50 -0600535 size_t args_to_copy = (std::min)(pos_args, n_args_in); // Protect std::min with parentheses
Jason Rhinelander2686da82017-01-21 23:42:14 -0500536 size_t args_copied = 0;
537
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200538 // 0. Inject new-style `self` argument
539 if (func.is_new_style_constructor) {
540 // The `value` may have been preallocated by an old-style `__init__`
541 // if it was a preceding candidate for overload resolution.
542 if (self_value_and_holder)
543 self_value_and_holder.type->dealloc(self_value_and_holder);
544
Dean Moldovan7939f4b2017-09-04 13:49:19 +0200545 call.init_self = PyTuple_GET_ITEM(args_in, 0);
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200546 call.args.push_back(reinterpret_cast<PyObject *>(&self_value_and_holder));
547 call.args_convert.push_back(false);
548 ++args_copied;
549 }
550
Jason Rhinelander2686da82017-01-21 23:42:14 -0500551 // 1. Copy any position arguments given.
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400552 bool bad_arg = false;
Jason Rhinelander2686da82017-01-21 23:42:14 -0500553 for (; args_copied < args_to_copy; ++args_copied) {
oremanje7761e32018-09-25 14:55:18 -0700554 const argument_record *arg_rec = args_copied < func.args.size() ? &func.args[args_copied] : nullptr;
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400555 if (kwargs_in && arg_rec && arg_rec->name && PyDict_GetItemString(kwargs_in, arg_rec->name)) {
556 bad_arg = true;
Jason Rhinelandercaa13792017-02-23 19:54:53 -0500557 break;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100558 }
Jason Rhinelander2686da82017-01-21 23:42:14 -0500559
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400560 handle arg(PyTuple_GET_ITEM(args_in, args_copied));
561 if (arg_rec && !arg_rec->none && arg.is_none()) {
562 bad_arg = true;
563 break;
564 }
565 call.args.push_back(arg);
566 call.args_convert.push_back(arg_rec ? arg_rec->convert : true);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100567 }
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400568 if (bad_arg)
Jason Rhinelandercaa13792017-02-23 19:54:53 -0500569 continue; // Maybe it was meant for another overload (issue #688)
Wenzel Jakobbd57eb42016-05-01 14:42:20 +0200570
Jason Rhinelander2686da82017-01-21 23:42:14 -0500571 // We'll need to copy this if we steal some kwargs for defaults
572 dict kwargs = reinterpret_borrow<dict>(kwargs_in);
573
Henry Schreiner0dbda6e2020-09-04 20:02:05 -0400574 // 1.5. Fill in any missing pos_only args from defaults if they exist
575 if (args_copied < func.nargs_pos_only) {
576 for (; args_copied < func.nargs_pos_only; ++args_copied) {
577 const auto &arg = func.args[args_copied];
578 handle value;
579
580 if (arg.value) {
581 value = arg.value;
582 }
583 if (value) {
584 call.args.push_back(value);
585 call.args_convert.push_back(arg.convert);
586 } else
587 break;
588 }
589
590 if (args_copied < func.nargs_pos_only)
591 continue; // Not enough defaults to fill the positional arguments
592 }
593
Jason Rhinelander2686da82017-01-21 23:42:14 -0500594 // 2. Check kwargs and, failing that, defaults that may help complete the list
Jason Rhinelanderbe0d8042017-12-23 18:56:07 -0400595 if (args_copied < num_args) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500596 bool copied_kwargs = false;
597
Jason Rhinelanderbe0d8042017-12-23 18:56:07 -0400598 for (; args_copied < num_args; ++args_copied) {
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500599 const auto &arg = func.args[args_copied];
Jason Rhinelander2686da82017-01-21 23:42:14 -0500600
601 handle value;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500602 if (kwargs_in && arg.name)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500603 value = PyDict_GetItemString(kwargs.ptr(), arg.name);
604
605 if (value) {
606 // Consume a kwargs value
607 if (!copied_kwargs) {
608 kwargs = reinterpret_steal<dict>(PyDict_Copy(kwargs.ptr()));
609 copied_kwargs = true;
610 }
611 PyDict_DelItemString(kwargs.ptr(), arg.name);
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100612 } else if (arg.value) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500613 value = arg.value;
614 }
615
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500616 if (value) {
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500617 call.args.push_back(value);
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500618 call.args_convert.push_back(arg.convert);
619 }
Jason Rhinelander2686da82017-01-21 23:42:14 -0500620 else
621 break;
622 }
623
Jason Rhinelanderbe0d8042017-12-23 18:56:07 -0400624 if (args_copied < num_args)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500625 continue; // Not enough arguments, defaults, or kwargs to fill the positional arguments
626 }
627
628 // 3. Check everything was consumed (unless we have a kwargs arg)
Henry Schreiner96e6a8d2020-09-10 22:49:33 -0400629 if (kwargs && !kwargs.empty() && !func.has_kwargs)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500630 continue; // Unconsumed kwargs, but no py::kwargs argument to accept them
631
632 // 4a. If we have a py::args argument, create a new tuple with leftovers
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500633 if (func.has_args) {
Jason Rhinelander48e1f9a2017-12-23 09:42:32 -0400634 tuple extra_args;
Jason Rhinelander2686da82017-01-21 23:42:14 -0500635 if (args_to_copy == 0) {
636 // We didn't copy out any position arguments from the args_in tuple, so we
637 // can reuse it directly without copying:
638 extra_args = reinterpret_borrow<tuple>(args_in);
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100639 } else if (args_copied >= n_args_in) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500640 extra_args = tuple(0);
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100641 } else {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500642 size_t args_size = n_args_in - args_copied;
643 extra_args = tuple(args_size);
644 for (size_t i = 0; i < args_size; ++i) {
Jason Rhinelander367d7232017-12-15 13:21:52 -0400645 extra_args[i] = PyTuple_GET_ITEM(args_in, args_copied + i);
Jason Rhinelander2686da82017-01-21 23:42:14 -0500646 }
647 }
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500648 call.args.push_back(extra_args);
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500649 call.args_convert.push_back(false);
Jason Rhinelander48e1f9a2017-12-23 09:42:32 -0400650 call.args_ref = std::move(extra_args);
Jason Rhinelander2686da82017-01-21 23:42:14 -0500651 }
652
653 // 4b. If we have a py::kwargs, pass on any remaining kwargs
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500654 if (func.has_kwargs) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500655 if (!kwargs.ptr())
656 kwargs = dict(); // If we didn't get one, send an empty one
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500657 call.args.push_back(kwargs);
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500658 call.args_convert.push_back(false);
Jason Rhinelander48e1f9a2017-12-23 09:42:32 -0400659 call.kwargs_ref = std::move(kwargs);
Jason Rhinelander2686da82017-01-21 23:42:14 -0500660 }
661
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500662 // 5. Put everything in a vector. Not technically step 5, we've been building it
663 // in `call.args` all along.
664 #if !defined(NDEBUG)
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500665 if (call.args.size() != func.nargs || call.args_convert.size() != func.nargs)
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500666 pybind11_fail("Internal error: function call dispatcher inserted wrong number of arguments!");
667 #endif
Jason Rhinelander2686da82017-01-21 23:42:14 -0500668
Jason Rhinelandere5505892017-02-03 18:25:34 -0500669 std::vector<bool> second_pass_convert;
670 if (overloaded) {
671 // We're in the first no-convert pass, so swap out the conversion flags for a
672 // set of all-false flags. If the call fails, we'll swap the flags back in for
673 // the conversion-allowed call below.
674 second_pass_convert.resize(func.nargs, false);
675 call.args_convert.swap(second_pass_convert);
676 }
677
Jason Rhinelander2686da82017-01-21 23:42:14 -0500678 // 6. Call the function.
Wenzel Jakobbd57eb42016-05-01 14:42:20 +0200679 try {
Dean Moldovanaf2dda32017-06-26 20:34:06 +0200680 loader_life_support guard{};
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500681 result = func.impl(call);
Wenzel Jakob00062592016-07-01 16:07:35 +0200682 } catch (reference_cast_error &) {
Wenzel Jakobbd57eb42016-05-01 14:42:20 +0200683 result = PYBIND11_TRY_NEXT_OVERLOAD;
684 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100685
686 if (result.ptr() != PYBIND11_TRY_NEXT_OVERLOAD)
687 break;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500688
Jason Rhinelandere5505892017-02-03 18:25:34 -0500689 if (overloaded) {
690 // The (overloaded) call failed; if the call has at least one argument that
691 // permits conversion (i.e. it hasn't been explicitly specified `.noconvert()`)
692 // then add this call to the list of second pass overloads to try.
693 for (size_t i = func.is_method ? 1 : 0; i < pos_args; i++) {
694 if (second_pass_convert[i]) {
695 // Found one: swap the converting flags back in and store the call for
696 // the second pass.
697 call.args_convert.swap(second_pass_convert);
698 second_pass.push_back(std::move(call));
699 break;
700 }
701 }
702 }
703 }
704
705 if (overloaded && !second_pass.empty() && result.ptr() == PYBIND11_TRY_NEXT_OVERLOAD) {
706 // The no-conversion pass finished without success, try again with conversion allowed
707 for (auto &call : second_pass) {
708 try {
Dean Moldovanaf2dda32017-06-26 20:34:06 +0200709 loader_life_support guard{};
Jason Rhinelandere5505892017-02-03 18:25:34 -0500710 result = call.func.impl(call);
711 } catch (reference_cast_error &) {
712 result = PYBIND11_TRY_NEXT_OVERLOAD;
713 }
714
oremanje7761e32018-09-25 14:55:18 -0700715 if (result.ptr() != PYBIND11_TRY_NEXT_OVERLOAD) {
716 // The error reporting logic below expects 'it' to be valid, as it would be
717 // if we'd encountered this failure in the first-pass loop.
718 if (!result)
719 it = &call.func;
Jason Rhinelandere5505892017-02-03 18:25:34 -0500720 break;
oremanje7761e32018-09-25 14:55:18 -0700721 }
Jason Rhinelandere5505892017-02-03 18:25:34 -0500722 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100723 }
Dean Moldovan135ba8d2016-09-10 11:58:02 +0200724 } catch (error_already_set &e) {
725 e.restore();
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400726 return nullptr;
Jörg Kreuzberger69dc3802019-06-10 22:00:55 +0200727#if defined(__GNUG__) && !defined(__clang__)
728 } catch ( abi::__forced_unwind& ) {
729 throw;
730#endif
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100731 } catch (...) {
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400732 /* When an exception is caught, give each registered exception
733 translator a chance to translate it to a Python exception
734 in reverse order of registration.
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200735
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400736 A translator may choose to do one of the following:
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200737
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400738 - catch the exception and call PyErr_SetString or PyErr_SetObject
739 to set a standard (or custom) Python exception, or
740 - do nothing and let the exception fall through to the next translator, or
741 - delegate translation to the next translator by throwing a new type of exception. */
742
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200743 auto last_exception = std::current_exception();
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500744 auto &registered_exception_translators = get_internals().registered_exception_translators;
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400745 for (auto& translator : registered_exception_translators) {
746 try {
747 translator(last_exception);
748 } catch (...) {
749 last_exception = std::current_exception();
750 continue;
751 }
752 return nullptr;
753 }
754 PyErr_SetString(PyExc_SystemError, "Exception escaped from default exception translator!");
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100755 return nullptr;
756 }
757
Dean Moldovan2b4477e2017-09-09 20:21:34 +0200758 auto append_note_if_missing_header_is_suspected = [](std::string &msg) {
759 if (msg.find("std::") != std::string::npos) {
760 msg += "\n\n"
761 "Did you forget to `#include <pybind11/stl.h>`? Or <pybind11/complex.h>,\n"
762 "<pybind11/functional.h>, <pybind11/chrono.h>, etc. Some automatic\n"
763 "conversions are optional and require extra headers to be included\n"
764 "when compiling your pybind11 module.";
765 }
766 };
767
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100768 if (result.ptr() == PYBIND11_TRY_NEXT_OVERLOAD) {
Wenzel Jakob382484a2016-09-10 15:28:37 +0900769 if (overloads->is_operator)
770 return handle(Py_NotImplemented).inc_ref().ptr();
771
Wenzel Jakobe99ebae2016-09-12 11:44:37 +0900772 std::string msg = std::string(overloads->name) + "(): incompatible " +
773 std::string(overloads->is_constructor ? "constructor" : "function") +
774 " arguments. The following argument types are supported:\n";
775
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100776 int ctr = 0;
oremanje7761e32018-09-25 14:55:18 -0700777 for (const function_record *it2 = overloads; it2 != nullptr; it2 = it2->next) {
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100778 msg += " "+ std::to_string(++ctr) + ". ";
Jason Rhinelander4e45e182016-07-17 17:43:00 -0400779
780 bool wrote_sig = false;
781 if (overloads->is_constructor) {
Dean Moldovanecced6c2016-07-31 20:03:18 +0200782 // For a constructor, rewrite `(self: Object, arg0, ...) -> NoneType` as `Object(arg0, ...)`
Jason Rhinelander4e45e182016-07-17 17:43:00 -0400783 std::string sig = it2->signature;
Dean Moldovanecced6c2016-07-31 20:03:18 +0200784 size_t start = sig.find('(') + 7; // skip "(self: "
Jason Rhinelander4e45e182016-07-17 17:43:00 -0400785 if (start < sig.size()) {
786 // End at the , for the next argument
787 size_t end = sig.find(", "), next = end + 2;
788 size_t ret = sig.rfind(" -> ");
789 // Or the ), if there is no comma:
790 if (end >= sig.size()) next = end = sig.find(')');
791 if (start < end && next < sig.size()) {
792 msg.append(sig, start, end - start);
793 msg += '(';
794 msg.append(sig, next, ret - next);
795 wrote_sig = true;
796 }
797 }
798 }
799 if (!wrote_sig) msg += it2->signature;
800
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100801 msg += "\n";
802 }
Wenzel Jakobe99ebae2016-09-12 11:44:37 +0900803 msg += "\nInvoked with: ";
Jason Rhinelander2686da82017-01-21 23:42:14 -0500804 auto args_ = reinterpret_borrow<tuple>(args_in);
Jason Rhinelander231e1672017-02-23 21:04:46 -0500805 bool some_args = false;
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200806 for (size_t ti = overloads->is_constructor ? 1 : 0; ti < args_.size(); ++ti) {
Jason Rhinelander231e1672017-02-23 21:04:46 -0500807 if (!some_args) some_args = true;
808 else msg += ", ";
Henry Schreinercf0a6452020-08-18 07:14:34 -0400809 try {
810 msg += pybind11::repr(args_[ti]);
811 } catch (const error_already_set&) {
812 msg += "<repr raised Error>";
813 }
Andreas Bergmeier16d43942016-05-24 09:19:35 +0200814 }
Jason Rhinelander231e1672017-02-23 21:04:46 -0500815 if (kwargs_in) {
816 auto kwargs = reinterpret_borrow<dict>(kwargs_in);
Henry Schreiner96e6a8d2020-09-10 22:49:33 -0400817 if (!kwargs.empty()) {
Jason Rhinelander231e1672017-02-23 21:04:46 -0500818 if (some_args) msg += "; ";
819 msg += "kwargs: ";
820 bool first = true;
821 for (auto kwarg : kwargs) {
822 if (first) first = false;
823 else msg += ", ";
Henry Schreinercf0a6452020-08-18 07:14:34 -0400824 msg += pybind11::str("{}=").format(kwarg.first);
825 try {
826 msg += pybind11::repr(kwarg.second);
827 } catch (const error_already_set&) {
828 msg += "<repr raised Error>";
829 }
Jason Rhinelander231e1672017-02-23 21:04:46 -0500830 }
831 }
832 }
833
Dean Moldovan2b4477e2017-09-09 20:21:34 +0200834 append_note_if_missing_header_is_suspected(msg);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100835 PyErr_SetString(PyExc_TypeError, msg.c_str());
836 return nullptr;
837 } else if (!result) {
838 std::string msg = "Unable to convert function return value to a "
839 "Python type! The signature was\n\t";
840 msg += it->signature;
Dean Moldovan2b4477e2017-09-09 20:21:34 +0200841 append_note_if_missing_header_is_suspected(msg);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100842 PyErr_SetString(PyExc_TypeError, msg.c_str());
843 return nullptr;
844 } else {
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200845 if (overloads->is_constructor && !self_value_and_holder.holder_constructed()) {
Jason Rhinelander464d9892017-06-12 21:52:48 -0400846 auto *pi = reinterpret_cast<instance *>(parent.ptr());
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200847 self_value_and_holder.type->init_instance(pi, nullptr);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100848 }
849 return result.ptr();
850 }
851 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200852};
853
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100854/// Wrapper for Python extension modules
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200855class module : public object {
856public:
Wenzel Jakobb1b71402015-10-18 16:48:30 +0200857 PYBIND11_OBJECT_DEFAULT(module, object, PyModule_Check)
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200858
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100859 /// Create a new top-level Python module with the given name and docstring
Jason Rhinelander12d76602016-10-16 16:27:42 -0400860 explicit module(const char *name, const char *doc = nullptr) {
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100861 if (!options::show_user_defined_docstrings()) doc = nullptr;
Wenzel Jakob57082212015-09-04 23:42:12 +0200862#if PY_MAJOR_VERSION >= 3
Wenzel Jakobfb910ae2019-12-11 21:26:46 +0100863 PyModuleDef *def = new PyModuleDef();
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500864 std::memset(def, 0, sizeof(PyModuleDef));
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200865 def->m_name = name;
866 def->m_doc = doc;
867 def->m_size = -1;
868 Py_INCREF(def);
869 m_ptr = PyModule_Create(def);
Wenzel Jakob57082212015-09-04 23:42:12 +0200870#else
871 m_ptr = Py_InitModule3(name, nullptr, doc);
872#endif
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200873 if (m_ptr == nullptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100874 pybind11_fail("Internal error in module::module()");
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200875 inc_ref();
876 }
877
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100878 /** \rst
879 Create Python binding for a new function within the module scope. ``Func``
880 can be a plain C++ function, a function pointer, or a lambda function. For
881 details on the ``Extra&& ... extra`` argument, see section :ref:`extras`.
882 \endrst */
Wenzel Jakob71867832015-07-29 17:43:52 +0200883 template <typename Func, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100884 module &def(const char *name_, Func &&f, const Extra& ... extra) {
Dean Moldovan865e4302016-09-21 01:06:32 +0200885 cpp_function func(std::forward<Func>(f), name(name_), scope(*this),
886 sibling(getattr(*this, name_, none())), extra...);
Jason Rhinelander6873c202016-10-24 21:58:22 -0400887 // NB: allow overwriting here because cpp_function sets up a chain with the intention of
888 // overwriting (and has already checked internally that it isn't overwriting non-functions).
889 add_object(name_, func, true /* overwrite */);
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200890 return *this;
891 }
892
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100893 /** \rst
894 Create and return a new Python submodule with the given name and docstring.
895 This also works recursively, i.e.
896
897 .. code-block:: cpp
898
899 py::module m("example", "pybind11 example plugin");
900 py::module m2 = m.def_submodule("sub", "A submodule of 'example'");
901 py::module m3 = m2.def_submodule("subsub", "A submodule of 'example.sub'");
902 \endrst */
Wenzel Jakobbd4a5292015-07-11 17:41:48 +0200903 module def_submodule(const char *name, const char *doc = nullptr) {
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200904 std::string full_name = std::string(PyModule_GetName(m_ptr))
905 + std::string(".") + std::string(name);
Dean Moldovanc7ac16b2016-10-28 03:08:15 +0200906 auto result = reinterpret_borrow<module>(PyImport_AddModule(full_name.c_str()));
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100907 if (doc && options::show_user_defined_docstrings())
Wenzel Jakob8f4eb002015-10-15 18:13:33 +0200908 result.attr("__doc__") = pybind11::str(doc);
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200909 attr(name) = result;
910 return result;
911 }
Wenzel Jakobdb028d62015-10-13 23:44:25 +0200912
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100913 /// Import and return a module or throws `error_already_set`.
Wenzel Jakobdb028d62015-10-13 23:44:25 +0200914 static module import(const char *name) {
Wenzel Jakobdd57a342015-12-26 14:04:52 +0100915 PyObject *obj = PyImport_ImportModule(name);
916 if (!obj)
esquires67a68f12016-12-01 05:35:34 -0500917 throw error_already_set();
Dean Moldovanc7ac16b2016-10-28 03:08:15 +0200918 return reinterpret_steal<module>(obj);
Wenzel Jakobdb028d62015-10-13 23:44:25 +0200919 }
Jason Rhinelander6873c202016-10-24 21:58:22 -0400920
Gunnar Läthénc64e6b12017-09-12 08:05:05 +0200921 /// Reload the module or throws `error_already_set`.
922 void reload() {
923 PyObject *obj = PyImport_ReloadModule(ptr());
924 if (!obj)
925 throw error_already_set();
926 *this = reinterpret_steal<module>(obj);
927 }
928
Jason Rhinelander6873c202016-10-24 21:58:22 -0400929 // Adds an object to the module using the given name. Throws if an object with the given name
930 // already exists.
931 //
932 // overwrite should almost always be false: attempting to overwrite objects that pybind11 has
933 // established will, in most cases, break things.
Wenzel Jakobaa1b3162017-03-30 11:59:32 +0200934 PYBIND11_NOINLINE void add_object(const char *name, handle obj, bool overwrite = false) {
Jason Rhinelander6873c202016-10-24 21:58:22 -0400935 if (!overwrite && hasattr(*this, name))
936 pybind11_fail("Error during initialization: multiple incompatible definitions with name \"" +
937 std::string(name) + "\"");
938
Wenzel Jakobaa1b3162017-03-30 11:59:32 +0200939 PyModule_AddObject(ptr(), name, obj.inc_ref().ptr() /* steals a reference */);
Jason Rhinelander6873c202016-10-24 21:58:22 -0400940 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200941};
942
Dean Moldovan22c413b2017-03-30 00:20:42 +0200943/// \ingroup python_builtins
Dean Moldovan1d3c4bc2017-06-06 17:05:19 +0200944/// Return a dictionary representing the global variables in the current execution frame,
945/// or ``__main__.__dict__`` if there is no frame (usually when the interpreter is embedded).
946inline dict globals() {
947 PyObject *p = PyEval_GetGlobals();
948 return reinterpret_borrow<dict>(p ? p : module::import("__main__").attr("__dict__").ptr());
949}
Dean Moldovan22c413b2017-03-30 00:20:42 +0200950
Yannick Jadoulf980d762020-07-09 00:14:41 +0200951PYBIND11_NAMESPACE_BEGIN(detail)
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100952/// Generic support for creating new Python heap types
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100953class generic_type : public object {
Jason Rhinelander5fffe202016-09-06 12:17:06 -0400954 template <typename...> friend class class_;
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200955public:
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100956 PYBIND11_OBJECT_DEFAULT(generic_type, object, PyType_Check)
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100957protected:
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100958 void initialize(const type_record &rec) {
959 if (rec.scope && hasattr(rec.scope, rec.name))
960 pybind11_fail("generic_type: cannot initialize type \"" + std::string(rec.name) +
961 "\": an object with that name is already defined");
Wenzel Jakob38d8b8c2016-05-31 09:53:28 +0200962
Jason Rhinelander5e14aa62017-08-17 11:38:05 -0400963 if (rec.module_local ? get_local_type_info(*rec.type) : get_global_type_info(*rec.type))
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100964 pybind11_fail("generic_type: type \"" + std::string(rec.name) +
Wenzel Jakob38d8b8c2016-05-31 09:53:28 +0200965 "\" is already registered!");
966
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100967 m_ptr = make_new_python_type(rec);
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200968
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100969 /* Register supplemental type information in C++ dict */
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100970 auto *tinfo = new detail::type_info();
971 tinfo->type = (PyTypeObject *) m_ptr;
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400972 tinfo->cpptype = rec.type;
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100973 tinfo->type_size = rec.type_size;
Wenzel Jakobe2eca4f2018-11-09 20:14:53 +0100974 tinfo->type_align = rec.type_align;
Dean Moldovan0d765f42017-03-21 01:15:20 +0100975 tinfo->operator_new = rec.operator_new;
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500976 tinfo->holder_size_in_ptrs = size_in_ptrs(rec.holder_size);
Jason Rhinelander353615f2017-07-25 00:53:23 -0400977 tinfo->init_instance = rec.init_instance;
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100978 tinfo->dealloc = rec.dealloc;
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400979 tinfo->simple_type = true;
980 tinfo->simple_ancestors = true;
Jason Rhinelander7437c692017-07-28 22:03:44 -0400981 tinfo->default_holder = rec.default_holder;
982 tinfo->module_local = rec.module_local;
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100983
984 auto &internals = get_internals();
985 auto tindex = std::type_index(*rec.type);
Ivan Smirnova6e6a8b2016-10-23 15:27:13 +0100986 tinfo->direct_conversions = &internals.direct_conversions[tindex];
Jason Rhinelander7437c692017-07-28 22:03:44 -0400987 if (rec.module_local)
988 registered_local_types_cpp()[tindex] = tinfo;
989 else
990 internals.registered_types_cpp[tindex] = tinfo;
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500991 internals.registered_types_py[(PyTypeObject *) m_ptr] = { tinfo };
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100992
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400993 if (rec.bases.size() > 1 || rec.multiple_inheritance) {
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100994 mark_parents_nonsimple(tinfo->type);
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400995 tinfo->simple_ancestors = false;
996 }
997 else if (rec.bases.size() == 1) {
998 auto parent_tinfo = get_type_info((PyTypeObject *) rec.bases[0].ptr());
999 tinfo->simple_ancestors = parent_tinfo->simple_ancestors;
1000 }
Jason Rhinelander5e14aa62017-08-17 11:38:05 -04001001
1002 if (rec.module_local) {
1003 // Stash the local typeinfo and loader so that external modules can access it.
1004 tinfo->module_local_load = &type_caster_generic::local_load;
Dean Moldovan96997a42017-08-20 17:14:09 +02001005 setattr(m_ptr, PYBIND11_MODULE_LOCAL_ID, capsule(tinfo));
Jason Rhinelander5e14aa62017-08-17 11:38:05 -04001006 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001007 }
1008
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001009 /// Helper function which tags all parents of a type using mult. inheritance
1010 void mark_parents_nonsimple(PyTypeObject *value) {
Dean Moldovanc7ac16b2016-10-28 03:08:15 +02001011 auto t = reinterpret_borrow<tuple>(value->tp_bases);
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001012 for (handle h : t) {
1013 auto tinfo2 = get_type_info((PyTypeObject *) h.ptr());
1014 if (tinfo2)
1015 tinfo2->simple_type = false;
1016 mark_parents_nonsimple((PyTypeObject *) h.ptr());
1017 }
1018 }
1019
Wenzel Jakob43398a82015-07-28 16:12:20 +02001020 void install_buffer_funcs(
1021 buffer_info *(*get_buffer)(PyObject *, void *),
1022 void *get_buffer_data) {
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001023 PyHeapTypeObject *type = (PyHeapTypeObject*) m_ptr;
Wenzel Jakobd561cb02016-01-17 22:36:41 +01001024 auto tinfo = detail::get_type_info(&type->ht_type);
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001025
1026 if (!type->ht_type.tp_as_buffer)
1027 pybind11_fail(
1028 "To be able to register buffer protocol support for the type '" +
1029 std::string(tinfo->type->tp_name) +
1030 "' the associated class<>(..) invocation must "
1031 "include the pybind11::buffer_protocol() annotation!");
1032
Wenzel Jakobd561cb02016-01-17 22:36:41 +01001033 tinfo->get_buffer = get_buffer;
1034 tinfo->get_buffer_data = get_buffer_data;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001035 }
1036
Ted Drain0a0758c2017-11-07 08:35:27 -08001037 // rec_func must be set for either fget or fset.
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001038 void def_property_static_impl(const char *name,
1039 handle fget, handle fset,
Ted Drain0a0758c2017-11-07 08:35:27 -08001040 detail::function_record *rec_func) {
1041 const auto is_static = rec_func && !(rec_func->is_method && rec_func->scope);
1042 const auto has_doc = rec_func && rec_func->doc && pybind11::options::show_user_defined_docstrings();
Dean Moldovanc91f8bd2017-02-13 18:11:24 +01001043 auto property = handle((PyObject *) (is_static ? get_internals().static_property_type
1044 : &PyProperty_Type));
1045 attr(name) = property(fget.ptr() ? fget : none(),
1046 fset.ptr() ? fset : none(),
1047 /*deleter*/none(),
Ted Drain0a0758c2017-11-07 08:35:27 -08001048 pybind11::str(has_doc ? rec_func->doc : ""));
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001049 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001050};
Jason Rhinelander6b52c832016-09-06 12:27:00 -04001051
Dean Moldovan0d765f42017-03-21 01:15:20 +01001052/// Set the pointer to operator new if it exists. The cast is needed because it can be overloaded.
1053template <typename T, typename = void_t<decltype(static_cast<void *(*)(size_t)>(T::operator new))>>
1054void set_operator_new(type_record *r) { r->operator_new = &T::operator new; }
1055
1056template <typename> void set_operator_new(...) { }
1057
Jason Rhinelandera03408c2017-07-23 00:32:58 -04001058template <typename T, typename SFINAE = void> struct has_operator_delete : std::false_type { };
1059template <typename T> struct has_operator_delete<T, void_t<decltype(static_cast<void (*)(void *)>(T::operator delete))>>
1060 : std::true_type { };
1061template <typename T, typename SFINAE = void> struct has_operator_delete_size : std::false_type { };
1062template <typename T> struct has_operator_delete_size<T, void_t<decltype(static_cast<void (*)(void *, size_t)>(T::operator delete))>>
1063 : std::true_type { };
Dean Moldovan0d765f42017-03-21 01:15:20 +01001064/// Call class-specific delete if it exists or global otherwise. Can also be an overload set.
Jason Rhinelandera03408c2017-07-23 00:32:58 -04001065template <typename T, enable_if_t<has_operator_delete<T>::value, int> = 0>
Wenzel Jakobe2eca4f2018-11-09 20:14:53 +01001066void call_operator_delete(T *p, size_t, size_t) { T::operator delete(p); }
Jason Rhinelandera03408c2017-07-23 00:32:58 -04001067template <typename T, enable_if_t<!has_operator_delete<T>::value && has_operator_delete_size<T>::value, int> = 0>
Wenzel Jakobe2eca4f2018-11-09 20:14:53 +01001068void call_operator_delete(T *p, size_t s, size_t) { T::operator delete(p, s); }
Dean Moldovan0d765f42017-03-21 01:15:20 +01001069
Wenzel Jakobe2eca4f2018-11-09 20:14:53 +01001070inline void call_operator_delete(void *p, size_t s, size_t a) {
1071 (void)s; (void)a;
Francesco Biscanibd241552019-11-16 01:18:24 +01001072 #if defined(__cpp_aligned_new) && (!defined(_MSC_VER) || _MSC_VER >= 1912)
Jeremy Nimmer759221f2019-06-14 12:12:51 -04001073 if (a > __STDCPP_DEFAULT_NEW_ALIGNMENT__) {
1074 #ifdef __cpp_sized_deallocation
1075 ::operator delete(p, s, std::align_val_t(a));
1076 #else
1077 ::operator delete(p, std::align_val_t(a));
1078 #endif
1079 return;
1080 }
1081 #endif
1082 #ifdef __cpp_sized_deallocation
Wenzel Jakobe2eca4f2018-11-09 20:14:53 +01001083 ::operator delete(p, s);
Jeremy Nimmer759221f2019-06-14 12:12:51 -04001084 #else
1085 ::operator delete(p);
1086 #endif
Wenzel Jakobe2eca4f2018-11-09 20:14:53 +01001087}
Dean Moldovan0d765f42017-03-21 01:15:20 +01001088
Sergei Izmailov7b067cc2020-07-27 02:44:25 +03001089inline void add_class_method(object& cls, const char *name_, const cpp_function &cf) {
1090 cls.attr(cf.name()) = cf;
1091 if (strcmp(name_, "__eq__") == 0 && !cls.attr("__dict__").contains("__hash__")) {
1092 cls.attr("__hash__") = none();
1093 }
1094}
1095
Yannick Jadoulf980d762020-07-09 00:14:41 +02001096PYBIND11_NAMESPACE_END(detail)
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001097
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001098/// Given a pointer to a member function, cast it to its `Derived` version.
1099/// Forward everything else unchanged.
1100template <typename /*Derived*/, typename F>
1101auto method_adaptor(F &&f) -> decltype(std::forward<F>(f)) { return std::forward<F>(f); }
1102
1103template <typename Derived, typename Return, typename Class, typename... Args>
Jason Rhinelander76722922017-10-03 10:09:49 -03001104auto method_adaptor(Return (Class::*pmf)(Args...)) -> Return (Derived::*)(Args...) {
1105 static_assert(detail::is_accessible_base_of<Class, Derived>::value,
1106 "Cannot bind an inaccessible base class method; use a lambda definition instead");
1107 return pmf;
1108}
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001109
1110template <typename Derived, typename Return, typename Class, typename... Args>
Jason Rhinelander76722922017-10-03 10:09:49 -03001111auto method_adaptor(Return (Class::*pmf)(Args...) const) -> Return (Derived::*)(Args...) const {
1112 static_assert(detail::is_accessible_base_of<Class, Derived>::value,
1113 "Cannot bind an inaccessible base class method; use a lambda definition instead");
1114 return pmf;
1115}
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001116
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001117template <typename type_, typename... options>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001118class class_ : public detail::generic_type {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001119 template <typename T> using is_holder = detail::is_holder_type<type_, T>;
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001120 template <typename T> using is_subtype = detail::is_strict_base_of<type_, T>;
1121 template <typename T> using is_base = detail::is_strict_base_of<T, type_>;
Jason Rhinelanderfa5d05e2016-12-12 18:11:49 -05001122 // struct instead of using here to help MSVC:
1123 template <typename T> struct is_valid_class_option :
1124 detail::any_of<is_holder<T>, is_subtype<T>, is_base<T>> {};
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001125
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001126public:
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001127 using type = type_;
Dean Moldovan82ece942017-03-29 11:55:18 +02001128 using type_alias = detail::exactly_one_t<is_subtype, void, options...>;
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001129 constexpr static bool has_alias = !std::is_void<type_alias>::value;
Dean Moldovan82ece942017-03-29 11:55:18 +02001130 using holder_type = detail::exactly_one_t<is_holder, std::unique_ptr<type>, options...>;
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001131
Jason Rhinelanderfa5d05e2016-12-12 18:11:49 -05001132 static_assert(detail::all_of<is_valid_class_option<options>...>::value,
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001133 "Unknown/invalid class_ template parameters provided");
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001134
Jason Rhinelander42e5ddc2017-06-12 21:48:36 -04001135 static_assert(!has_alias || std::is_polymorphic<type>::value,
1136 "Cannot use an alias class with a non-polymorphic type");
1137
Dean Moldovanc7ac16b2016-10-28 03:08:15 +02001138 PYBIND11_OBJECT(class_, generic_type, PyType_Check)
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001139
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001140 template <typename... Extra>
1141 class_(handle scope, const char *name, const Extra &... extra) {
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001142 using namespace detail;
1143
1144 // MI can only be specified via class_ template options, not constructor parameters
1145 static_assert(
1146 none_of<is_pyobject<Extra>...>::value || // no base class arguments, or:
1147 ( constexpr_sum(is_pyobject<Extra>::value...) == 1 && // Exactly one base
1148 constexpr_sum(is_base<options>::value...) == 0 && // no template option bases
1149 none_of<std::is_same<multiple_inheritance, Extra>...>::value), // no multiple_inheritance attr
1150 "Error: multiple inheritance bases must be specified via class_ template options");
1151
1152 type_record record;
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001153 record.scope = scope;
1154 record.name = name;
1155 record.type = &typeid(type);
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001156 record.type_size = sizeof(conditional_t<has_alias, type_alias, type>);
Wenzel Jakobe2eca4f2018-11-09 20:14:53 +01001157 record.type_align = alignof(conditional_t<has_alias, type_alias, type>&);
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001158 record.holder_size = sizeof(holder_type);
Jason Rhinelander353615f2017-07-25 00:53:23 -04001159 record.init_instance = init_instance;
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001160 record.dealloc = dealloc;
Trevor Laughlin63c2a972018-11-11 13:36:55 -05001161 record.default_holder = detail::is_instantiation<std::unique_ptr, holder_type>::value;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001162
Dean Moldovan0d765f42017-03-21 01:15:20 +01001163 set_operator_new<type>(&record);
1164
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001165 /* Register base classes specified via template arguments to class_, if any */
Jason Rhinelander926e2cf2017-03-25 22:41:06 -03001166 PYBIND11_EXPAND_SIDE_EFFECTS(add_base<options>(record));
Jason Rhinelander6b52c832016-09-06 12:27:00 -04001167
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001168 /* Process optional arguments, if any */
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001169 process_attributes<Extra...>::init(extra..., &record);
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001170
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001171 generic_type::initialize(record);
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001172
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001173 if (has_alias) {
Jason Rhinelander7437c692017-07-28 22:03:44 -04001174 auto &instances = record.module_local ? registered_local_types_cpp() : get_internals().registered_types_cpp;
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001175 instances[std::type_index(typeid(type_alias))] = instances[std::type_index(typeid(type))];
1176 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001177 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001178
Wenzel Jakobc1fc27e2016-09-13 00:36:43 +09001179 template <typename Base, detail::enable_if_t<is_base<Base>::value, int> = 0>
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001180 static void add_base(detail::type_record &rec) {
Jason Rhinelander21966962017-06-21 13:38:10 -04001181 rec.add_base(typeid(Base), [](void *src) -> void * {
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001182 return static_cast<Base *>(reinterpret_cast<type *>(src));
1183 });
1184 }
1185
Wenzel Jakobc1fc27e2016-09-13 00:36:43 +09001186 template <typename Base, detail::enable_if_t<!is_base<Base>::value, int> = 0>
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001187 static void add_base(detail::type_record &) { }
1188
Wenzel Jakob71867832015-07-29 17:43:52 +02001189 template <typename Func, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001190 class_ &def(const char *name_, Func&& f, const Extra&... extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001191 cpp_function cf(method_adaptor<type>(std::forward<Func>(f)), name(name_), is_method(*this),
Dean Moldovan865e4302016-09-21 01:06:32 +02001192 sibling(getattr(*this, name_, none())), extra...);
Sergei Izmailov7b067cc2020-07-27 02:44:25 +03001193 add_class_method(*this, name_, cf);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001194 return *this;
1195 }
1196
Wenzel Jakob71867832015-07-29 17:43:52 +02001197 template <typename Func, typename... Extra> class_ &
Jason Rhinelander139a0822017-03-12 17:59:07 -03001198 def_static(const char *name_, Func &&f, const Extra&... extra) {
1199 static_assert(!std::is_member_function_pointer<Func>::value,
1200 "def_static(...) called with a non-static member function pointer");
Dean Moldovan865e4302016-09-21 01:06:32 +02001201 cpp_function cf(std::forward<Func>(f), name(name_), scope(*this),
1202 sibling(getattr(*this, name_, none())), extra...);
Yannick Jadould23c8212019-06-11 10:59:57 +02001203 attr(cf.name()) = staticmethod(cf);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001204 return *this;
1205 }
1206
Wenzel Jakob71867832015-07-29 17:43:52 +02001207 template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001208 class_ &def(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001209 op.execute(*this, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001210 return *this;
1211 }
1212
Wenzel Jakob71867832015-07-29 17:43:52 +02001213 template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001214 class_ & def_cast(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001215 op.execute_cast(*this, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001216 return *this;
1217 }
1218
Wenzel Jakob71867832015-07-29 17:43:52 +02001219 template <typename... Args, typename... Extra>
Jason Rhinelanderc4e18002017-08-17 00:01:42 -04001220 class_ &def(const detail::initimpl::constructor<Args...> &init, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001221 init.execute(*this, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001222 return *this;
1223 }
1224
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001225 template <typename... Args, typename... Extra>
Jason Rhinelanderc4e18002017-08-17 00:01:42 -04001226 class_ &def(const detail::initimpl::alias_constructor<Args...> &init, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001227 init.execute(*this, extra...);
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001228 return *this;
1229 }
1230
Jason Rhinelander464d9892017-06-12 21:52:48 -04001231 template <typename... Args, typename... Extra>
1232 class_ &def(detail::initimpl::factory<Args...> &&init, const Extra&... extra) {
1233 std::move(init).execute(*this, extra...);
1234 return *this;
1235 }
1236
Dean Moldovan1e5a7da2017-08-24 01:53:15 +02001237 template <typename... Args, typename... Extra>
1238 class_ &def(detail::initimpl::pickle_factory<Args...> &&pf, const Extra &...extra) {
1239 std::move(pf).execute(*this, extra...);
1240 return *this;
1241 }
1242
Wenzel Jakob71867832015-07-29 17:43:52 +02001243 template <typename Func> class_& def_buffer(Func &&func) {
Wenzel Jakob43398a82015-07-28 16:12:20 +02001244 struct capture { Func func; };
1245 capture *ptr = new capture { std::forward<Func>(func) };
1246 install_buffer_funcs([](PyObject *obj, void *ptr) -> buffer_info* {
Dean Moldovan5f07fac2017-01-03 11:52:05 +01001247 detail::make_caster<type> caster;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001248 if (!caster.load(obj, false))
1249 return nullptr;
Wenzel Jakob43398a82015-07-28 16:12:20 +02001250 return new buffer_info(((capture *) ptr)->func(caster));
1251 }, ptr);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001252 return *this;
1253 }
1254
Bruce Merryfe0cf8b2017-05-17 10:52:33 +02001255 template <typename Return, typename Class, typename... Args>
1256 class_ &def_buffer(Return (Class::*func)(Args...)) {
1257 return def_buffer([func] (type &obj) { return (obj.*func)(); });
1258 }
1259
1260 template <typename Return, typename Class, typename... Args>
1261 class_ &def_buffer(Return (Class::*func)(Args...) const) {
1262 return def_buffer([func] (const type &obj) { return (obj.*func)(); });
1263 }
1264
Wenzel Jakob71867832015-07-29 17:43:52 +02001265 template <typename C, typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001266 class_ &def_readwrite(const char *name, D C::*pm, const Extra&... extra) {
Roland Dreier1aa8dd12019-06-11 13:25:12 -07001267 static_assert(std::is_same<C, type>::value || std::is_base_of<C, type>::value, "def_readwrite() requires a class member (or base class member)");
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001268 cpp_function fget([pm](const type &c) -> const D &{ return c.*pm; }, is_method(*this)),
1269 fset([pm](type &c, const D &value) { c.*pm = value; }, is_method(*this));
Wenzel Jakob0b489582016-03-25 16:13:10 +01001270 def_property(name, fget, fset, return_value_policy::reference_internal, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001271 return *this;
1272 }
1273
Wenzel Jakob71867832015-07-29 17:43:52 +02001274 template <typename C, typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001275 class_ &def_readonly(const char *name, const D C::*pm, const Extra& ...extra) {
Roland Dreier1aa8dd12019-06-11 13:25:12 -07001276 static_assert(std::is_same<C, type>::value || std::is_base_of<C, type>::value, "def_readonly() requires a class member (or base class member)");
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001277 cpp_function fget([pm](const type &c) -> const D &{ return c.*pm; }, is_method(*this));
Wenzel Jakob0b489582016-03-25 16:13:10 +01001278 def_property_readonly(name, fget, return_value_policy::reference_internal, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001279 return *this;
1280 }
1281
Wenzel Jakob71867832015-07-29 17:43:52 +02001282 template <typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001283 class_ &def_readwrite_static(const char *name, D *pm, const Extra& ...extra) {
Wenzel Jakob0b489582016-03-25 16:13:10 +01001284 cpp_function fget([pm](object) -> const D &{ return *pm; }, scope(*this)),
1285 fset([pm](object, const D &value) { *pm = value; }, scope(*this));
1286 def_property_static(name, fget, fset, return_value_policy::reference, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001287 return *this;
1288 }
1289
Wenzel Jakob71867832015-07-29 17:43:52 +02001290 template <typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001291 class_ &def_readonly_static(const char *name, const D *pm, const Extra& ...extra) {
Wenzel Jakob0b489582016-03-25 16:13:10 +01001292 cpp_function fget([pm](object) -> const D &{ return *pm; }, scope(*this));
1293 def_property_readonly_static(name, fget, return_value_policy::reference, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001294 return *this;
1295 }
1296
Dean Moldovan03f627e2016-11-01 11:44:57 +01001297 /// Uses return_value_policy::reference_internal by default
1298 template <typename Getter, typename... Extra>
1299 class_ &def_property_readonly(const char *name, const Getter &fget, const Extra& ...extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001300 return def_property_readonly(name, cpp_function(method_adaptor<type>(fget)),
1301 return_value_policy::reference_internal, extra...);
Dean Moldovan03f627e2016-11-01 11:44:57 +01001302 }
1303
1304 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001305 template <typename... Extra>
1306 class_ &def_property_readonly(const char *name, const cpp_function &fget, const Extra& ...extra) {
Ted Drain0a0758c2017-11-07 08:35:27 -08001307 return def_property(name, fget, nullptr, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001308 }
1309
Dean Moldovan03f627e2016-11-01 11:44:57 +01001310 /// Uses return_value_policy::reference by default
1311 template <typename Getter, typename... Extra>
1312 class_ &def_property_readonly_static(const char *name, const Getter &fget, const Extra& ...extra) {
1313 return def_property_readonly_static(name, cpp_function(fget), return_value_policy::reference, extra...);
1314 }
1315
1316 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001317 template <typename... Extra>
1318 class_ &def_property_readonly_static(const char *name, const cpp_function &fget, const Extra& ...extra) {
Ted Drain0a0758c2017-11-07 08:35:27 -08001319 return def_property_static(name, fget, nullptr, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001320 }
1321
Dean Moldovan03f627e2016-11-01 11:44:57 +01001322 /// Uses return_value_policy::reference_internal by default
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001323 template <typename Getter, typename Setter, typename... Extra>
1324 class_ &def_property(const char *name, const Getter &fget, const Setter &fset, const Extra& ...extra) {
1325 return def_property(name, fget, cpp_function(method_adaptor<type>(fset)), extra...);
1326 }
Dean Moldovan03f627e2016-11-01 11:44:57 +01001327 template <typename Getter, typename... Extra>
1328 class_ &def_property(const char *name, const Getter &fget, const cpp_function &fset, const Extra& ...extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001329 return def_property(name, cpp_function(method_adaptor<type>(fget)), fset,
1330 return_value_policy::reference_internal, extra...);
Dean Moldovan03f627e2016-11-01 11:44:57 +01001331 }
1332
1333 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001334 template <typename... Extra>
1335 class_ &def_property(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
Wenzel Jakob0b489582016-03-25 16:13:10 +01001336 return def_property_static(name, fget, fset, is_method(*this), extra...);
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001337 }
1338
Dean Moldovan03f627e2016-11-01 11:44:57 +01001339 /// Uses return_value_policy::reference by default
1340 template <typename Getter, typename... Extra>
1341 class_ &def_property_static(const char *name, const Getter &fget, const cpp_function &fset, const Extra& ...extra) {
1342 return def_property_static(name, cpp_function(fget), fset, return_value_policy::reference, extra...);
1343 }
1344
1345 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001346 template <typename... Extra>
1347 class_ &def_property_static(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
Jeff VanOss77ef03d2019-06-11 08:25:35 -04001348 static_assert( 0 == detail::constexpr_sum(std::is_base_of<arg, Extra>::value...),
1349 "Argument annotations are not allowed for properties");
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001350 auto rec_fget = get_function_record(fget), rec_fset = get_function_record(fset);
Ted Drain0a0758c2017-11-07 08:35:27 -08001351 auto *rec_active = rec_fget;
1352 if (rec_fget) {
1353 char *doc_prev = rec_fget->doc; /* 'extra' field may include a property-specific documentation string */
1354 detail::process_attributes<Extra...>::init(extra..., rec_fget);
1355 if (rec_fget->doc && rec_fget->doc != doc_prev) {
1356 free(doc_prev);
1357 rec_fget->doc = strdup(rec_fget->doc);
1358 }
Wenzel Jakob7c99ff22016-06-02 20:33:01 +02001359 }
1360 if (rec_fset) {
Ted Drain0a0758c2017-11-07 08:35:27 -08001361 char *doc_prev = rec_fset->doc;
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001362 detail::process_attributes<Extra...>::init(extra..., rec_fset);
Wenzel Jakob7c99ff22016-06-02 20:33:01 +02001363 if (rec_fset->doc && rec_fset->doc != doc_prev) {
1364 free(doc_prev);
1365 rec_fset->doc = strdup(rec_fset->doc);
1366 }
Ted Drain0a0758c2017-11-07 08:35:27 -08001367 if (! rec_active) rec_active = rec_fset;
Wenzel Jakob7c99ff22016-06-02 20:33:01 +02001368 }
Ted Drain0a0758c2017-11-07 08:35:27 -08001369 def_property_static_impl(name, fget, fset, rec_active);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001370 return *this;
1371 }
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001372
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001373private:
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001374 /// Initialize holder object, variant 1: object derives from enable_shared_from_this
1375 template <typename T>
Jason Rhinelander353615f2017-07-25 00:53:23 -04001376 static void init_holder(detail::instance *inst, detail::value_and_holder &v_h,
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001377 const holder_type * /* unused */, const std::enable_shared_from_this<T> * /* dummy */) {
Wenzel Jakob6e213c92015-11-24 23:05:58 +01001378 try {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001379 auto sh = std::dynamic_pointer_cast<typename holder_type::element_type>(
1380 v_h.value_ptr<type>()->shared_from_this());
Jason Rhinelanderb8ac4382017-05-19 13:34:55 -04001381 if (sh) {
Khachajantc Michaele3cb2a62018-06-20 18:33:50 +03001382 new (std::addressof(v_h.holder<holder_type>())) holder_type(std::move(sh));
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001383 v_h.set_holder_constructed();
Dean Moldovanab90ec62016-12-07 02:36:44 +01001384 }
Jason Rhinelanderb8ac4382017-05-19 13:34:55 -04001385 } catch (const std::bad_weak_ptr &) {}
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001386
1387 if (!v_h.holder_constructed() && inst->owned) {
Khachajantc Michaele3cb2a62018-06-20 18:33:50 +03001388 new (std::addressof(v_h.holder<holder_type>())) holder_type(v_h.value_ptr<type>());
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001389 v_h.set_holder_constructed();
Wenzel Jakob6e213c92015-11-24 23:05:58 +01001390 }
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001391 }
1392
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001393 static void init_holder_from_existing(const detail::value_and_holder &v_h,
1394 const holder_type *holder_ptr, std::true_type /*is_copy_constructible*/) {
Khachajantc Michaele3cb2a62018-06-20 18:33:50 +03001395 new (std::addressof(v_h.holder<holder_type>())) holder_type(*reinterpret_cast<const holder_type *>(holder_ptr));
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001396 }
1397
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001398 static void init_holder_from_existing(const detail::value_and_holder &v_h,
1399 const holder_type *holder_ptr, std::false_type /*is_copy_constructible*/) {
Khachajantc Michaele3cb2a62018-06-20 18:33:50 +03001400 new (std::addressof(v_h.holder<holder_type>())) holder_type(std::move(*const_cast<holder_type *>(holder_ptr)));
Dean Moldovanec009a72017-01-31 17:05:44 +01001401 }
1402
1403 /// Initialize holder object, variant 2: try to construct from existing holder object, if possible
Jason Rhinelander353615f2017-07-25 00:53:23 -04001404 static void init_holder(detail::instance *inst, detail::value_and_holder &v_h,
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001405 const holder_type *holder_ptr, const void * /* dummy -- not enable_shared_from_this<T>) */) {
Dean Moldovanec009a72017-01-31 17:05:44 +01001406 if (holder_ptr) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001407 init_holder_from_existing(v_h, holder_ptr, std::is_copy_constructible<holder_type>());
1408 v_h.set_holder_constructed();
Dean Moldovanec009a72017-01-31 17:05:44 +01001409 } else if (inst->owned || detail::always_construct_holder<holder_type>::value) {
Khachajantc Michaele3cb2a62018-06-20 18:33:50 +03001410 new (std::addressof(v_h.holder<holder_type>())) holder_type(v_h.value_ptr<type>());
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001411 v_h.set_holder_constructed();
Jason Rhinelanderc07ec312016-11-06 13:12:48 -05001412 }
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001413 }
1414
Jason Rhinelander353615f2017-07-25 00:53:23 -04001415 /// Performs instance initialization including constructing a holder and registering the known
1416 /// instance. Should be called as soon as the `type` value_ptr is set for an instance. Takes an
1417 /// optional pointer to an existing holder to use; if not specified and the instance is
1418 /// `.owned`, a new holder will be constructed to manage the value pointer.
1419 static void init_instance(detail::instance *inst, const void *holder_ptr) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001420 auto v_h = inst->get_value_and_holder(detail::get_type_info(typeid(type)));
Jason Rhinelandercca20a72017-07-29 03:56:01 -04001421 if (!v_h.instance_registered()) {
1422 register_instance(inst, v_h.value_ptr(), v_h.type);
1423 v_h.set_instance_registered();
1424 }
Jason Rhinelander353615f2017-07-25 00:53:23 -04001425 init_holder(inst, v_h, (const holder_type *) holder_ptr, v_h.value_ptr<type>());
Wenzel Jakob6e213c92015-11-24 23:05:58 +01001426 }
1427
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001428 /// Deallocates an instance; via holder, if constructed; otherwise via operator delete.
Jason Rhinelander464d9892017-06-12 21:52:48 -04001429 static void dealloc(detail::value_and_holder &v_h) {
jbarlow834d90f1a2020-07-31 17:46:12 -07001430 // We could be deallocating because we are cleaning up after a Python exception.
1431 // If so, the Python error indicator will be set. We need to clear that before
1432 // running the destructor, in case the destructor code calls more Python.
1433 // If we don't, the Python API will exit with an exception, and pybind11 will
1434 // throw error_already_set from the C++ destructor which is forbidden and triggers
1435 // std::terminate().
1436 error_scope scope;
Jason Rhinelander464d9892017-06-12 21:52:48 -04001437 if (v_h.holder_constructed()) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001438 v_h.holder<holder_type>().~holder_type();
Jason Rhinelander464d9892017-06-12 21:52:48 -04001439 v_h.set_holder_constructed(false);
1440 }
1441 else {
Wenzel Jakobe2eca4f2018-11-09 20:14:53 +01001442 detail::call_operator_delete(v_h.value_ptr<type>(),
1443 v_h.type->type_size,
1444 v_h.type->type_align
1445 );
Jason Rhinelander464d9892017-06-12 21:52:48 -04001446 }
1447 v_h.value_ptr() = nullptr;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001448 }
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001449
1450 static detail::function_record *get_function_record(handle h) {
1451 h = detail::get_function(h);
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001452 return h ? (detail::function_record *) reinterpret_borrow<capsule>(PyCFunction_GET_SELF(h.ptr()))
Dean Moldovanc7ac16b2016-10-28 03:08:15 +02001453 : nullptr;
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001454 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001455};
1456
Dean Moldovan68986792017-08-30 23:40:55 +02001457/// Binds an existing constructor taking arguments Args...
1458template <typename... Args> detail::initimpl::constructor<Args...> init() { return {}; }
1459/// Like `init<Args...>()`, but the instance is always constructed through the alias class (even
1460/// when not inheriting on the Python side).
1461template <typename... Args> detail::initimpl::alias_constructor<Args...> init_alias() { return {}; }
1462
1463/// Binds a factory function as a constructor
1464template <typename Func, typename Ret = detail::initimpl::factory<Func>>
1465Ret init(Func &&f) { return {std::forward<Func>(f)}; }
1466
1467/// Dual-argument factory function: the first function is called when no alias is needed, the second
1468/// when an alias is needed (i.e. due to python-side inheritance). Arguments must be identical.
1469template <typename CFunc, typename AFunc, typename Ret = detail::initimpl::factory<CFunc, AFunc>>
1470Ret init(CFunc &&c, AFunc &&a) {
1471 return {std::forward<CFunc>(c), std::forward<AFunc>(a)};
1472}
1473
1474/// Binds pickling functions `__getstate__` and `__setstate__` and ensures that the type
1475/// returned by `__getstate__` is the same as the argument accepted by `__setstate__`.
1476template <typename GetState, typename SetState>
1477detail::initimpl::pickle_factory<GetState, SetState> pickle(GetState &&g, SetState &&s) {
1478 return {std::forward<GetState>(g), std::forward<SetState>(s)};
Marcin Wojdyrfbab29c2017-09-04 18:37:16 +01001479}
Dean Moldovan68986792017-08-30 23:40:55 +02001480
Yannick Jadoulf980d762020-07-09 00:14:41 +02001481PYBIND11_NAMESPACE_BEGIN(detail)
Wenzel Jakobf4245182018-09-01 01:20:24 +02001482struct enum_base {
1483 enum_base(handle base, handle parent) : m_base(base), m_parent(parent) { }
1484
1485 PYBIND11_NOINLINE void init(bool is_arithmetic, bool is_convertible) {
1486 m_base.attr("__entries") = dict();
1487 auto property = handle((PyObject *) &PyProperty_Type);
1488 auto static_property = handle((PyObject *) get_internals().static_property_type);
1489
1490 m_base.attr("__repr__") = cpp_function(
1491 [](handle arg) -> str {
1492 handle type = arg.get_type();
1493 object type_name = type.attr("__name__");
1494 dict entries = type.attr("__entries");
1495 for (const auto &kv : entries) {
1496 object other = kv.second[int_(0)];
1497 if (other.equal(arg))
1498 return pybind11::str("{}.{}").format(type_name, kv.first);
1499 }
1500 return pybind11::str("{}.???").format(type_name);
Yannick Jadoul805c5862020-01-25 23:38:01 +01001501 }, name("__repr__"), is_method(m_base)
Wenzel Jakobf4245182018-09-01 01:20:24 +02001502 );
1503
1504 m_base.attr("name") = property(cpp_function(
1505 [](handle arg) -> str {
1506 dict entries = arg.get_type().attr("__entries");
1507 for (const auto &kv : entries) {
1508 if (handle(kv.second[int_(0)]).equal(arg))
1509 return pybind11::str(kv.first);
1510 }
1511 return "???";
Yannick Jadoul805c5862020-01-25 23:38:01 +01001512 }, name("name"), is_method(m_base)
Wenzel Jakobf4245182018-09-01 01:20:24 +02001513 ));
1514
1515 m_base.attr("__doc__") = static_property(cpp_function(
1516 [](handle arg) -> std::string {
1517 std::string docstring;
1518 dict entries = arg.attr("__entries");
1519 if (((PyTypeObject *) arg.ptr())->tp_doc)
1520 docstring += std::string(((PyTypeObject *) arg.ptr())->tp_doc) + "\n\n";
1521 docstring += "Members:";
1522 for (const auto &kv : entries) {
1523 auto key = std::string(pybind11::str(kv.first));
1524 auto comment = kv.second[int_(1)];
1525 docstring += "\n\n " + key;
1526 if (!comment.is_none())
1527 docstring += " : " + (std::string) pybind11::str(comment);
1528 }
1529 return docstring;
Yannick Jadoul805c5862020-01-25 23:38:01 +01001530 }, name("__doc__")
Wenzel Jakobf4245182018-09-01 01:20:24 +02001531 ), none(), none(), "");
1532
1533 m_base.attr("__members__") = static_property(cpp_function(
1534 [](handle arg) -> dict {
1535 dict entries = arg.attr("__entries"), m;
1536 for (const auto &kv : entries)
1537 m[kv.first] = kv.second[int_(0)];
1538 return m;
Yannick Jadoul805c5862020-01-25 23:38:01 +01001539 }, name("__members__")), none(), none(), ""
Wenzel Jakobf4245182018-09-01 01:20:24 +02001540 );
1541
Tarcísio Fischer54eb8192018-10-24 06:18:58 -03001542 #define PYBIND11_ENUM_OP_STRICT(op, expr, strict_behavior) \
Wenzel Jakobf4245182018-09-01 01:20:24 +02001543 m_base.attr(op) = cpp_function( \
1544 [](object a, object b) { \
1545 if (!a.get_type().is(b.get_type())) \
Tarcísio Fischer54eb8192018-10-24 06:18:58 -03001546 strict_behavior; \
Wenzel Jakobf4245182018-09-01 01:20:24 +02001547 return expr; \
1548 }, \
Yannick Jadoul805c5862020-01-25 23:38:01 +01001549 name(op), is_method(m_base))
Wenzel Jakobf4245182018-09-01 01:20:24 +02001550
1551 #define PYBIND11_ENUM_OP_CONV(op, expr) \
1552 m_base.attr(op) = cpp_function( \
1553 [](object a_, object b_) { \
1554 int_ a(a_), b(b_); \
1555 return expr; \
1556 }, \
Yannick Jadoul805c5862020-01-25 23:38:01 +01001557 name(op), is_method(m_base))
Wenzel Jakobf4245182018-09-01 01:20:24 +02001558
Sergei Izmailov09f08292019-09-19 19:23:27 +03001559 #define PYBIND11_ENUM_OP_CONV_LHS(op, expr) \
1560 m_base.attr(op) = cpp_function( \
1561 [](object a_, object b) { \
1562 int_ a(a_); \
1563 return expr; \
1564 }, \
Yannick Jadoul805c5862020-01-25 23:38:01 +01001565 name(op), is_method(m_base))
Sergei Izmailov09f08292019-09-19 19:23:27 +03001566
Wenzel Jakobf4245182018-09-01 01:20:24 +02001567 if (is_convertible) {
Sergei Izmailov09f08292019-09-19 19:23:27 +03001568 PYBIND11_ENUM_OP_CONV_LHS("__eq__", !b.is_none() && a.equal(b));
1569 PYBIND11_ENUM_OP_CONV_LHS("__ne__", b.is_none() || !a.equal(b));
Wenzel Jakobf4245182018-09-01 01:20:24 +02001570
1571 if (is_arithmetic) {
1572 PYBIND11_ENUM_OP_CONV("__lt__", a < b);
1573 PYBIND11_ENUM_OP_CONV("__gt__", a > b);
1574 PYBIND11_ENUM_OP_CONV("__le__", a <= b);
1575 PYBIND11_ENUM_OP_CONV("__ge__", a >= b);
1576 PYBIND11_ENUM_OP_CONV("__and__", a & b);
1577 PYBIND11_ENUM_OP_CONV("__rand__", a & b);
1578 PYBIND11_ENUM_OP_CONV("__or__", a | b);
1579 PYBIND11_ENUM_OP_CONV("__ror__", a | b);
1580 PYBIND11_ENUM_OP_CONV("__xor__", a ^ b);
1581 PYBIND11_ENUM_OP_CONV("__rxor__", a ^ b);
Lori A. Burnsf6c4c102019-09-04 16:16:21 -04001582 m_base.attr("__invert__") = cpp_function(
Yannick Jadoul805c5862020-01-25 23:38:01 +01001583 [](object arg) { return ~(int_(arg)); }, name("__invert__"), is_method(m_base));
Wenzel Jakobf4245182018-09-01 01:20:24 +02001584 }
1585 } else {
Tarcísio Fischer54eb8192018-10-24 06:18:58 -03001586 PYBIND11_ENUM_OP_STRICT("__eq__", int_(a).equal(int_(b)), return false);
1587 PYBIND11_ENUM_OP_STRICT("__ne__", !int_(a).equal(int_(b)), return true);
Wenzel Jakobf4245182018-09-01 01:20:24 +02001588
1589 if (is_arithmetic) {
Michał Wawrzyniec Urbańczyk978d4392018-11-03 13:20:08 +01001590 #define PYBIND11_THROW throw type_error("Expected an enumeration of matching type!");
1591 PYBIND11_ENUM_OP_STRICT("__lt__", int_(a) < int_(b), PYBIND11_THROW);
1592 PYBIND11_ENUM_OP_STRICT("__gt__", int_(a) > int_(b), PYBIND11_THROW);
1593 PYBIND11_ENUM_OP_STRICT("__le__", int_(a) <= int_(b), PYBIND11_THROW);
1594 PYBIND11_ENUM_OP_STRICT("__ge__", int_(a) >= int_(b), PYBIND11_THROW);
1595 #undef PYBIND11_THROW
Wenzel Jakobf4245182018-09-01 01:20:24 +02001596 }
1597 }
1598
Sergei Izmailov09f08292019-09-19 19:23:27 +03001599 #undef PYBIND11_ENUM_OP_CONV_LHS
Wenzel Jakobf4245182018-09-01 01:20:24 +02001600 #undef PYBIND11_ENUM_OP_CONV
1601 #undef PYBIND11_ENUM_OP_STRICT
1602
Yannick Jadoul805c5862020-01-25 23:38:01 +01001603 m_base.attr("__getstate__") = cpp_function(
1604 [](object arg) { return int_(arg); }, name("__getstate__"), is_method(m_base));
Wenzel Jakobf4245182018-09-01 01:20:24 +02001605
Yannick Jadoul805c5862020-01-25 23:38:01 +01001606 m_base.attr("__hash__") = cpp_function(
1607 [](object arg) { return int_(arg); }, name("__hash__"), is_method(m_base));
Wenzel Jakobf4245182018-09-01 01:20:24 +02001608 }
1609
1610 PYBIND11_NOINLINE void value(char const* name_, object value, const char *doc = nullptr) {
1611 dict entries = m_base.attr("__entries");
1612 str name(name_);
1613 if (entries.contains(name)) {
1614 std::string type_name = (std::string) str(m_base.attr("__name__"));
1615 throw value_error(type_name + ": element \"" + std::string(name_) + "\" already exists!");
1616 }
1617
1618 entries[name] = std::make_pair(value, doc);
1619 m_base.attr(name) = value;
1620 }
1621
1622 PYBIND11_NOINLINE void export_values() {
1623 dict entries = m_base.attr("__entries");
1624 for (const auto &kv : entries)
1625 m_parent.attr(kv.first) = kv.second[int_(0)];
1626 }
1627
1628 handle m_base;
1629 handle m_parent;
1630};
1631
Yannick Jadoulf980d762020-07-09 00:14:41 +02001632PYBIND11_NAMESPACE_END(detail)
Wenzel Jakobf4245182018-09-01 01:20:24 +02001633
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001634/// Binds C++ enumerations and enumeration classes to Python
1635template <typename Type> class enum_ : public class_<Type> {
1636public:
Wenzel Jakobc8e9f3c2018-09-14 12:07:47 +02001637 using Base = class_<Type>;
1638 using Base::def;
1639 using Base::attr;
1640 using Base::def_property_readonly;
1641 using Base::def_property_readonly_static;
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001642 using Scalar = typename std::underlying_type<Type>::type;
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001643
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001644 template <typename... Extra>
1645 enum_(const handle &scope, const char *name, const Extra&... extra)
Wenzel Jakobf4245182018-09-01 01:20:24 +02001646 : class_<Type>(scope, name, extra...), m_base(*this, scope) {
Dean Moldovan82ece942017-03-29 11:55:18 +02001647 constexpr bool is_arithmetic = detail::any_of<std::is_same<arithmetic, Extra>...>::value;
Wenzel Jakobf4245182018-09-01 01:20:24 +02001648 constexpr bool is_convertible = std::is_convertible<Type, Scalar>::value;
1649 m_base.init(is_arithmetic, is_convertible);
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001650
Dean Moldovan68986792017-08-30 23:40:55 +02001651 def(init([](Scalar i) { return static_cast<Type>(i); }));
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001652 def("__int__", [](Type value) { return (Scalar) value; });
Wenzel Jakobe6fd2cd2017-04-28 14:46:52 +02001653 #if PY_MAJOR_VERSION < 3
1654 def("__long__", [](Type value) { return (Scalar) value; });
1655 #endif
Wenzel Jakobf3109d82019-09-21 18:09:35 +02001656 #if PY_MAJOR_VERSION > 3 || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 8)
Wenzel Jakob31680e62019-09-20 11:06:10 +02001657 def("__index__", [](Type value) { return (Scalar) value; });
1658 #endif
1659
Yannick Jadoul805c5862020-01-25 23:38:01 +01001660 attr("__setstate__") = cpp_function(
1661 [](detail::value_and_holder &v_h, Scalar arg) {
1662 detail::initimpl::setstate<Base>(v_h, static_cast<Type>(arg),
1663 Py_TYPE(v_h.inst) != v_h.type->type); },
1664 detail::is_new_style_constructor(),
1665 pybind11::name("__setstate__"), is_method(*this));
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001666 }
1667
1668 /// Export enumeration entries into the parent scope
Matthieu Becaf936e12017-03-03 08:45:50 -08001669 enum_& export_values() {
Wenzel Jakobf4245182018-09-01 01:20:24 +02001670 m_base.export_values();
Wenzel Jakobe916d842016-11-04 16:51:14 +01001671 return *this;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001672 }
1673
1674 /// Add an enumeration entry
Wenzel Jakob6d190362017-11-16 22:24:36 +01001675 enum_& value(char const* name, Type value, const char *doc = nullptr) {
Wenzel Jakobf4245182018-09-01 01:20:24 +02001676 m_base.value(name, pybind11::cast(value, return_value_policy::copy), doc);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001677 return *this;
1678 }
Matthieu Becaf936e12017-03-03 08:45:50 -08001679
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001680private:
Wenzel Jakobf4245182018-09-01 01:20:24 +02001681 detail::enum_base m_base;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001682};
1683
Yannick Jadoulf980d762020-07-09 00:14:41 +02001684PYBIND11_NAMESPACE_BEGIN(detail)
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001685
Jason Rhinelanderec62d972016-09-09 02:42:51 -04001686
Jason Rhinelanderf2ecd892016-08-10 12:08:04 -04001687inline void keep_alive_impl(handle nurse, handle patient) {
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001688 if (!nurse || !patient)
Wenzel Jakob678d7872016-01-17 22:36:41 +01001689 pybind11_fail("Could not activate keep_alive!");
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001690
Ivan Smirnov984c7622016-08-29 02:38:47 +01001691 if (patient.is_none() || nurse.is_none())
Glen Walkerf45bb582016-08-16 17:50:43 +12001692 return; /* Nothing to keep alive or nothing to be kept alive by */
Wenzel Jakob9b880ba2016-04-25 03:25:13 +02001693
Bruce Merry9d698f72017-06-24 14:58:42 +02001694 auto tinfo = all_type_info(Py_TYPE(nurse.ptr()));
1695 if (!tinfo.empty()) {
1696 /* It's a pybind-registered type, so we can store the patient in the
1697 * internal list. */
1698 add_patient(nurse.ptr(), patient.ptr());
1699 }
1700 else {
1701 /* Fall back to clever approach based on weak references taken from
1702 * Boost.Python. This is not used for pybind-registered types because
1703 * the objects can be destroyed out-of-order in a GC pass. */
1704 cpp_function disable_lifesupport(
1705 [patient](handle weakref) { patient.dec_ref(); weakref.dec_ref(); });
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001706
Bruce Merry9d698f72017-06-24 14:58:42 +02001707 weakref wr(nurse, disable_lifesupport);
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001708
Bruce Merry9d698f72017-06-24 14:58:42 +02001709 patient.inc_ref(); /* reference patient and leak the weak reference */
1710 (void) wr.release();
1711 }
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001712}
1713
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -05001714PYBIND11_NOINLINE inline void keep_alive_impl(size_t Nurse, size_t Patient, function_call &call, handle ret) {
Dean Moldovan7939f4b2017-09-04 13:49:19 +02001715 auto get_arg = [&](size_t n) {
1716 if (n == 0)
1717 return ret;
1718 else if (n == 1 && call.init_self)
1719 return call.init_self;
1720 else if (n <= call.args.size())
1721 return call.args[n - 1];
1722 return handle();
1723 };
1724
1725 keep_alive_impl(get_arg(Nurse), get_arg(Patient));
Jason Rhinelanderf2ecd892016-08-10 12:08:04 -04001726}
1727
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001728inline std::pair<decltype(internals::registered_types_py)::iterator, bool> all_type_info_get_cache(PyTypeObject *type) {
1729 auto res = get_internals().registered_types_py
Jason Rhinelander12be4cd2017-07-29 03:53:45 -04001730#ifdef __cpp_lib_unordered_map_try_emplace
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001731 .try_emplace(type);
1732#else
1733 .emplace(type, std::vector<detail::type_info *>());
1734#endif
1735 if (res.second) {
1736 // New cache entry created; set up a weak reference to automatically remove it if the type
1737 // gets destroyed:
1738 weakref((PyObject *) type, cpp_function([type](handle wr) {
1739 get_internals().registered_types_py.erase(type);
1740 wr.dec_ref();
1741 })).release();
1742 }
1743
1744 return res;
1745}
1746
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001747template <typename Iterator, typename Sentinel, bool KeyIterator, return_value_policy Policy>
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001748struct iterator_state {
1749 Iterator it;
1750 Sentinel end;
Dean Moldovancaedf742017-06-09 16:49:04 +02001751 bool first_or_done;
Ivan Smirnovdaed1ab2016-06-17 22:29:39 +01001752};
Wenzel Jakobb2825952016-04-13 23:33:00 +02001753
Yannick Jadoulf980d762020-07-09 00:14:41 +02001754PYBIND11_NAMESPACE_END(detail)
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001755
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001756/// Makes a python iterator from a first and past-the-end C++ InputIterator.
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001757template <return_value_policy Policy = return_value_policy::reference_internal,
1758 typename Iterator,
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001759 typename Sentinel,
Wenzel Jakob5dd33d82016-05-30 11:28:21 +02001760 typename ValueType = decltype(*std::declval<Iterator>()),
1761 typename... Extra>
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001762iterator make_iterator(Iterator first, Sentinel last, Extra &&... extra) {
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001763 typedef detail::iterator_state<Iterator, Sentinel, false, Policy> state;
Wenzel Jakobb2825952016-04-13 23:33:00 +02001764
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001765 if (!detail::get_type_info(typeid(state), false)) {
Jason Rhinelander7437c692017-07-28 22:03:44 -04001766 class_<state>(handle(), "iterator", pybind11::module_local())
Wenzel Jakobb2825952016-04-13 23:33:00 +02001767 .def("__iter__", [](state &s) -> state& { return s; })
Wenzel Jakob5dd33d82016-05-30 11:28:21 +02001768 .def("__next__", [](state &s) -> ValueType {
Dean Moldovancaedf742017-06-09 16:49:04 +02001769 if (!s.first_or_done)
Ivan Smirnovdaed1ab2016-06-17 22:29:39 +01001770 ++s.it;
1771 else
Dean Moldovancaedf742017-06-09 16:49:04 +02001772 s.first_or_done = false;
1773 if (s.it == s.end) {
1774 s.first_or_done = true;
Wenzel Jakobb2825952016-04-13 23:33:00 +02001775 throw stop_iteration();
Dean Moldovancaedf742017-06-09 16:49:04 +02001776 }
Ivan Smirnovdaed1ab2016-06-17 22:29:39 +01001777 return *s.it;
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001778 }, std::forward<Extra>(extra)..., Policy);
Wenzel Jakobb2825952016-04-13 23:33:00 +02001779 }
1780
Dean Moldovancaedf742017-06-09 16:49:04 +02001781 return cast(state{first, last, true});
Wenzel Jakobb2825952016-04-13 23:33:00 +02001782}
Wenzel Jakob146397e2016-09-06 13:06:31 +09001783
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001784/// Makes an python iterator over the keys (`.first`) of a iterator over pairs from a
1785/// first and past-the-end InputIterator.
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001786template <return_value_policy Policy = return_value_policy::reference_internal,
1787 typename Iterator,
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001788 typename Sentinel,
Ivan Smirnovc5a1c8a2016-08-24 23:27:19 +01001789 typename KeyType = decltype((*std::declval<Iterator>()).first),
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001790 typename... Extra>
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001791iterator make_key_iterator(Iterator first, Sentinel last, Extra &&... extra) {
Henry Schreinerb342c372020-09-10 22:57:10 -04001792 using state = detail::iterator_state<Iterator, Sentinel, true, Policy>;
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001793
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001794 if (!detail::get_type_info(typeid(state), false)) {
Jason Rhinelander7437c692017-07-28 22:03:44 -04001795 class_<state>(handle(), "iterator", pybind11::module_local())
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001796 .def("__iter__", [](state &s) -> state& { return s; })
1797 .def("__next__", [](state &s) -> KeyType {
Dean Moldovancaedf742017-06-09 16:49:04 +02001798 if (!s.first_or_done)
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001799 ++s.it;
1800 else
Dean Moldovancaedf742017-06-09 16:49:04 +02001801 s.first_or_done = false;
1802 if (s.it == s.end) {
1803 s.first_or_done = true;
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001804 throw stop_iteration();
Dean Moldovancaedf742017-06-09 16:49:04 +02001805 }
Ivan Smirnovc5a1c8a2016-08-24 23:27:19 +01001806 return (*s.it).first;
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001807 }, std::forward<Extra>(extra)..., Policy);
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001808 }
1809
Dean Moldovancaedf742017-06-09 16:49:04 +02001810 return cast(state{first, last, true});
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001811}
Wenzel Jakobb2825952016-04-13 23:33:00 +02001812
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001813/// Makes an iterator over values of an stl container or other container supporting
1814/// `std::begin()`/`std::end()`
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001815template <return_value_policy Policy = return_value_policy::reference_internal,
1816 typename Type, typename... Extra> iterator make_iterator(Type &value, Extra&&... extra) {
1817 return make_iterator<Policy>(std::begin(value), std::end(value), extra...);
Wenzel Jakobbf0c7dc2016-04-18 10:52:12 +02001818}
1819
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001820/// Makes an iterator over the keys (`.first`) of a stl map-like container supporting
1821/// `std::begin()`/`std::end()`
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001822template <return_value_policy Policy = return_value_policy::reference_internal,
1823 typename Type, typename... Extra> iterator make_key_iterator(Type &value, Extra&&... extra) {
1824 return make_key_iterator<Policy>(std::begin(value), std::end(value), extra...);
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001825}
1826
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001827template <typename InputType, typename OutputType> void implicitly_convertible() {
Wenzel Jakob8ed5b8a2017-08-28 16:34:06 +02001828 struct set_flag {
1829 bool &flag;
1830 set_flag(bool &flag) : flag(flag) { flag = true; }
1831 ~set_flag() { flag = false; }
1832 };
Wenzel Jakob2ac50442016-01-17 22:36:35 +01001833 auto implicit_caster = [](PyObject *obj, PyTypeObject *type) -> PyObject * {
Wenzel Jakob8ed5b8a2017-08-28 16:34:06 +02001834 static bool currently_used = false;
1835 if (currently_used) // implicit conversions are non-reentrant
1836 return nullptr;
1837 set_flag flag_helper(currently_used);
Dean Moldovan5f07fac2017-01-03 11:52:05 +01001838 if (!detail::make_caster<InputType>().load(obj, false))
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001839 return nullptr;
1840 tuple args(1);
1841 args[0] = obj;
1842 PyObject *result = PyObject_Call((PyObject *) type, args.ptr(), nullptr);
1843 if (result == nullptr)
1844 PyErr_Clear();
1845 return result;
1846 };
Ivan Smirnov8f3e0452016-10-23 15:43:03 +01001847
1848 if (auto tinfo = detail::get_type_info(typeid(OutputType)))
1849 tinfo->implicit_conversions.push_back(implicit_caster);
1850 else
Wenzel Jakob678d7872016-01-17 22:36:41 +01001851 pybind11_fail("implicitly_convertible: Unable to find type " + type_id<OutputType>());
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001852}
1853
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001854template <typename ExceptionTranslator>
1855void register_exception_translator(ExceptionTranslator&& translator) {
1856 detail::get_internals().registered_exception_translators.push_front(
1857 std::forward<ExceptionTranslator>(translator));
1858}
1859
Jason Rhinelander37b23832017-05-22 12:06:16 -04001860/**
1861 * Wrapper to generate a new Python exception type.
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001862 *
1863 * This should only be used with PyErr_SetString for now.
1864 * It is not (yet) possible to use as a py::base.
1865 * Template type argument is reserved for future use.
1866 */
1867template <typename type>
1868class exception : public object {
1869public:
Jason Rhinelander6862cb92018-04-05 11:04:15 -03001870 exception() = default;
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001871 exception(handle scope, const char *name, PyObject *base = PyExc_Exception) {
1872 std::string full_name = scope.attr("__name__").cast<std::string>() +
1873 std::string(".") + name;
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -05001874 m_ptr = PyErr_NewException(const_cast<char *>(full_name.c_str()), base, NULL);
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001875 if (hasattr(scope, name))
1876 pybind11_fail("Error during initialization: multiple incompatible "
1877 "definitions with name \"" + std::string(name) + "\"");
1878 scope.attr(name) = *this;
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001879 }
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001880
1881 // Sets the current python exception to this exception object with the given message
1882 void operator()(const char *message) {
1883 PyErr_SetString(m_ptr, message);
1884 }
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001885};
1886
Yannick Jadoulf980d762020-07-09 00:14:41 +02001887PYBIND11_NAMESPACE_BEGIN(detail)
Jason Rhinelander6862cb92018-04-05 11:04:15 -03001888// Returns a reference to a function-local static exception object used in the simple
1889// register_exception approach below. (It would be simpler to have the static local variable
1890// directly in register_exception, but that makes clang <3.5 segfault - issue #1349).
1891template <typename CppException>
1892exception<CppException> &get_exception_object() { static exception<CppException> ex; return ex; }
Yannick Jadoulf980d762020-07-09 00:14:41 +02001893PYBIND11_NAMESPACE_END(detail)
Jason Rhinelander6862cb92018-04-05 11:04:15 -03001894
Jason Rhinelander37b23832017-05-22 12:06:16 -04001895/**
1896 * Registers a Python exception in `m` of the given `name` and installs an exception translator to
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001897 * translate the C++ exception to the created Python exception using the exceptions what() method.
1898 * This is intended for simple exception translations; for more complex translation, register the
1899 * exception object and translator directly.
1900 */
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001901template <typename CppException>
1902exception<CppException> &register_exception(handle scope,
1903 const char *name,
1904 PyObject *base = PyExc_Exception) {
Jason Rhinelander6862cb92018-04-05 11:04:15 -03001905 auto &ex = detail::get_exception_object<CppException>();
1906 if (!ex) ex = exception<CppException>(scope, name, base);
1907
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001908 register_exception_translator([](std::exception_ptr p) {
1909 if (!p) return;
1910 try {
1911 std::rethrow_exception(p);
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001912 } catch (const CppException &e) {
Jason Rhinelander6862cb92018-04-05 11:04:15 -03001913 detail::get_exception_object<CppException>()(e.what());
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001914 }
1915 });
1916 return ex;
1917}
1918
Yannick Jadoulf980d762020-07-09 00:14:41 +02001919PYBIND11_NAMESPACE_BEGIN(detail)
Dean Moldovan67990d92016-08-29 18:03:34 +02001920PYBIND11_NOINLINE inline void print(tuple args, dict kwargs) {
1921 auto strings = tuple(args.size());
1922 for (size_t i = 0; i < args.size(); ++i) {
Dean Moldovane18bc022016-10-25 22:12:39 +02001923 strings[i] = str(args[i]);
Dean Moldovan67990d92016-08-29 18:03:34 +02001924 }
Dean Moldovan865e4302016-09-21 01:06:32 +02001925 auto sep = kwargs.contains("sep") ? kwargs["sep"] : cast(" ");
Dean Moldovan242b1462016-09-08 17:02:04 +02001926 auto line = sep.attr("join")(strings);
Dean Moldovan67990d92016-08-29 18:03:34 +02001927
Wenzel Jakobc49d6e52016-10-13 10:34:52 +02001928 object file;
1929 if (kwargs.contains("file")) {
1930 file = kwargs["file"].cast<object>();
1931 } else {
1932 try {
1933 file = module::import("sys").attr("stdout");
esquires67a68f12016-12-01 05:35:34 -05001934 } catch (const error_already_set &) {
Wenzel Jakobc49d6e52016-10-13 10:34:52 +02001935 /* If print() is called from code that is executed as
1936 part of garbage collection during interpreter shutdown,
1937 importing 'sys' can fail. Give up rather than crashing the
1938 interpreter in this case. */
1939 return;
1940 }
1941 }
1942
Dean Moldovan242b1462016-09-08 17:02:04 +02001943 auto write = file.attr("write");
Dean Moldovan67990d92016-08-29 18:03:34 +02001944 write(line);
Dean Moldovan865e4302016-09-21 01:06:32 +02001945 write(kwargs.contains("end") ? kwargs["end"] : cast("\n"));
Dean Moldovan67990d92016-08-29 18:03:34 +02001946
Wenzel Jakobc49d6e52016-10-13 10:34:52 +02001947 if (kwargs.contains("flush") && kwargs["flush"].cast<bool>())
Dean Moldovan242b1462016-09-08 17:02:04 +02001948 file.attr("flush")();
Dean Moldovan67990d92016-08-29 18:03:34 +02001949}
Yannick Jadoulf980d762020-07-09 00:14:41 +02001950PYBIND11_NAMESPACE_END(detail)
Dean Moldovan67990d92016-08-29 18:03:34 +02001951
1952template <return_value_policy policy = return_value_policy::automatic_reference, typename... Args>
1953void print(Args &&...args) {
1954 auto c = detail::collect_arguments<policy>(std::forward<Args>(args)...);
1955 detail::print(c.args(), c.kwargs());
1956}
1957
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001958#if defined(WITH_THREAD) && !defined(PYPY_VERSION)
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001959
1960/* The functions below essentially reproduce the PyGILState_* API using a RAII
1961 * pattern, but there are a few important differences:
1962 *
1963 * 1. When acquiring the GIL from an non-main thread during the finalization
1964 * phase, the GILState API blindly terminates the calling thread, which
1965 * is often not what is wanted. This API does not do this.
1966 *
1967 * 2. The gil_scoped_release function can optionally cut the relationship
1968 * of a PyThreadState and its associated thread, which allows moving it to
1969 * another thread (this is a fairly rare/advanced use case).
1970 *
1971 * 3. The reference count of an acquired thread state can be controlled. This
1972 * can be handy to prevent cases where callbacks issued from an external
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001973 * thread would otherwise constantly construct and destroy thread state data
1974 * structures.
Wenzel Jakob69e1a5c2016-05-26 14:29:31 +02001975 *
1976 * See the Python bindings of NanoGUI (http://github.com/wjakob/nanogui) for an
1977 * example which uses features 2 and 3 to migrate the Python thread of
1978 * execution to another thread (to run the event loop on the original thread,
1979 * in this case).
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001980 */
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001981
1982class gil_scoped_acquire {
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001983public:
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001984 PYBIND11_NOINLINE gil_scoped_acquire() {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001985 auto const &internals = detail::get_internals();
Yannick Jadoulb4719a62018-07-17 16:55:52 +02001986 tstate = (PyThreadState *) PYBIND11_TLS_GET_VALUE(internals.tstate);
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001987
1988 if (!tstate) {
Borja Zarcoe2b884c2018-12-01 08:47:40 -05001989 /* Check if the GIL was acquired using the PyGILState_* API instead (e.g. if
1990 calling from a Python thread). Since we use a different key, this ensures
1991 we don't create a new thread state and deadlock in PyEval_AcquireThread
1992 below. Note we don't save this state with internals.tstate, since we don't
1993 create it we would fail to clear it (its reference count should be > 0). */
1994 tstate = PyGILState_GetThisThreadState();
1995 }
1996
1997 if (!tstate) {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001998 tstate = PyThreadState_New(internals.istate);
1999 #if !defined(NDEBUG)
2000 if (!tstate)
2001 pybind11_fail("scoped_acquire: could not create thread state!");
2002 #endif
2003 tstate->gilstate_counter = 0;
Yannick Jadoulb4719a62018-07-17 16:55:52 +02002004 PYBIND11_TLS_REPLACE_VALUE(internals.tstate, tstate);
Wenzel Jakob39e97e62016-04-25 03:26:15 +02002005 } else {
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02002006 release = detail::get_thread_state_unchecked() != tstate;
Wenzel Jakob39e97e62016-04-25 03:26:15 +02002007 }
2008
2009 if (release) {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02002010 /* Work around an annoying assertion in PyThreadState_Swap */
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02002011 #if defined(Py_DEBUG)
2012 PyInterpreterState *interp = tstate->interp;
2013 tstate->interp = nullptr;
2014 #endif
Wenzel Jakob39e97e62016-04-25 03:26:15 +02002015 PyEval_AcquireThread(tstate);
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02002016 #if defined(Py_DEBUG)
2017 tstate->interp = interp;
2018 #endif
Wenzel Jakob39e97e62016-04-25 03:26:15 +02002019 }
2020
2021 inc_ref();
2022 }
2023
2024 void inc_ref() {
2025 ++tstate->gilstate_counter;
2026 }
2027
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02002028 PYBIND11_NOINLINE void dec_ref() {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02002029 --tstate->gilstate_counter;
2030 #if !defined(NDEBUG)
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02002031 if (detail::get_thread_state_unchecked() != tstate)
Wenzel Jakob39e97e62016-04-25 03:26:15 +02002032 pybind11_fail("scoped_acquire::dec_ref(): thread state must be current!");
2033 if (tstate->gilstate_counter < 0)
2034 pybind11_fail("scoped_acquire::dec_ref(): reference count underflow!");
2035 #endif
2036 if (tstate->gilstate_counter == 0) {
2037 #if !defined(NDEBUG)
2038 if (!release)
2039 pybind11_fail("scoped_acquire::dec_ref(): internal error!");
2040 #endif
2041 PyThreadState_Clear(tstate);
2042 PyThreadState_DeleteCurrent();
Yannick Jadoulb4719a62018-07-17 16:55:52 +02002043 PYBIND11_TLS_DELETE_VALUE(detail::get_internals().tstate);
Wenzel Jakob39e97e62016-04-25 03:26:15 +02002044 release = false;
2045 }
2046 }
2047
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02002048 PYBIND11_NOINLINE ~gil_scoped_acquire() {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02002049 dec_ref();
2050 if (release)
2051 PyEval_SaveThread();
2052 }
2053private:
2054 PyThreadState *tstate = nullptr;
2055 bool release = true;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02002056};
2057
2058class gil_scoped_release {
Wenzel Jakob38bd7112015-07-05 20:05:44 +02002059public:
Jason Rhinelander12d76602016-10-16 16:27:42 -04002060 explicit gil_scoped_release(bool disassoc = false) : disassoc(disassoc) {
Dean Moldovan2d6116b2017-06-20 23:50:51 +02002061 // `get_internals()` must be called here unconditionally in order to initialize
2062 // `internals.tstate` for subsequent `gil_scoped_acquire` calls. Otherwise, an
2063 // initialization race could occur as multiple threads try `gil_scoped_acquire`.
2064 const auto &internals = detail::get_internals();
Wenzel Jakob39e97e62016-04-25 03:26:15 +02002065 tstate = PyEval_SaveThread();
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02002066 if (disassoc) {
Dean Moldovan2d6116b2017-06-20 23:50:51 +02002067 auto key = internals.tstate;
Yannick Jadoulb4719a62018-07-17 16:55:52 +02002068 PYBIND11_TLS_DELETE_VALUE(key);
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02002069 }
Wenzel Jakob39e97e62016-04-25 03:26:15 +02002070 }
2071 ~gil_scoped_release() {
2072 if (!tstate)
2073 return;
2074 PyEval_RestoreThread(tstate);
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02002075 if (disassoc) {
Boris Schäling20ee9352016-05-28 12:26:18 +02002076 auto key = detail::get_internals().tstate;
Yannick Jadoulb4719a62018-07-17 16:55:52 +02002077 PYBIND11_TLS_REPLACE_VALUE(key, tstate);
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02002078 }
Wenzel Jakob39e97e62016-04-25 03:26:15 +02002079 }
2080private:
2081 PyThreadState *tstate;
2082 bool disassoc;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02002083};
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01002084#elif defined(PYPY_VERSION)
2085class gil_scoped_acquire {
2086 PyGILState_STATE state;
2087public:
2088 gil_scoped_acquire() { state = PyGILState_Ensure(); }
2089 ~gil_scoped_acquire() { PyGILState_Release(state); }
2090};
2091
2092class gil_scoped_release {
2093 PyThreadState *state;
2094public:
2095 gil_scoped_release() { state = PyEval_SaveThread(); }
2096 ~gil_scoped_release() { PyEval_RestoreThread(state); }
2097};
Wenzel Jakob39e97e62016-04-25 03:26:15 +02002098#else
2099class gil_scoped_acquire { };
2100class gil_scoped_release { };
Felipe Lema2547ca42016-01-25 16:22:44 -03002101#endif
Wenzel Jakob38bd7112015-07-05 20:05:44 +02002102
Wenzel Jakob8d396fc2016-11-24 23:11:02 +01002103error_already_set::~error_already_set() {
martinRenou35045ee2019-05-03 14:32:28 +02002104 if (m_type) {
Wenzel Jakob8d396fc2016-11-24 23:11:02 +01002105 gil_scoped_acquire gil;
Wenzel Jakob8b90b1d2019-07-06 14:52:32 +02002106 error_scope scope;
martinRenou35045ee2019-05-03 14:32:28 +02002107 m_type.release().dec_ref();
2108 m_value.release().dec_ref();
2109 m_trace.release().dec_ref();
Wenzel Jakob8d396fc2016-11-24 23:11:02 +01002110 }
2111}
2112
Yannick Jadould65e34d2020-09-15 14:56:20 +02002113PYBIND11_NAMESPACE_BEGIN(detail)
2114inline function get_type_override(const void *this_ptr, const type_info *this_type, const char *name) {
2115 handle self = get_object_handle(this_ptr, this_type);
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01002116 if (!self)
Wenzel Jakobac0fde92015-10-01 18:37:26 +02002117 return function();
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01002118 handle type = self.get_type();
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02002119 auto key = std::make_pair(type.ptr(), name);
2120
Yannick Jadould65e34d2020-09-15 14:56:20 +02002121 /* Cache functions that aren't overridden in Python to avoid
Wenzel Jakobf5c154a2016-04-11 18:13:08 +02002122 many costly Python dictionary lookups below */
Yannick Jadould65e34d2020-09-15 14:56:20 +02002123 auto &cache = get_internals().inactive_override_cache;
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02002124 if (cache.find(key) != cache.end())
2125 return function();
2126
Yannick Jadould65e34d2020-09-15 14:56:20 +02002127 function override = getattr(self, name, function());
2128 if (override.is_cpp_function()) {
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02002129 cache.insert(key);
2130 return function();
2131 }
Wenzel Jakob27e8e102016-01-17 22:36:37 +01002132
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01002133 /* Don't call dispatch code if invoked from overridden function.
2134 Unfortunately this doesn't work on PyPy. */
2135#if !defined(PYPY_VERSION)
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02002136 PyFrameObject *frame = PyThreadState_Get()->frame;
Dean Moldovane18bc022016-10-25 22:12:39 +02002137 if (frame && (std::string) str(frame->f_code->co_name) == name &&
Wenzel Jakobf5c154a2016-04-11 18:13:08 +02002138 frame->f_code->co_argcount > 0) {
2139 PyFrame_FastToLocals(frame);
2140 PyObject *self_caller = PyDict_GetItem(
2141 frame->f_locals, PyTuple_GET_ITEM(frame->f_code->co_varnames, 0));
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01002142 if (self_caller == self.ptr())
Wenzel Jakobf5c154a2016-04-11 18:13:08 +02002143 return function();
2144 }
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01002145#else
2146 /* PyPy currently doesn't provide a detailed cpyext emulation of
2147 frame objects, so we have to emulate this using Python. This
2148 is going to be slow..*/
2149 dict d; d["self"] = self; d["name"] = pybind11::str(name);
2150 PyObject *result = PyRun_String(
2151 "import inspect\n"
2152 "frame = inspect.currentframe()\n"
2153 "if frame is not None:\n"
2154 " frame = frame.f_back\n"
2155 " if frame is not None and str(frame.f_code.co_name) == name and "
2156 "frame.f_code.co_argcount > 0:\n"
2157 " self_caller = frame.f_locals[frame.f_code.co_varnames[0]]\n"
2158 " if self_caller == self:\n"
2159 " self = None\n",
2160 Py_file_input, d.ptr(), d.ptr());
2161 if (result == nullptr)
2162 throw error_already_set();
Dean Moldovan36f0a152017-02-08 01:01:56 +01002163 if (d["self"].is_none())
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01002164 return function();
2165 Py_DECREF(result);
2166#endif
2167
Yannick Jadould65e34d2020-09-15 14:56:20 +02002168 return override;
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02002169}
Yannick Jadould65e34d2020-09-15 14:56:20 +02002170PYBIND11_NAMESPACE_END(detail)
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02002171
Ivor Wanders2b045752019-06-10 16:12:28 -04002172/** \rst
2173 Try to retrieve a python method by the provided name from the instance pointed to by the this_ptr.
2174
Yannick Jadould65e34d2020-09-15 14:56:20 +02002175 :this_ptr: The pointer to the object the overriden method should be retrieved for. This should be
2176 the first non-trampoline class encountered in the inheritance chain.
2177 :name: The name of the overridden Python method to retrieve.
Ivor Wanders2b045752019-06-10 16:12:28 -04002178 :return: The Python method by this name from the object or an empty function wrapper.
2179 \endrst */
Yannick Jadould65e34d2020-09-15 14:56:20 +02002180template <class T> function get_override(const T *this_ptr, const char *name) {
Ivan Smirnov8f3e0452016-10-23 15:43:03 +01002181 auto tinfo = detail::get_type_info(typeid(T));
Yannick Jadould65e34d2020-09-15 14:56:20 +02002182 return tinfo ? detail::get_type_override(this_ptr, tinfo, name) : function();
Jason Rhinelander1b05ce52016-08-09 17:57:59 -04002183}
2184
Yannick Jadould65e34d2020-09-15 14:56:20 +02002185#define PYBIND11_OVERRIDE_IMPL(ret_type, cname, name, ...) \
2186 do { \
Wenzel Jakob8f4eb002015-10-15 18:13:33 +02002187 pybind11::gil_scoped_acquire gil; \
Yannick Jadould65e34d2020-09-15 14:56:20 +02002188 pybind11::function override = pybind11::get_override(static_cast<const cname *>(this), name); \
2189 if (override) { \
2190 auto o = override(__VA_ARGS__); \
Jason Rhinelander7dfb9322016-09-08 14:49:43 -04002191 if (pybind11::detail::cast_is_temporary_value_reference<ret_type>::value) { \
Yannick Jadould65e34d2020-09-15 14:56:20 +02002192 static pybind11::detail::override_caster_t<ret_type> caster; \
Jason Rhinelander3e4fe6c2016-09-11 12:17:41 -04002193 return pybind11::detail::cast_ref<ret_type>(std::move(o), caster); \
Jason Rhinelander7dfb9322016-09-08 14:49:43 -04002194 } \
2195 else return pybind11::detail::cast_safe<ret_type>(std::move(o)); \
2196 } \
Yannick Jadould65e34d2020-09-15 14:56:20 +02002197 } while (false)
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02002198
Ivor Wanders2b045752019-06-10 16:12:28 -04002199/** \rst
2200 Macro to populate the virtual method in the trampoline class. This macro tries to look up a method named 'fn'
2201 from the Python side, deals with the :ref:`gil` and necessary argument conversions to call this method and return
2202 the appropriate type. See :ref:`overriding_virtuals` for more information. This macro should be used when the method
2203 name in C is not the same as the method name in Python. For example with `__str__`.
2204
2205 .. code-block:: cpp
2206
2207 std::string toString() override {
Yannick Jadould65e34d2020-09-15 14:56:20 +02002208 PYBIND11_OVERRIDE_NAME(
Ivor Wanders2b045752019-06-10 16:12:28 -04002209 std::string, // Return type (ret_type)
2210 Animal, // Parent class (cname)
methylDragond96c3452020-06-16 03:34:45 +08002211 "__str__", // Name of method in Python (name)
2212 toString, // Name of function in C++ (fn)
Ivor Wanders2b045752019-06-10 16:12:28 -04002213 );
2214 }
2215\endrst */
Yannick Jadould65e34d2020-09-15 14:56:20 +02002216#define PYBIND11_OVERRIDE_NAME(ret_type, cname, name, fn, ...) \
2217 do { \
2218 PYBIND11_OVERRIDE_IMPL(PYBIND11_TYPE(ret_type), PYBIND11_TYPE(cname), name, __VA_ARGS__); \
2219 return cname::fn(__VA_ARGS__); \
2220 } while (false)
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02002221
Ivor Wanders2b045752019-06-10 16:12:28 -04002222/** \rst
Yannick Jadould65e34d2020-09-15 14:56:20 +02002223 Macro for pure virtual functions, this function is identical to :c:macro:`PYBIND11_OVERRIDE_NAME`, except that it
2224 throws if no override can be found.
Ivor Wanders2b045752019-06-10 16:12:28 -04002225\endrst */
Yannick Jadould65e34d2020-09-15 14:56:20 +02002226#define PYBIND11_OVERRIDE_PURE_NAME(ret_type, cname, name, fn, ...) \
2227 do { \
2228 PYBIND11_OVERRIDE_IMPL(PYBIND11_TYPE(ret_type), PYBIND11_TYPE(cname), name, __VA_ARGS__); \
2229 pybind11::pybind11_fail("Tried to call pure virtual function \"" PYBIND11_STRINGIFY(cname) "::" name "\""); \
2230 } while (false)
Wenzel Jakob1e3be732016-05-24 23:42:05 +02002231
Ivor Wanders2b045752019-06-10 16:12:28 -04002232/** \rst
2233 Macro to populate the virtual method in the trampoline class. This macro tries to look up the method
2234 from the Python side, deals with the :ref:`gil` and necessary argument conversions to call this method and return
2235 the appropriate type. This macro should be used if the method name in C and in Python are identical.
2236 See :ref:`overriding_virtuals` for more information.
2237
2238 .. code-block:: cpp
2239
2240 class PyAnimal : public Animal {
2241 public:
2242 // Inherit the constructors
2243 using Animal::Animal;
2244
2245 // Trampoline (need one for each virtual function)
2246 std::string go(int n_times) override {
Yannick Jadould65e34d2020-09-15 14:56:20 +02002247 PYBIND11_OVERRIDE_PURE(
Ivor Wanders2b045752019-06-10 16:12:28 -04002248 std::string, // Return type (ret_type)
2249 Animal, // Parent class (cname)
2250 go, // Name of function in C++ (must match Python name) (fn)
2251 n_times // Argument(s) (...)
2252 );
2253 }
2254 };
2255\endrst */
Yannick Jadould65e34d2020-09-15 14:56:20 +02002256#define PYBIND11_OVERRIDE(ret_type, cname, fn, ...) \
2257 PYBIND11_OVERRIDE_NAME(PYBIND11_TYPE(ret_type), PYBIND11_TYPE(cname), #fn, fn, __VA_ARGS__)
Wenzel Jakob1e3be732016-05-24 23:42:05 +02002258
Ivor Wanders2b045752019-06-10 16:12:28 -04002259/** \rst
Yannick Jadould65e34d2020-09-15 14:56:20 +02002260 Macro for pure virtual functions, this function is identical to :c:macro:`PYBIND11_OVERRIDE`, except that it throws
2261 if no override can be found.
Ivor Wanders2b045752019-06-10 16:12:28 -04002262\endrst */
Yannick Jadould65e34d2020-09-15 14:56:20 +02002263#define PYBIND11_OVERRIDE_PURE(ret_type, cname, fn, ...) \
2264 PYBIND11_OVERRIDE_PURE_NAME(PYBIND11_TYPE(ret_type), PYBIND11_TYPE(cname), #fn, fn, __VA_ARGS__)
2265
2266
2267// Deprecated versions
2268
2269PYBIND11_DEPRECATED("get_type_overload has been deprecated")
2270inline function get_type_overload(const void *this_ptr, const detail::type_info *this_type, const char *name) {
2271 return detail::get_type_override(this_ptr, this_type, name);
2272}
2273
2274template <class T>
2275inline function get_overload(const T *this_ptr, const char *name) {
2276 return get_override(this_ptr, name);
2277}
2278
2279#define PYBIND11_OVERLOAD_INT(ret_type, cname, name, ...) \
2280 PYBIND11_OVERRIDE_IMPL(PYBIND11_TYPE(ret_type), PYBIND11_TYPE(cname), name, __VA_ARGS__)
2281#define PYBIND11_OVERLOAD_NAME(ret_type, cname, name, fn, ...) \
2282 PYBIND11_OVERRIDE_NAME(PYBIND11_TYPE(ret_type), PYBIND11_TYPE(cname), name, fn, __VA_ARGS__)
2283#define PYBIND11_OVERLOAD_PURE_NAME(ret_type, cname, name, fn, ...) \
2284 PYBIND11_OVERRIDE_PURE_NAME(PYBIND11_TYPE(ret_type), PYBIND11_TYPE(cname), name, fn, __VA_ARGS__);
2285#define PYBIND11_OVERLOAD(ret_type, cname, fn, ...) \
2286 PYBIND11_OVERRIDE(PYBIND11_TYPE(ret_type), PYBIND11_TYPE(cname), fn, __VA_ARGS__)
Wenzel Jakob1e3be732016-05-24 23:42:05 +02002287#define PYBIND11_OVERLOAD_PURE(ret_type, cname, fn, ...) \
Yannick Jadould65e34d2020-09-15 14:56:20 +02002288 PYBIND11_OVERRIDE_PURE(PYBIND11_TYPE(ret_type), PYBIND11_TYPE(cname), fn, __VA_ARGS__);
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02002289
Yannick Jadoulf980d762020-07-09 00:14:41 +02002290PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
Wenzel Jakob38bd7112015-07-05 20:05:44 +02002291
Baljak81da9882018-11-20 23:22:02 +01002292#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
Wenzel Jakob48548ea2016-01-17 22:36:44 +01002293# pragma warning(pop)
Wenzel Jakob6d252962016-05-01 20:47:49 +02002294#elif defined(__GNUG__) && !defined(__clang__)
Wenzel Jakob48548ea2016-01-17 22:36:44 +01002295# pragma GCC diagnostic pop
Wenzel Jakob38bd7112015-07-05 20:05:44 +02002296#endif