blob: 30c6917022923af7d932324af225cea22d33f854 [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
13#if defined(_MSC_VER)
Wenzel Jakob48548ea2016-01-17 22:36:44 +010014# pragma warning(push)
Wenzel Jakob1ffce742016-08-25 01:43:33 +020015# pragma warning(disable: 4100) // warning C4100: Unreferenced formal parameter
Wenzel Jakob48548ea2016-01-17 22:36:44 +010016# pragma warning(disable: 4127) // warning C4127: Conditional expression is constant
Wenzel Jakob1ffce742016-08-25 01:43:33 +020017# pragma warning(disable: 4512) // warning C4512: Assignment operator was implicitly defined as deleted
Wenzel Jakob48548ea2016-01-17 22:36:44 +010018# pragma warning(disable: 4800) // warning C4800: 'int': forcing value to bool 'true' or 'false' (performance warning)
19# 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 +090020# pragma warning(disable: 4702) // warning C4702: unreachable code
Dean Moldovan2bab5792016-09-23 00:27:59 +020021# pragma warning(disable: 4522) // warning C4522: multiple assignment operators specified
Wenzel Jakob1ffce742016-08-25 01:43:33 +020022#elif defined(__INTEL_COMPILER)
Ben Pritchard33f34302016-02-18 15:25:51 -050023# pragma warning(push)
Dean Moldovan706a7d92017-07-04 01:27:18 +020024# pragma warning(disable: 68) // integer conversion resulted in a change of sign
Wenzel Jakob1ffce742016-08-25 01:43:33 +020025# pragma warning(disable: 186) // pointless comparison of unsigned integer with zero
Dean Moldovan706a7d92017-07-04 01:27:18 +020026# pragma warning(disable: 878) // incompatible exception specifications
Wenzel Jakob1ffce742016-08-25 01:43:33 +020027# pragma warning(disable: 1334) // the "template" keyword used for syntactic disambiguation may only be used within a template
Dean Moldovan706a7d92017-07-04 01:27:18 +020028# pragma warning(disable: 1682) // implicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
29# pragma warning(disable: 1875) // offsetof applied to non-POD (Plain Old Data) types is nonstandard
Wenzel Jakob1ffce742016-08-25 01:43:33 +020030# pragma warning(disable: 2196) // warning #2196: routine is both "inline" and "noinline"
Wenzel Jakob6d252962016-05-01 20:47:49 +020031#elif defined(__GNUG__) && !defined(__clang__)
Wenzel Jakob48548ea2016-01-17 22:36:44 +010032# pragma GCC diagnostic push
33# pragma GCC diagnostic ignored "-Wunused-but-set-parameter"
34# pragma GCC diagnostic ignored "-Wunused-but-set-variable"
35# pragma GCC diagnostic ignored "-Wmissing-field-initializers"
Wenzel Jakobdeeab552016-05-15 23:54:34 +020036# pragma GCC diagnostic ignored "-Wstrict-aliasing"
37# pragma GCC diagnostic ignored "-Wattributes"
Jason Rhinelanderd15b2172017-05-09 14:46:15 -040038# if __GNUC__ >= 7
39# pragma GCC diagnostic ignored "-Wnoexcept-type"
40# endif
Wenzel Jakob38bd7112015-07-05 20:05:44 +020041#endif
42
Wenzel Jakob48548ea2016-01-17 22:36:44 +010043#include "attr.h"
Alexander Stukowski9a110e62016-11-15 12:38:05 +010044#include "options.h"
Dean Moldovanf5806492017-08-14 00:35:53 +020045#include "detail/class.h"
Jason Rhinelander464d9892017-06-12 21:52:48 -040046#include "detail/init.h"
Wenzel Jakob38bd7112015-07-05 20:05:44 +020047
Jason Rhinelandera859dd62017-08-10 12:03:29 -040048NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
Wenzel Jakob38bd7112015-07-05 20:05:44 +020049
Wenzel Jakobd4258ba2015-07-26 16:33:49 +020050/// Wraps an arbitrary C++ function/method/lambda function/.. into a callable Python object
Wenzel Jakobbd4a5292015-07-11 17:41:48 +020051class cpp_function : public function {
Wenzel Jakobd4258ba2015-07-26 16:33:49 +020052public:
Wenzel Jakobbd4a5292015-07-11 17:41:48 +020053 cpp_function() { }
Wenzel Jakob38bd7112015-07-05 20:05:44 +020054
Wenzel Jakob5984baa2016-05-10 15:05:03 +010055 /// Construct a cpp_function from a vanilla function pointer
Jason Rhinelander1d7998e2017-02-17 06:56:41 -050056 template <typename Return, typename... Args, typename... Extra>
57 cpp_function(Return (*f)(Args...), const Extra&... extra) {
Wenzel Jakob5984baa2016-05-10 15:05:03 +010058 initialize(f, f, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +020059 }
Wenzel Jakobd4258ba2015-07-26 16:33:49 +020060
Wenzel Jakob5984baa2016-05-10 15:05:03 +010061 /// Construct a cpp_function from a lambda function (possibly with internal state)
Jason Rhinelanderb4bf5ed2017-05-10 01:51:08 -040062 template <typename Func, typename... Extra,
63 typename = detail::enable_if_t<detail::is_lambda<Func>::value>>
Jason Rhinelander1d7998e2017-02-17 06:56:41 -050064 cpp_function(Func &&f, const Extra&... extra) {
Wenzel Jakob71867832015-07-29 17:43:52 +020065 initialize(std::forward<Func>(f),
Jason Rhinelanderb4bf5ed2017-05-10 01:51:08 -040066 (detail::function_signature_t<Func> *) nullptr, extra...);
Wenzel Jakobd4258ba2015-07-26 16:33:49 +020067 }
68
Wenzel Jakob5984baa2016-05-10 15:05:03 +010069 /// Construct a cpp_function from a class method (non-const)
Jason Rhinelander1d7998e2017-02-17 06:56:41 -050070 template <typename Return, typename Class, typename... Arg, typename... Extra>
71 cpp_function(Return (Class::*f)(Arg...), const Extra&... extra) {
Wenzel Jakob71867832015-07-29 17:43:52 +020072 initialize([f](Class *c, Arg... args) -> Return { return (c->*f)(args...); },
Jason Rhinelander1d7998e2017-02-17 06:56:41 -050073 (Return (*) (Class *, Arg...)) nullptr, extra...);
Wenzel Jakobd4258ba2015-07-26 16:33:49 +020074 }
75
Wenzel Jakob5984baa2016-05-10 15:05:03 +010076 /// Construct a cpp_function from a class method (const)
Jason Rhinelander1d7998e2017-02-17 06:56:41 -050077 template <typename Return, typename Class, typename... Arg, typename... Extra>
78 cpp_function(Return (Class::*f)(Arg...) const, const Extra&... extra) {
Wenzel Jakob71867832015-07-29 17:43:52 +020079 initialize([f](const Class *c, Arg... args) -> Return { return (c->*f)(args...); },
Jason Rhinelander1d7998e2017-02-17 06:56:41 -050080 (Return (*)(const Class *, Arg ...)) nullptr, extra...);
Wenzel Jakobd4258ba2015-07-26 16:33:49 +020081 }
82
Wenzel Jakob57082212015-09-04 23:42:12 +020083 /// Return the function name
Wenzel Jakob48548ea2016-01-17 22:36:44 +010084 object name() const { return attr("__name__"); }
Wenzel Jakob57082212015-09-04 23:42:12 +020085
Wenzel Jakobd561cb02016-01-17 22:36:41 +010086protected:
Wenzel Jakob382484a2016-09-10 15:28:37 +090087 /// Space optimization: don't inline this frequently instantiated fragment
88 PYBIND11_NOINLINE detail::function_record *make_function_record() {
89 return new detail::function_record();
90 }
91
Wenzel Jakobd561cb02016-01-17 22:36:41 +010092 /// Special internal constructor for functors, lambda functions, etc.
Jason Rhinelander1d7998e2017-02-17 06:56:41 -050093 template <typename Func, typename Return, typename... Args, typename... Extra>
94 void initialize(Func &&f, Return (*)(Args...), const Extra&... extra) {
Dean Moldovan56613942017-07-02 12:52:00 +020095 using namespace detail;
Jason Rhinelander129a7252017-03-26 00:01:52 -030096 struct capture { detail::remove_reference_t<Func> f; };
Wenzel Jakobd4258ba2015-07-26 16:33:49 +020097
Wenzel Jakobd561cb02016-01-17 22:36:41 +010098 /* Store the function including any extra state it might have (e.g. a lambda capture object) */
Wenzel Jakob382484a2016-09-10 15:28:37 +090099 auto rec = make_function_record();
Wenzel Jakob71867832015-07-29 17:43:52 +0200100
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100101 /* Store the capture object directly in the function record if there is enough space */
102 if (sizeof(capture) <= sizeof(rec->data)) {
Wenzel Jakob954b7932016-07-10 10:13:18 +0200103 /* Without these pragmas, GCC warns that there might not be
104 enough space to use the placement new operator. However, the
105 'if' statement above ensures that this is the case. */
Jason Rhinelander0b12f912016-07-07 16:26:04 -0400106#if defined(__GNUG__) && !defined(__clang__) && __GNUC__ >= 6
Jason Rhinelandercae0e002016-07-07 16:11:42 -0400107# pragma GCC diagnostic push
108# pragma GCC diagnostic ignored "-Wplacement-new"
109#endif
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100110 new ((capture *) &rec->data) capture { std::forward<Func>(f) };
Jason Rhinelander0b12f912016-07-07 16:26:04 -0400111#if defined(__GNUG__) && !defined(__clang__) && __GNUC__ >= 6
Jason Rhinelandercae0e002016-07-07 16:11:42 -0400112# pragma GCC diagnostic pop
113#endif
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100114 if (!std::is_trivially_destructible<Func>::value)
115 rec->free_data = [](detail::function_record *r) { ((capture *) &r->data)->~capture(); };
116 } else {
117 rec->data[0] = new capture { std::forward<Func>(f) };
118 rec->free_data = [](detail::function_record *r) { delete ((capture *) r->data[0]); };
119 }
Wenzel Jakob19208fe2015-10-13 17:37:25 +0200120
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100121 /* Type casters for the function arguments and return value */
Dean Moldovan719c1732016-11-27 18:19:34 +0100122 using cast_in = detail::argument_loader<Args...>;
123 using cast_out = detail::make_caster<
124 detail::conditional_t<std::is_void<Return>::value, detail::void_type, Return>
125 >;
Wenzel Jakob71867832015-07-29 17:43:52 +0200126
Jason Rhinelander2686da82017-01-21 23:42:14 -0500127 static_assert(detail::expected_num_args<Extra...>(sizeof...(Args), cast_in::has_args, cast_in::has_kwargs),
Jason Rhinelander0f5ec0a2017-03-19 12:36:18 -0300128 "The number of argument annotations does not match the number of function arguments");
Jason Rhinelander2686da82017-01-21 23:42:14 -0500129
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100130 /* Dispatch code which converts function arguments and performs the actual function call */
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500131 rec->impl = [](detail::function_call &call) -> handle {
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100132 cast_in args_converter;
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100133
134 /* Try to cast the function arguments into the C++ domain */
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500135 if (!args_converter.load_args(call))
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100136 return PYBIND11_TRY_NEXT_OVERLOAD;
137
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100138 /* Invoke call policy pre-call hook */
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500139 detail::process_attributes<Extra...>::precall(call);
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100140
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100141 /* Get a pointer to the capture object */
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500142 auto data = (sizeof(capture) <= sizeof(call.func.data)
143 ? &call.func.data : call.func.data[0]);
144 capture *cap = const_cast<capture *>(reinterpret_cast<const capture *>(data));
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100145
Jason Rhinelander546f6fc2017-01-20 00:59:26 -0500146 /* Override policy for rvalues -- usually to enforce rvp::move on an rvalue */
147 const auto policy = detail::return_value_policy_override<Return>::policy(call.func.policy);
Dean Moldovand079f412016-11-20 05:31:02 +0100148
Dean Moldovan1ac19032017-03-16 11:22:26 +0100149 /* Function scope guard -- defaults to the compile-to-nothing `void_type` */
150 using Guard = detail::extract_guard_t<Extra...>;
151
Wenzel Jakob954b7932016-07-10 10:13:18 +0200152 /* Perform the function call */
Jason Rhinelander813d7e82017-05-14 15:57:26 -0400153 handle result = cast_out::cast(
154 std::move(args_converter).template call<Return, Guard>(cap->f), policy, call.parent);
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100155
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100156 /* Invoke call policy post-call hook */
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500157 detail::process_attributes<Extra...>::postcall(call, result);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100158
Wenzel Jakob5f218b32016-01-17 22:36:39 +0100159 return result;
Wenzel Jakob71867832015-07-29 17:43:52 +0200160 };
161
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100162 /* Process any user-provided function attributes */
163 detail::process_attributes<Extra...>::init(extra..., rec);
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100164
165 /* Generate a readable signature describing the function's arguments and return value types */
Dean Moldovan56613942017-07-02 12:52:00 +0200166 static constexpr auto signature = _("(") + cast_in::arg_names + _(") -> ") + cast_out::name;
167 PYBIND11_DESCR_CONSTEXPR auto types = decltype(signature)::types();
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100168
169 /* Register the function with Python from generic (non-templated) code */
Dean Moldovan56613942017-07-02 12:52:00 +0200170 initialize_generic(rec, signature.text, types.data(), sizeof...(Args));
Wenzel Jakob178c8a82016-05-10 15:59:01 +0100171
172 if (cast_in::has_args) rec->has_args = true;
173 if (cast_in::has_kwargs) rec->has_kwargs = true;
Wenzel Jakob954b7932016-07-10 10:13:18 +0200174
175 /* Stash some additional information used by an important optimization in 'functional.h' */
Jason Rhinelander1d7998e2017-02-17 06:56:41 -0500176 using FunctionType = Return (*)(Args...);
Wenzel Jakob954b7932016-07-10 10:13:18 +0200177 constexpr bool is_function_ptr =
178 std::is_convertible<Func, FunctionType>::value &&
179 sizeof(capture) == sizeof(void *);
180 if (is_function_ptr) {
181 rec->is_stateless = true;
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500182 rec->data[1] = const_cast<void *>(reinterpret_cast<const void *>(&typeid(FunctionType)));
Wenzel Jakob954b7932016-07-10 10:13:18 +0200183 }
Wenzel Jakob281aa0e2015-07-30 15:29:00 +0200184 }
185
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100186 /// Register a function call with Python (generic non-templated code goes here)
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100187 void initialize_generic(detail::function_record *rec, const char *text,
Dean Moldovanecced6c2016-07-31 20:03:18 +0200188 const std::type_info *const *types, size_t args) {
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100189
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100190 /* Create copies of all referenced C-style strings */
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100191 rec->name = strdup(rec->name ? rec->name : "");
192 if (rec->doc) rec->doc = strdup(rec->doc);
193 for (auto &a: rec->args) {
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100194 if (a.name)
195 a.name = strdup(a.name);
196 if (a.descr)
197 a.descr = strdup(a.descr);
198 else if (a.value)
Dean Moldovan242b1462016-09-08 17:02:04 +0200199 a.descr = strdup(a.value.attr("__repr__")().cast<std::string>().c_str());
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100200 }
Wenzel Jakob954b7932016-07-10 10:13:18 +0200201
Jason Rhinelander464d9892017-06-12 21:52:48 -0400202 rec->is_constructor = !strcmp(rec->name, "__init__") || !strcmp(rec->name, "__setstate__");
203
Dean Moldovanb8c5dbd2017-08-24 02:46:07 +0200204#if !defined(NDEBUG) && !defined(PYBIND11_DISABLE_NEW_STYLE_INIT_WARNING)
205 if (rec->is_constructor && !rec->is_new_style_constructor) {
206 const auto class_name = std::string(((PyTypeObject *) rec->scope.ptr())->tp_name);
207 const auto func_name = std::string(rec->name);
208 PyErr_WarnEx(
209 PyExc_FutureWarning,
210 ("pybind11-bound class '" + class_name + "' is using an old-style "
211 "placement-new '" + func_name + "' which has been deprecated. See "
212 "the upgrade guide in pybind11's docs. This message is only visible "
213 "when compiled in debug mode.").c_str(), 0
214 );
215 }
216#endif
217
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100218 /* Generate a proper function signature */
219 std::string signature;
Dean Moldovan0aef6422017-08-31 14:38:23 +0200220 size_t type_index = 0, arg_index = 0;
221 for (auto *pc = text; *pc != '\0'; ++pc) {
222 const auto c = *pc;
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100223
224 if (c == '{') {
Dean Moldovan0aef6422017-08-31 14:38:23 +0200225 // Write arg name for everything except *args and **kwargs.
226 if (*(pc + 1) == '*')
227 continue;
228
229 if (arg_index < rec->args.size() && rec->args[arg_index].name) {
230 signature += rec->args[arg_index].name;
231 } else if (arg_index == 0 && rec->is_method) {
232 signature += "self";
233 } else {
234 signature += "arg" + std::to_string(arg_index - (rec->is_method ? 1 : 0));
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100235 }
Dean Moldovan0aef6422017-08-31 14:38:23 +0200236 signature += ": ";
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100237 } else if (c == '}') {
Dean Moldovan0aef6422017-08-31 14:38:23 +0200238 // Write default value if available.
239 if (arg_index < rec->args.size() && rec->args[arg_index].descr) {
240 signature += "=";
241 signature += rec->args[arg_index].descr;
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100242 }
Dean Moldovan0aef6422017-08-31 14:38:23 +0200243 arg_index++;
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100244 } else if (c == '%') {
245 const std::type_info *t = types[type_index++];
Wenzel Jakobb2c2c792016-01-17 22:36:40 +0100246 if (!t)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100247 pybind11_fail("Internal error while parsing type signature (1)");
Ivan Smirnov8f3e0452016-10-23 15:43:03 +0100248 if (auto tinfo = detail::get_type_info(*t)) {
Jason Rhinelander71178922017-11-07 12:33:05 -0400249 handle th((PyObject *) tinfo->type);
250 signature +=
251 th.attr("__module__").cast<std::string>() + "." +
252 th.attr("__qualname__").cast<std::string>(); // Python 3.3+, but we backport it to earlier versions
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200253 } else if (rec->is_new_style_constructor && arg_index == 0) {
254 // A new-style `__init__` takes `self` as `value_and_holder`.
255 // Rewrite it to the proper class type.
Jason Rhinelander71178922017-11-07 12:33:05 -0400256 signature +=
257 rec->scope.attr("__module__").cast<std::string>() + "." +
258 rec->scope.attr("__qualname__").cast<std::string>();
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100259 } else {
260 std::string tname(t->name());
261 detail::clean_type_id(tname);
262 signature += tname;
263 }
264 } else {
265 signature += c;
266 }
267 }
Dean Moldovan0aef6422017-08-31 14:38:23 +0200268 if (arg_index != args || types[type_index] != nullptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100269 pybind11_fail("Internal error while parsing type signature (2)");
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100270
Wenzel Jakob57082212015-09-04 23:42:12 +0200271#if PY_MAJOR_VERSION < 3
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100272 if (strcmp(rec->name, "__next__") == 0) {
273 std::free(rec->name);
274 rec->name = strdup("next");
Wenzel Jakobd1bfc4e2016-05-16 18:52:46 +0200275 } else if (strcmp(rec->name, "__bool__") == 0) {
276 std::free(rec->name);
277 rec->name = strdup("__nonzero__");
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100278 }
Wenzel Jakob57082212015-09-04 23:42:12 +0200279#endif
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100280 rec->signature = strdup(signature.c_str());
281 rec->args.shrink_to_fit();
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500282 rec->nargs = (std::uint16_t) args;
Wenzel Jakobbd4a5292015-07-11 17:41:48 +0200283
Jason Rhinelander0a90b2d2017-04-16 20:30:52 -0400284 if (rec->sibling && PYBIND11_INSTANCE_METHOD_CHECK(rec->sibling.ptr()))
285 rec->sibling = PYBIND11_INSTANCE_METHOD_GET_FUNCTION(rec->sibling.ptr());
Wenzel Jakob57082212015-09-04 23:42:12 +0200286
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100287 detail::function_record *chain = nullptr, *chain_start = rec;
Jason Rhinelander6873c202016-10-24 21:58:22 -0400288 if (rec->sibling) {
289 if (PyCFunction_Check(rec->sibling.ptr())) {
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100290 auto rec_capsule = reinterpret_borrow<capsule>(PyCFunction_GET_SELF(rec->sibling.ptr()));
Jason Rhinelander6873c202016-10-24 21:58:22 -0400291 chain = (detail::function_record *) rec_capsule;
292 /* Never append a method to an overload chain of a parent class;
293 instead, hide the parent's overloads in this case */
Dean Moldovan36f0a152017-02-08 01:01:56 +0100294 if (!chain->scope.is(rec->scope))
Jason Rhinelander6873c202016-10-24 21:58:22 -0400295 chain = nullptr;
296 }
297 // Don't trigger for things like the default __init__, which are wrapper_descriptors that we are intentionally replacing
298 else if (!rec->sibling.is_none() && rec->name[0] != '_')
299 pybind11_fail("Cannot overload existing non-function object \"" + std::string(rec->name) +
300 "\" with a function of the same name");
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +0200301 }
302
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100303 if (!chain) {
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100304 /* No existing overload was found, create a new function object */
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100305 rec->def = new PyMethodDef();
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500306 std::memset(rec->def, 0, sizeof(PyMethodDef));
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100307 rec->def->ml_name = rec->name;
308 rec->def->ml_meth = reinterpret_cast<PyCFunction>(*dispatcher);
309 rec->def->ml_flags = METH_VARARGS | METH_KEYWORDS;
Wenzel Jakoba6501792016-02-04 23:02:07 +0100310
Wenzel Jakobb16421e2017-03-22 22:04:00 +0100311 capsule rec_capsule(rec, [](void *ptr) {
312 destruct((detail::function_record *) ptr);
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100313 });
Wenzel Jakoba6501792016-02-04 23:02:07 +0100314
315 object scope_module;
316 if (rec->scope) {
Dean Moldovan865e4302016-09-21 01:06:32 +0200317 if (hasattr(rec->scope, "__module__")) {
318 scope_module = rec->scope.attr("__module__");
319 } else if (hasattr(rec->scope, "__name__")) {
320 scope_module = rec->scope.attr("__name__");
321 }
Wenzel Jakoba6501792016-02-04 23:02:07 +0100322 }
323
324 m_ptr = PyCFunction_NewEx(rec->def, rec_capsule.ptr(), scope_module.ptr());
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200325 if (!m_ptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100326 pybind11_fail("cpp_function::cpp_function(): Could not allocate function object");
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200327 } else {
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100328 /* Append at the end of the overload chain */
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100329 m_ptr = rec->sibling.ptr();
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200330 inc_ref();
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100331 chain_start = chain;
Jason Rhinelanderd355f2f2017-04-16 22:31:13 -0400332 if (chain->is_method != rec->is_method)
333 pybind11_fail("overloading a method with both static and instance methods is not supported; "
334 #if defined(NDEBUG)
335 "compile in debug mode for more details"
336 #else
337 "error while attempting to bind " + std::string(rec->is_method ? "instance" : "static") + " method " +
338 std::string(pybind11::str(rec->scope.attr("__name__"))) + "." + std::string(rec->name) + signature
339 #endif
340 );
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100341 while (chain->next)
342 chain = chain->next;
343 chain->next = rec;
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200344 }
Wenzel Jakob281aa0e2015-07-30 15:29:00 +0200345
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200346 std::string signatures;
Wenzel Jakob71867832015-07-29 17:43:52 +0200347 int index = 0;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100348 /* Create a nice pydoc rec including all signatures and
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100349 docstrings of the functions in the overload chain */
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100350 if (chain && options::show_function_signatures()) {
Sylvain Corlay0e04fdf2016-03-08 16:42:12 -0500351 // First a generic signature
352 signatures += rec->name;
353 signatures += "(*args, **kwargs)\n";
354 signatures += "Overloaded function.\n\n";
355 }
356 // Then specific overload signatures
Jason Rhinelander10d13042017-03-08 12:32:42 -0500357 bool first_user_def = true;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100358 for (auto it = chain_start; it != nullptr; it = it->next) {
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100359 if (options::show_function_signatures()) {
Jason Rhinelander10d13042017-03-08 12:32:42 -0500360 if (index > 0) signatures += "\n";
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100361 if (chain)
362 signatures += std::to_string(++index) + ". ";
363 signatures += rec->name;
364 signatures += it->signature;
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100365 signatures += "\n";
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100366 }
367 if (it->doc && strlen(it->doc) > 0 && options::show_user_defined_docstrings()) {
Jason Rhinelander10d13042017-03-08 12:32:42 -0500368 // If we're appending another docstring, and aren't printing function signatures, we
369 // need to append a newline first:
370 if (!options::show_function_signatures()) {
371 if (first_user_def) first_user_def = false;
372 else signatures += "\n";
373 }
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100374 if (options::show_function_signatures()) signatures += "\n";
Wenzel Jakob218b6ce2016-02-28 23:52:37 +0100375 signatures += it->doc;
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100376 if (options::show_function_signatures()) signatures += "\n";
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100377 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200378 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100379
380 /* Install docstring */
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200381 PyCFunctionObject *func = (PyCFunctionObject *) m_ptr;
382 if (func->m_ml->ml_doc)
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500383 std::free(const_cast<char *>(func->m_ml->ml_doc));
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200384 func->m_ml->ml_doc = strdup(signatures.c_str());
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100385
Wenzel Jakob31fbf182016-11-20 05:27:05 +0100386 if (rec->is_method) {
387 m_ptr = PYBIND11_INSTANCE_METHOD_NEW(m_ptr, rec->scope.ptr());
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200388 if (!m_ptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100389 pybind11_fail("cpp_function::cpp_function(): Could not allocate instance method object");
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200390 Py_DECREF(func);
391 }
392 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100393
394 /// When a cpp_function is GCed, release any memory allocated by pybind11
395 static void destruct(detail::function_record *rec) {
396 while (rec) {
397 detail::function_record *next = rec->next;
398 if (rec->free_data)
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100399 rec->free_data(rec);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100400 std::free((char *) rec->name);
401 std::free((char *) rec->doc);
402 std::free((char *) rec->signature);
403 for (auto &arg: rec->args) {
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500404 std::free(const_cast<char *>(arg.name));
405 std::free(const_cast<char *>(arg.descr));
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100406 arg.value.dec_ref();
407 }
408 if (rec->def) {
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500409 std::free(const_cast<char *>(rec->def->ml_doc));
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100410 delete rec->def;
411 }
412 delete rec;
413 rec = next;
414 }
415 }
416
417 /// Main dispatch logic for calls to functions bound using pybind11
Jason Rhinelander2686da82017-01-21 23:42:14 -0500418 static PyObject *dispatcher(PyObject *self, PyObject *args_in, PyObject *kwargs_in) {
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500419 using namespace detail;
420
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100421 /* Iterator over the list of potentially admissible overloads */
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500422 function_record *overloads = (function_record *) PyCapsule_GetPointer(self, nullptr),
423 *it = overloads;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100424
425 /* Need to know how many arguments + keyword arguments there are to pick the right overload */
Jason Rhinelander2686da82017-01-21 23:42:14 -0500426 const size_t n_args_in = (size_t) PyTuple_GET_SIZE(args_in);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100427
Jason Rhinelander2686da82017-01-21 23:42:14 -0500428 handle parent = n_args_in > 0 ? PyTuple_GET_ITEM(args_in, 0) : nullptr,
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100429 result = PYBIND11_TRY_NEXT_OVERLOAD;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500430
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200431 auto self_value_and_holder = value_and_holder();
432 if (overloads->is_constructor) {
433 const auto tinfo = get_type_info((PyTypeObject *) overloads->scope.ptr());
434 const auto pi = reinterpret_cast<instance *>(parent.ptr());
435 self_value_and_holder = pi->get_value_and_holder(tinfo, false);
436
437 if (!self_value_and_holder.type || !self_value_and_holder.inst) {
438 PyErr_SetString(PyExc_TypeError, "__init__(self, ...) called with invalid `self` argument");
439 return nullptr;
440 }
441
442 // If this value is already registered it must mean __init__ is invoked multiple times;
443 // we really can't support that in C++, so just ignore the second __init__.
444 if (self_value_and_holder.instance_registered())
445 return none().release().ptr();
446 }
447
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100448 try {
Jason Rhinelandere5505892017-02-03 18:25:34 -0500449 // We do this in two passes: in the first pass, we load arguments with `convert=false`;
450 // in the second, we allow conversion (except for arguments with an explicit
451 // py::arg().noconvert()). This lets us prefer calls without conversion, with
452 // conversion as a fallback.
453 std::vector<function_call> second_pass;
454
455 // However, if there are no overloads, we can just skip the no-convert pass entirely
456 const bool overloaded = it != nullptr && it->next != nullptr;
457
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100458 for (; it != nullptr; it = it->next) {
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500459
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100460 /* For each overload:
Jason Rhinelander2686da82017-01-21 23:42:14 -0500461 1. Copy all positional arguments we were given, also checking to make sure that
462 named positional arguments weren't *also* specified via kwarg.
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100463 2. If we weren't given enough, try to make up the omitted ones by checking
Jason Rhinelander2686da82017-01-21 23:42:14 -0500464 whether they were provided by a kwarg matching the `py::arg("name")` name. If
465 so, use it (and remove it from kwargs; if not, see if the function binding
466 provided a default that we can use.
467 3. Ensure that either all keyword arguments were "consumed", or that the function
468 takes a kwargs argument to accept unconsumed kwargs.
469 4. Any positional arguments still left get put into a tuple (for args), and any
470 leftover kwargs get put into a dict.
471 5. Pack everything into a vector; if we have py::args or py::kwargs, they are an
472 extra tuple or dict at the end of the positional arguments.
473 6. Call the function call dispatcher (function_record::impl)
474
475 If one of these fail, move on to the next overload and keep trying until we get a
476 result other than PYBIND11_TRY_NEXT_OVERLOAD.
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100477 */
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100478
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500479 function_record &func = *it;
480 size_t pos_args = func.nargs; // Number of positional arguments that we need
481 if (func.has_args) --pos_args; // (but don't count py::args
482 if (func.has_kwargs) --pos_args; // or py::kwargs)
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100483
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500484 if (!func.has_args && n_args_in > pos_args)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500485 continue; // Too many arguments for this overload
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100486
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500487 if (n_args_in < pos_args && func.args.size() < pos_args)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500488 continue; // Not enough arguments given, and not enough defaults to fill in the blanks
489
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500490 function_call call(func, parent);
Jason Rhinelander2686da82017-01-21 23:42:14 -0500491
492 size_t args_to_copy = std::min(pos_args, n_args_in);
493 size_t args_copied = 0;
494
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200495 // 0. Inject new-style `self` argument
496 if (func.is_new_style_constructor) {
497 // The `value` may have been preallocated by an old-style `__init__`
498 // if it was a preceding candidate for overload resolution.
499 if (self_value_and_holder)
500 self_value_and_holder.type->dealloc(self_value_and_holder);
501
Dean Moldovan7939f4b2017-09-04 13:49:19 +0200502 call.init_self = PyTuple_GET_ITEM(args_in, 0);
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200503 call.args.push_back(reinterpret_cast<PyObject *>(&self_value_and_holder));
504 call.args_convert.push_back(false);
505 ++args_copied;
506 }
507
Jason Rhinelander2686da82017-01-21 23:42:14 -0500508 // 1. Copy any position arguments given.
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400509 bool bad_arg = false;
Jason Rhinelander2686da82017-01-21 23:42:14 -0500510 for (; args_copied < args_to_copy; ++args_copied) {
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400511 argument_record *arg_rec = args_copied < func.args.size() ? &func.args[args_copied] : nullptr;
512 if (kwargs_in && arg_rec && arg_rec->name && PyDict_GetItemString(kwargs_in, arg_rec->name)) {
513 bad_arg = true;
Jason Rhinelandercaa13792017-02-23 19:54:53 -0500514 break;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100515 }
Jason Rhinelander2686da82017-01-21 23:42:14 -0500516
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400517 handle arg(PyTuple_GET_ITEM(args_in, args_copied));
518 if (arg_rec && !arg_rec->none && arg.is_none()) {
519 bad_arg = true;
520 break;
521 }
522 call.args.push_back(arg);
523 call.args_convert.push_back(arg_rec ? arg_rec->convert : true);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100524 }
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400525 if (bad_arg)
Jason Rhinelandercaa13792017-02-23 19:54:53 -0500526 continue; // Maybe it was meant for another overload (issue #688)
Wenzel Jakobbd57eb42016-05-01 14:42:20 +0200527
Jason Rhinelander2686da82017-01-21 23:42:14 -0500528 // We'll need to copy this if we steal some kwargs for defaults
529 dict kwargs = reinterpret_borrow<dict>(kwargs_in);
530
531 // 2. Check kwargs and, failing that, defaults that may help complete the list
532 if (args_copied < pos_args) {
533 bool copied_kwargs = false;
534
535 for (; args_copied < pos_args; ++args_copied) {
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500536 const auto &arg = func.args[args_copied];
Jason Rhinelander2686da82017-01-21 23:42:14 -0500537
538 handle value;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500539 if (kwargs_in && arg.name)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500540 value = PyDict_GetItemString(kwargs.ptr(), arg.name);
541
542 if (value) {
543 // Consume a kwargs value
544 if (!copied_kwargs) {
545 kwargs = reinterpret_steal<dict>(PyDict_Copy(kwargs.ptr()));
546 copied_kwargs = true;
547 }
548 PyDict_DelItemString(kwargs.ptr(), arg.name);
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100549 } else if (arg.value) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500550 value = arg.value;
551 }
552
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500553 if (value) {
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500554 call.args.push_back(value);
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500555 call.args_convert.push_back(arg.convert);
556 }
Jason Rhinelander2686da82017-01-21 23:42:14 -0500557 else
558 break;
559 }
560
561 if (args_copied < pos_args)
562 continue; // Not enough arguments, defaults, or kwargs to fill the positional arguments
563 }
564
565 // 3. Check everything was consumed (unless we have a kwargs arg)
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500566 if (kwargs && kwargs.size() > 0 && !func.has_kwargs)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500567 continue; // Unconsumed kwargs, but no py::kwargs argument to accept them
568
569 // 4a. If we have a py::args argument, create a new tuple with leftovers
570 tuple extra_args;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500571 if (func.has_args) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500572 if (args_to_copy == 0) {
573 // We didn't copy out any position arguments from the args_in tuple, so we
574 // can reuse it directly without copying:
575 extra_args = reinterpret_borrow<tuple>(args_in);
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100576 } else if (args_copied >= n_args_in) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500577 extra_args = tuple(0);
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100578 } else {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500579 size_t args_size = n_args_in - args_copied;
580 extra_args = tuple(args_size);
581 for (size_t i = 0; i < args_size; ++i) {
582 handle item = PyTuple_GET_ITEM(args_in, args_copied + i);
583 extra_args[i] = item.inc_ref().ptr();
584 }
585 }
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500586 call.args.push_back(extra_args);
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500587 call.args_convert.push_back(false);
Jason Rhinelander2686da82017-01-21 23:42:14 -0500588 }
589
590 // 4b. If we have a py::kwargs, pass on any remaining kwargs
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500591 if (func.has_kwargs) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500592 if (!kwargs.ptr())
593 kwargs = dict(); // If we didn't get one, send an empty one
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500594 call.args.push_back(kwargs);
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500595 call.args_convert.push_back(false);
Jason Rhinelander2686da82017-01-21 23:42:14 -0500596 }
597
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500598 // 5. Put everything in a vector. Not technically step 5, we've been building it
599 // in `call.args` all along.
600 #if !defined(NDEBUG)
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500601 if (call.args.size() != func.nargs || call.args_convert.size() != func.nargs)
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500602 pybind11_fail("Internal error: function call dispatcher inserted wrong number of arguments!");
603 #endif
Jason Rhinelander2686da82017-01-21 23:42:14 -0500604
Jason Rhinelandere5505892017-02-03 18:25:34 -0500605 std::vector<bool> second_pass_convert;
606 if (overloaded) {
607 // We're in the first no-convert pass, so swap out the conversion flags for a
608 // set of all-false flags. If the call fails, we'll swap the flags back in for
609 // the conversion-allowed call below.
610 second_pass_convert.resize(func.nargs, false);
611 call.args_convert.swap(second_pass_convert);
612 }
613
Jason Rhinelander2686da82017-01-21 23:42:14 -0500614 // 6. Call the function.
Wenzel Jakobbd57eb42016-05-01 14:42:20 +0200615 try {
Dean Moldovanaf2dda32017-06-26 20:34:06 +0200616 loader_life_support guard{};
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500617 result = func.impl(call);
Wenzel Jakob00062592016-07-01 16:07:35 +0200618 } catch (reference_cast_error &) {
Wenzel Jakobbd57eb42016-05-01 14:42:20 +0200619 result = PYBIND11_TRY_NEXT_OVERLOAD;
620 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100621
622 if (result.ptr() != PYBIND11_TRY_NEXT_OVERLOAD)
623 break;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500624
Jason Rhinelandere5505892017-02-03 18:25:34 -0500625 if (overloaded) {
626 // The (overloaded) call failed; if the call has at least one argument that
627 // permits conversion (i.e. it hasn't been explicitly specified `.noconvert()`)
628 // then add this call to the list of second pass overloads to try.
629 for (size_t i = func.is_method ? 1 : 0; i < pos_args; i++) {
630 if (second_pass_convert[i]) {
631 // Found one: swap the converting flags back in and store the call for
632 // the second pass.
633 call.args_convert.swap(second_pass_convert);
634 second_pass.push_back(std::move(call));
635 break;
636 }
637 }
638 }
639 }
640
641 if (overloaded && !second_pass.empty() && result.ptr() == PYBIND11_TRY_NEXT_OVERLOAD) {
642 // The no-conversion pass finished without success, try again with conversion allowed
643 for (auto &call : second_pass) {
644 try {
Dean Moldovanaf2dda32017-06-26 20:34:06 +0200645 loader_life_support guard{};
Jason Rhinelandere5505892017-02-03 18:25:34 -0500646 result = call.func.impl(call);
647 } catch (reference_cast_error &) {
648 result = PYBIND11_TRY_NEXT_OVERLOAD;
649 }
650
651 if (result.ptr() != PYBIND11_TRY_NEXT_OVERLOAD)
652 break;
653 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100654 }
Dean Moldovan135ba8d2016-09-10 11:58:02 +0200655 } catch (error_already_set &e) {
656 e.restore();
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400657 return nullptr;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100658 } catch (...) {
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400659 /* When an exception is caught, give each registered exception
660 translator a chance to translate it to a Python exception
661 in reverse order of registration.
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200662
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400663 A translator may choose to do one of the following:
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200664
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400665 - catch the exception and call PyErr_SetString or PyErr_SetObject
666 to set a standard (or custom) Python exception, or
667 - do nothing and let the exception fall through to the next translator, or
668 - delegate translation to the next translator by throwing a new type of exception. */
669
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200670 auto last_exception = std::current_exception();
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500671 auto &registered_exception_translators = get_internals().registered_exception_translators;
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400672 for (auto& translator : registered_exception_translators) {
673 try {
674 translator(last_exception);
675 } catch (...) {
676 last_exception = std::current_exception();
677 continue;
678 }
679 return nullptr;
680 }
681 PyErr_SetString(PyExc_SystemError, "Exception escaped from default exception translator!");
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100682 return nullptr;
683 }
684
Dean Moldovan2b4477e2017-09-09 20:21:34 +0200685 auto append_note_if_missing_header_is_suspected = [](std::string &msg) {
686 if (msg.find("std::") != std::string::npos) {
687 msg += "\n\n"
688 "Did you forget to `#include <pybind11/stl.h>`? Or <pybind11/complex.h>,\n"
689 "<pybind11/functional.h>, <pybind11/chrono.h>, etc. Some automatic\n"
690 "conversions are optional and require extra headers to be included\n"
691 "when compiling your pybind11 module.";
692 }
693 };
694
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100695 if (result.ptr() == PYBIND11_TRY_NEXT_OVERLOAD) {
Wenzel Jakob382484a2016-09-10 15:28:37 +0900696 if (overloads->is_operator)
697 return handle(Py_NotImplemented).inc_ref().ptr();
698
Wenzel Jakobe99ebae2016-09-12 11:44:37 +0900699 std::string msg = std::string(overloads->name) + "(): incompatible " +
700 std::string(overloads->is_constructor ? "constructor" : "function") +
701 " arguments. The following argument types are supported:\n";
702
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100703 int ctr = 0;
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500704 for (function_record *it2 = overloads; it2 != nullptr; it2 = it2->next) {
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100705 msg += " "+ std::to_string(++ctr) + ". ";
Jason Rhinelander4e45e182016-07-17 17:43:00 -0400706
707 bool wrote_sig = false;
708 if (overloads->is_constructor) {
Dean Moldovanecced6c2016-07-31 20:03:18 +0200709 // For a constructor, rewrite `(self: Object, arg0, ...) -> NoneType` as `Object(arg0, ...)`
Jason Rhinelander4e45e182016-07-17 17:43:00 -0400710 std::string sig = it2->signature;
Dean Moldovanecced6c2016-07-31 20:03:18 +0200711 size_t start = sig.find('(') + 7; // skip "(self: "
Jason Rhinelander4e45e182016-07-17 17:43:00 -0400712 if (start < sig.size()) {
713 // End at the , for the next argument
714 size_t end = sig.find(", "), next = end + 2;
715 size_t ret = sig.rfind(" -> ");
716 // Or the ), if there is no comma:
717 if (end >= sig.size()) next = end = sig.find(')');
718 if (start < end && next < sig.size()) {
719 msg.append(sig, start, end - start);
720 msg += '(';
721 msg.append(sig, next, ret - next);
722 wrote_sig = true;
723 }
724 }
725 }
726 if (!wrote_sig) msg += it2->signature;
727
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100728 msg += "\n";
729 }
Wenzel Jakobe99ebae2016-09-12 11:44:37 +0900730 msg += "\nInvoked with: ";
Jason Rhinelander2686da82017-01-21 23:42:14 -0500731 auto args_ = reinterpret_borrow<tuple>(args_in);
Jason Rhinelander231e1672017-02-23 21:04:46 -0500732 bool some_args = false;
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200733 for (size_t ti = overloads->is_constructor ? 1 : 0; ti < args_.size(); ++ti) {
Jason Rhinelander231e1672017-02-23 21:04:46 -0500734 if (!some_args) some_args = true;
735 else msg += ", ";
Jason Rhinelander7146d622016-11-22 05:28:40 -0500736 msg += pybind11::repr(args_[ti]);
Andreas Bergmeier16d43942016-05-24 09:19:35 +0200737 }
Jason Rhinelander231e1672017-02-23 21:04:46 -0500738 if (kwargs_in) {
739 auto kwargs = reinterpret_borrow<dict>(kwargs_in);
740 if (kwargs.size() > 0) {
741 if (some_args) msg += "; ";
742 msg += "kwargs: ";
743 bool first = true;
744 for (auto kwarg : kwargs) {
745 if (first) first = false;
746 else msg += ", ";
747 msg += pybind11::str("{}={!r}").format(kwarg.first, kwarg.second);
748 }
749 }
750 }
751
Dean Moldovan2b4477e2017-09-09 20:21:34 +0200752 append_note_if_missing_header_is_suspected(msg);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100753 PyErr_SetString(PyExc_TypeError, msg.c_str());
754 return nullptr;
755 } else if (!result) {
756 std::string msg = "Unable to convert function return value to a "
757 "Python type! The signature was\n\t";
758 msg += it->signature;
Dean Moldovan2b4477e2017-09-09 20:21:34 +0200759 append_note_if_missing_header_is_suspected(msg);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100760 PyErr_SetString(PyExc_TypeError, msg.c_str());
761 return nullptr;
762 } else {
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200763 if (overloads->is_constructor && !self_value_and_holder.holder_constructed()) {
Jason Rhinelander464d9892017-06-12 21:52:48 -0400764 auto *pi = reinterpret_cast<instance *>(parent.ptr());
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200765 self_value_and_holder.type->init_instance(pi, nullptr);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100766 }
767 return result.ptr();
768 }
769 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200770};
771
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100772/// Wrapper for Python extension modules
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200773class module : public object {
774public:
Wenzel Jakobb1b71402015-10-18 16:48:30 +0200775 PYBIND11_OBJECT_DEFAULT(module, object, PyModule_Check)
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200776
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100777 /// Create a new top-level Python module with the given name and docstring
Jason Rhinelander12d76602016-10-16 16:27:42 -0400778 explicit module(const char *name, const char *doc = nullptr) {
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100779 if (!options::show_user_defined_docstrings()) doc = nullptr;
Wenzel Jakob57082212015-09-04 23:42:12 +0200780#if PY_MAJOR_VERSION >= 3
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200781 PyModuleDef *def = new PyModuleDef();
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500782 std::memset(def, 0, sizeof(PyModuleDef));
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200783 def->m_name = name;
784 def->m_doc = doc;
785 def->m_size = -1;
786 Py_INCREF(def);
787 m_ptr = PyModule_Create(def);
Wenzel Jakob57082212015-09-04 23:42:12 +0200788#else
789 m_ptr = Py_InitModule3(name, nullptr, doc);
790#endif
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200791 if (m_ptr == nullptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100792 pybind11_fail("Internal error in module::module()");
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200793 inc_ref();
794 }
795
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100796 /** \rst
797 Create Python binding for a new function within the module scope. ``Func``
798 can be a plain C++ function, a function pointer, or a lambda function. For
799 details on the ``Extra&& ... extra`` argument, see section :ref:`extras`.
800 \endrst */
Wenzel Jakob71867832015-07-29 17:43:52 +0200801 template <typename Func, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100802 module &def(const char *name_, Func &&f, const Extra& ... extra) {
Dean Moldovan865e4302016-09-21 01:06:32 +0200803 cpp_function func(std::forward<Func>(f), name(name_), scope(*this),
804 sibling(getattr(*this, name_, none())), extra...);
Jason Rhinelander6873c202016-10-24 21:58:22 -0400805 // NB: allow overwriting here because cpp_function sets up a chain with the intention of
806 // overwriting (and has already checked internally that it isn't overwriting non-functions).
807 add_object(name_, func, true /* overwrite */);
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200808 return *this;
809 }
810
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100811 /** \rst
812 Create and return a new Python submodule with the given name and docstring.
813 This also works recursively, i.e.
814
815 .. code-block:: cpp
816
817 py::module m("example", "pybind11 example plugin");
818 py::module m2 = m.def_submodule("sub", "A submodule of 'example'");
819 py::module m3 = m2.def_submodule("subsub", "A submodule of 'example.sub'");
820 \endrst */
Wenzel Jakobbd4a5292015-07-11 17:41:48 +0200821 module def_submodule(const char *name, const char *doc = nullptr) {
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200822 std::string full_name = std::string(PyModule_GetName(m_ptr))
823 + std::string(".") + std::string(name);
Dean Moldovanc7ac16b2016-10-28 03:08:15 +0200824 auto result = reinterpret_borrow<module>(PyImport_AddModule(full_name.c_str()));
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100825 if (doc && options::show_user_defined_docstrings())
Wenzel Jakob8f4eb002015-10-15 18:13:33 +0200826 result.attr("__doc__") = pybind11::str(doc);
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200827 attr(name) = result;
828 return result;
829 }
Wenzel Jakobdb028d62015-10-13 23:44:25 +0200830
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100831 /// Import and return a module or throws `error_already_set`.
Wenzel Jakobdb028d62015-10-13 23:44:25 +0200832 static module import(const char *name) {
Wenzel Jakobdd57a342015-12-26 14:04:52 +0100833 PyObject *obj = PyImport_ImportModule(name);
834 if (!obj)
esquires67a68f12016-12-01 05:35:34 -0500835 throw error_already_set();
Dean Moldovanc7ac16b2016-10-28 03:08:15 +0200836 return reinterpret_steal<module>(obj);
Wenzel Jakobdb028d62015-10-13 23:44:25 +0200837 }
Jason Rhinelander6873c202016-10-24 21:58:22 -0400838
Gunnar Läthénc64e6b12017-09-12 08:05:05 +0200839 /// Reload the module or throws `error_already_set`.
840 void reload() {
841 PyObject *obj = PyImport_ReloadModule(ptr());
842 if (!obj)
843 throw error_already_set();
844 *this = reinterpret_steal<module>(obj);
845 }
846
Jason Rhinelander6873c202016-10-24 21:58:22 -0400847 // Adds an object to the module using the given name. Throws if an object with the given name
848 // already exists.
849 //
850 // overwrite should almost always be false: attempting to overwrite objects that pybind11 has
851 // established will, in most cases, break things.
Wenzel Jakobaa1b3162017-03-30 11:59:32 +0200852 PYBIND11_NOINLINE void add_object(const char *name, handle obj, bool overwrite = false) {
Jason Rhinelander6873c202016-10-24 21:58:22 -0400853 if (!overwrite && hasattr(*this, name))
854 pybind11_fail("Error during initialization: multiple incompatible definitions with name \"" +
855 std::string(name) + "\"");
856
Wenzel Jakobaa1b3162017-03-30 11:59:32 +0200857 PyModule_AddObject(ptr(), name, obj.inc_ref().ptr() /* steals a reference */);
Jason Rhinelander6873c202016-10-24 21:58:22 -0400858 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200859};
860
Dean Moldovan22c413b2017-03-30 00:20:42 +0200861/// \ingroup python_builtins
Dean Moldovan1d3c4bc2017-06-06 17:05:19 +0200862/// Return a dictionary representing the global variables in the current execution frame,
863/// or ``__main__.__dict__`` if there is no frame (usually when the interpreter is embedded).
864inline dict globals() {
865 PyObject *p = PyEval_GetGlobals();
866 return reinterpret_borrow<dict>(p ? p : module::import("__main__").attr("__dict__").ptr());
867}
Dean Moldovan22c413b2017-03-30 00:20:42 +0200868
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200869NAMESPACE_BEGIN(detail)
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100870/// Generic support for creating new Python heap types
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100871class generic_type : public object {
Jason Rhinelander5fffe202016-09-06 12:17:06 -0400872 template <typename...> friend class class_;
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200873public:
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100874 PYBIND11_OBJECT_DEFAULT(generic_type, object, PyType_Check)
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100875protected:
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100876 void initialize(const type_record &rec) {
877 if (rec.scope && hasattr(rec.scope, rec.name))
878 pybind11_fail("generic_type: cannot initialize type \"" + std::string(rec.name) +
879 "\": an object with that name is already defined");
Wenzel Jakob38d8b8c2016-05-31 09:53:28 +0200880
Jason Rhinelander5e14aa62017-08-17 11:38:05 -0400881 if (rec.module_local ? get_local_type_info(*rec.type) : get_global_type_info(*rec.type))
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100882 pybind11_fail("generic_type: type \"" + std::string(rec.name) +
Wenzel Jakob38d8b8c2016-05-31 09:53:28 +0200883 "\" is already registered!");
884
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100885 m_ptr = make_new_python_type(rec);
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200886
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100887 /* Register supplemental type information in C++ dict */
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100888 auto *tinfo = new detail::type_info();
889 tinfo->type = (PyTypeObject *) m_ptr;
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400890 tinfo->cpptype = rec.type;
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100891 tinfo->type_size = rec.type_size;
Dean Moldovan0d765f42017-03-21 01:15:20 +0100892 tinfo->operator_new = rec.operator_new;
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500893 tinfo->holder_size_in_ptrs = size_in_ptrs(rec.holder_size);
Jason Rhinelander353615f2017-07-25 00:53:23 -0400894 tinfo->init_instance = rec.init_instance;
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100895 tinfo->dealloc = rec.dealloc;
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400896 tinfo->simple_type = true;
897 tinfo->simple_ancestors = true;
Jason Rhinelander7437c692017-07-28 22:03:44 -0400898 tinfo->default_holder = rec.default_holder;
899 tinfo->module_local = rec.module_local;
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100900
901 auto &internals = get_internals();
902 auto tindex = std::type_index(*rec.type);
Ivan Smirnova6e6a8b2016-10-23 15:27:13 +0100903 tinfo->direct_conversions = &internals.direct_conversions[tindex];
Jason Rhinelander7437c692017-07-28 22:03:44 -0400904 if (rec.module_local)
905 registered_local_types_cpp()[tindex] = tinfo;
906 else
907 internals.registered_types_cpp[tindex] = tinfo;
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500908 internals.registered_types_py[(PyTypeObject *) m_ptr] = { tinfo };
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100909
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400910 if (rec.bases.size() > 1 || rec.multiple_inheritance) {
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100911 mark_parents_nonsimple(tinfo->type);
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400912 tinfo->simple_ancestors = false;
913 }
914 else if (rec.bases.size() == 1) {
915 auto parent_tinfo = get_type_info((PyTypeObject *) rec.bases[0].ptr());
916 tinfo->simple_ancestors = parent_tinfo->simple_ancestors;
917 }
Jason Rhinelander5e14aa62017-08-17 11:38:05 -0400918
919 if (rec.module_local) {
920 // Stash the local typeinfo and loader so that external modules can access it.
921 tinfo->module_local_load = &type_caster_generic::local_load;
Dean Moldovan96997a42017-08-20 17:14:09 +0200922 setattr(m_ptr, PYBIND11_MODULE_LOCAL_ID, capsule(tinfo));
Jason Rhinelander5e14aa62017-08-17 11:38:05 -0400923 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200924 }
925
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +0900926 /// Helper function which tags all parents of a type using mult. inheritance
927 void mark_parents_nonsimple(PyTypeObject *value) {
Dean Moldovanc7ac16b2016-10-28 03:08:15 +0200928 auto t = reinterpret_borrow<tuple>(value->tp_bases);
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +0900929 for (handle h : t) {
930 auto tinfo2 = get_type_info((PyTypeObject *) h.ptr());
931 if (tinfo2)
932 tinfo2->simple_type = false;
933 mark_parents_nonsimple((PyTypeObject *) h.ptr());
934 }
935 }
936
Wenzel Jakob43398a82015-07-28 16:12:20 +0200937 void install_buffer_funcs(
938 buffer_info *(*get_buffer)(PyObject *, void *),
939 void *get_buffer_data) {
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200940 PyHeapTypeObject *type = (PyHeapTypeObject*) m_ptr;
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100941 auto tinfo = detail::get_type_info(&type->ht_type);
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100942
943 if (!type->ht_type.tp_as_buffer)
944 pybind11_fail(
945 "To be able to register buffer protocol support for the type '" +
946 std::string(tinfo->type->tp_name) +
947 "' the associated class<>(..) invocation must "
948 "include the pybind11::buffer_protocol() annotation!");
949
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100950 tinfo->get_buffer = get_buffer;
951 tinfo->get_buffer_data = get_buffer_data;
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200952 }
953
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100954 void def_property_static_impl(const char *name,
955 handle fget, handle fset,
956 detail::function_record *rec_fget) {
Dean Moldovanc91f8bd2017-02-13 18:11:24 +0100957 const auto is_static = !(rec_fget->is_method && rec_fget->scope);
958 const auto has_doc = rec_fget->doc && pybind11::options::show_user_defined_docstrings();
959
Dean Moldovanc91f8bd2017-02-13 18:11:24 +0100960 auto property = handle((PyObject *) (is_static ? get_internals().static_property_type
961 : &PyProperty_Type));
962 attr(name) = property(fget.ptr() ? fget : none(),
963 fset.ptr() ? fset : none(),
964 /*deleter*/none(),
965 pybind11::str(has_doc ? rec_fget->doc : ""));
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100966 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200967};
Jason Rhinelander6b52c832016-09-06 12:27:00 -0400968
Dean Moldovan0d765f42017-03-21 01:15:20 +0100969/// Set the pointer to operator new if it exists. The cast is needed because it can be overloaded.
970template <typename T, typename = void_t<decltype(static_cast<void *(*)(size_t)>(T::operator new))>>
971void set_operator_new(type_record *r) { r->operator_new = &T::operator new; }
972
973template <typename> void set_operator_new(...) { }
974
Jason Rhinelandera03408c2017-07-23 00:32:58 -0400975template <typename T, typename SFINAE = void> struct has_operator_delete : std::false_type { };
976template <typename T> struct has_operator_delete<T, void_t<decltype(static_cast<void (*)(void *)>(T::operator delete))>>
977 : std::true_type { };
978template <typename T, typename SFINAE = void> struct has_operator_delete_size : std::false_type { };
979template <typename T> struct has_operator_delete_size<T, void_t<decltype(static_cast<void (*)(void *, size_t)>(T::operator delete))>>
980 : std::true_type { };
Dean Moldovan0d765f42017-03-21 01:15:20 +0100981/// Call class-specific delete if it exists or global otherwise. Can also be an overload set.
Jason Rhinelandera03408c2017-07-23 00:32:58 -0400982template <typename T, enable_if_t<has_operator_delete<T>::value, int> = 0>
983void call_operator_delete(T *p, size_t) { T::operator delete(p); }
984template <typename T, enable_if_t<!has_operator_delete<T>::value && has_operator_delete_size<T>::value, int> = 0>
985void call_operator_delete(T *p, size_t s) { T::operator delete(p, s); }
Dean Moldovan0d765f42017-03-21 01:15:20 +0100986
Jason Rhinelandera03408c2017-07-23 00:32:58 -0400987inline void call_operator_delete(void *p, size_t) { ::operator delete(p); }
Dean Moldovan0d765f42017-03-21 01:15:20 +0100988
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200989NAMESPACE_END(detail)
990
Jason Rhinelander23bf8942017-05-16 11:07:28 -0400991/// Given a pointer to a member function, cast it to its `Derived` version.
992/// Forward everything else unchanged.
993template <typename /*Derived*/, typename F>
994auto method_adaptor(F &&f) -> decltype(std::forward<F>(f)) { return std::forward<F>(f); }
995
996template <typename Derived, typename Return, typename Class, typename... Args>
Jason Rhinelander76722922017-10-03 10:09:49 -0300997auto method_adaptor(Return (Class::*pmf)(Args...)) -> Return (Derived::*)(Args...) {
998 static_assert(detail::is_accessible_base_of<Class, Derived>::value,
999 "Cannot bind an inaccessible base class method; use a lambda definition instead");
1000 return pmf;
1001}
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001002
1003template <typename Derived, typename Return, typename Class, typename... Args>
Jason Rhinelander76722922017-10-03 10:09:49 -03001004auto method_adaptor(Return (Class::*pmf)(Args...) const) -> Return (Derived::*)(Args...) const {
1005 static_assert(detail::is_accessible_base_of<Class, Derived>::value,
1006 "Cannot bind an inaccessible base class method; use a lambda definition instead");
1007 return pmf;
1008}
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001009
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001010template <typename type_, typename... options>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001011class class_ : public detail::generic_type {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001012 template <typename T> using is_holder = detail::is_holder_type<type_, T>;
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001013 template <typename T> using is_subtype = detail::is_strict_base_of<type_, T>;
1014 template <typename T> using is_base = detail::is_strict_base_of<T, type_>;
Jason Rhinelanderfa5d05e2016-12-12 18:11:49 -05001015 // struct instead of using here to help MSVC:
1016 template <typename T> struct is_valid_class_option :
1017 detail::any_of<is_holder<T>, is_subtype<T>, is_base<T>> {};
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001018
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001019public:
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001020 using type = type_;
Dean Moldovan82ece942017-03-29 11:55:18 +02001021 using type_alias = detail::exactly_one_t<is_subtype, void, options...>;
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001022 constexpr static bool has_alias = !std::is_void<type_alias>::value;
Dean Moldovan82ece942017-03-29 11:55:18 +02001023 using holder_type = detail::exactly_one_t<is_holder, std::unique_ptr<type>, options...>;
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001024
Jason Rhinelanderfa5d05e2016-12-12 18:11:49 -05001025 static_assert(detail::all_of<is_valid_class_option<options>...>::value,
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001026 "Unknown/invalid class_ template parameters provided");
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001027
Jason Rhinelander42e5ddc2017-06-12 21:48:36 -04001028 static_assert(!has_alias || std::is_polymorphic<type>::value,
1029 "Cannot use an alias class with a non-polymorphic type");
1030
Dean Moldovanc7ac16b2016-10-28 03:08:15 +02001031 PYBIND11_OBJECT(class_, generic_type, PyType_Check)
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001032
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001033 template <typename... Extra>
1034 class_(handle scope, const char *name, const Extra &... extra) {
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001035 using namespace detail;
1036
1037 // MI can only be specified via class_ template options, not constructor parameters
1038 static_assert(
1039 none_of<is_pyobject<Extra>...>::value || // no base class arguments, or:
1040 ( constexpr_sum(is_pyobject<Extra>::value...) == 1 && // Exactly one base
1041 constexpr_sum(is_base<options>::value...) == 0 && // no template option bases
1042 none_of<std::is_same<multiple_inheritance, Extra>...>::value), // no multiple_inheritance attr
1043 "Error: multiple inheritance bases must be specified via class_ template options");
1044
1045 type_record record;
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001046 record.scope = scope;
1047 record.name = name;
1048 record.type = &typeid(type);
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001049 record.type_size = sizeof(conditional_t<has_alias, type_alias, type>);
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001050 record.holder_size = sizeof(holder_type);
Jason Rhinelander353615f2017-07-25 00:53:23 -04001051 record.init_instance = init_instance;
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001052 record.dealloc = dealloc;
Pim Schellartcc88aae2017-01-31 10:52:11 -05001053 record.default_holder = std::is_same<holder_type, std::unique_ptr<type>>::value;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001054
Dean Moldovan0d765f42017-03-21 01:15:20 +01001055 set_operator_new<type>(&record);
1056
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001057 /* Register base classes specified via template arguments to class_, if any */
Jason Rhinelander926e2cf2017-03-25 22:41:06 -03001058 PYBIND11_EXPAND_SIDE_EFFECTS(add_base<options>(record));
Jason Rhinelander6b52c832016-09-06 12:27:00 -04001059
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001060 /* Process optional arguments, if any */
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001061 process_attributes<Extra...>::init(extra..., &record);
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001062
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001063 generic_type::initialize(record);
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001064
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001065 if (has_alias) {
Jason Rhinelander7437c692017-07-28 22:03:44 -04001066 auto &instances = record.module_local ? registered_local_types_cpp() : get_internals().registered_types_cpp;
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001067 instances[std::type_index(typeid(type_alias))] = instances[std::type_index(typeid(type))];
1068 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001069 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001070
Wenzel Jakobc1fc27e2016-09-13 00:36:43 +09001071 template <typename Base, detail::enable_if_t<is_base<Base>::value, int> = 0>
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001072 static void add_base(detail::type_record &rec) {
Jason Rhinelander21966962017-06-21 13:38:10 -04001073 rec.add_base(typeid(Base), [](void *src) -> void * {
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001074 return static_cast<Base *>(reinterpret_cast<type *>(src));
1075 });
1076 }
1077
Wenzel Jakobc1fc27e2016-09-13 00:36:43 +09001078 template <typename Base, detail::enable_if_t<!is_base<Base>::value, int> = 0>
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001079 static void add_base(detail::type_record &) { }
1080
Wenzel Jakob71867832015-07-29 17:43:52 +02001081 template <typename Func, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001082 class_ &def(const char *name_, Func&& f, const Extra&... extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001083 cpp_function cf(method_adaptor<type>(std::forward<Func>(f)), name(name_), is_method(*this),
Dean Moldovan865e4302016-09-21 01:06:32 +02001084 sibling(getattr(*this, name_, none())), extra...);
Wenzel Jakob57082212015-09-04 23:42:12 +02001085 attr(cf.name()) = cf;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001086 return *this;
1087 }
1088
Wenzel Jakob71867832015-07-29 17:43:52 +02001089 template <typename Func, typename... Extra> class_ &
Jason Rhinelander139a0822017-03-12 17:59:07 -03001090 def_static(const char *name_, Func &&f, const Extra&... extra) {
1091 static_assert(!std::is_member_function_pointer<Func>::value,
1092 "def_static(...) called with a non-static member function pointer");
Dean Moldovan865e4302016-09-21 01:06:32 +02001093 cpp_function cf(std::forward<Func>(f), name(name_), scope(*this),
1094 sibling(getattr(*this, name_, none())), extra...);
Wenzel Jakob57082212015-09-04 23:42:12 +02001095 attr(cf.name()) = cf;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001096 return *this;
1097 }
1098
Wenzel Jakob71867832015-07-29 17:43:52 +02001099 template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001100 class_ &def(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001101 op.execute(*this, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001102 return *this;
1103 }
1104
Wenzel Jakob71867832015-07-29 17:43:52 +02001105 template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001106 class_ & def_cast(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001107 op.execute_cast(*this, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001108 return *this;
1109 }
1110
Wenzel Jakob71867832015-07-29 17:43:52 +02001111 template <typename... Args, typename... Extra>
Jason Rhinelanderc4e18002017-08-17 00:01:42 -04001112 class_ &def(const detail::initimpl::constructor<Args...> &init, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001113 init.execute(*this, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001114 return *this;
1115 }
1116
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001117 template <typename... Args, typename... Extra>
Jason Rhinelanderc4e18002017-08-17 00:01:42 -04001118 class_ &def(const detail::initimpl::alias_constructor<Args...> &init, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001119 init.execute(*this, extra...);
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001120 return *this;
1121 }
1122
Jason Rhinelander464d9892017-06-12 21:52:48 -04001123 template <typename... Args, typename... Extra>
1124 class_ &def(detail::initimpl::factory<Args...> &&init, const Extra&... extra) {
1125 std::move(init).execute(*this, extra...);
1126 return *this;
1127 }
1128
Dean Moldovan1e5a7da2017-08-24 01:53:15 +02001129 template <typename... Args, typename... Extra>
1130 class_ &def(detail::initimpl::pickle_factory<Args...> &&pf, const Extra &...extra) {
1131 std::move(pf).execute(*this, extra...);
1132 return *this;
1133 }
1134
Wenzel Jakob71867832015-07-29 17:43:52 +02001135 template <typename Func> class_& def_buffer(Func &&func) {
Wenzel Jakob43398a82015-07-28 16:12:20 +02001136 struct capture { Func func; };
1137 capture *ptr = new capture { std::forward<Func>(func) };
1138 install_buffer_funcs([](PyObject *obj, void *ptr) -> buffer_info* {
Dean Moldovan5f07fac2017-01-03 11:52:05 +01001139 detail::make_caster<type> caster;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001140 if (!caster.load(obj, false))
1141 return nullptr;
Wenzel Jakob43398a82015-07-28 16:12:20 +02001142 return new buffer_info(((capture *) ptr)->func(caster));
1143 }, ptr);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001144 return *this;
1145 }
1146
Bruce Merryfe0cf8b2017-05-17 10:52:33 +02001147 template <typename Return, typename Class, typename... Args>
1148 class_ &def_buffer(Return (Class::*func)(Args...)) {
1149 return def_buffer([func] (type &obj) { return (obj.*func)(); });
1150 }
1151
1152 template <typename Return, typename Class, typename... Args>
1153 class_ &def_buffer(Return (Class::*func)(Args...) const) {
1154 return def_buffer([func] (const type &obj) { return (obj.*func)(); });
1155 }
1156
Wenzel Jakob71867832015-07-29 17:43:52 +02001157 template <typename C, typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001158 class_ &def_readwrite(const char *name, D C::*pm, const Extra&... extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001159 static_assert(std::is_base_of<C, type>::value, "def_readwrite() requires a class member (or base class member)");
1160 cpp_function fget([pm](const type &c) -> const D &{ return c.*pm; }, is_method(*this)),
1161 fset([pm](type &c, const D &value) { c.*pm = value; }, is_method(*this));
Wenzel Jakob0b489582016-03-25 16:13:10 +01001162 def_property(name, fget, fset, return_value_policy::reference_internal, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001163 return *this;
1164 }
1165
Wenzel Jakob71867832015-07-29 17:43:52 +02001166 template <typename C, typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001167 class_ &def_readonly(const char *name, const D C::*pm, const Extra& ...extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001168 static_assert(std::is_base_of<C, type>::value, "def_readonly() requires a class member (or base class member)");
1169 cpp_function fget([pm](const type &c) -> const D &{ return c.*pm; }, is_method(*this));
Wenzel Jakob0b489582016-03-25 16:13:10 +01001170 def_property_readonly(name, fget, return_value_policy::reference_internal, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001171 return *this;
1172 }
1173
Wenzel Jakob71867832015-07-29 17:43:52 +02001174 template <typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001175 class_ &def_readwrite_static(const char *name, D *pm, const Extra& ...extra) {
Wenzel Jakob0b489582016-03-25 16:13:10 +01001176 cpp_function fget([pm](object) -> const D &{ return *pm; }, scope(*this)),
1177 fset([pm](object, const D &value) { *pm = value; }, scope(*this));
1178 def_property_static(name, fget, fset, return_value_policy::reference, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001179 return *this;
1180 }
1181
Wenzel Jakob71867832015-07-29 17:43:52 +02001182 template <typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001183 class_ &def_readonly_static(const char *name, const D *pm, const Extra& ...extra) {
Wenzel Jakob0b489582016-03-25 16:13:10 +01001184 cpp_function fget([pm](object) -> const D &{ return *pm; }, scope(*this));
1185 def_property_readonly_static(name, fget, return_value_policy::reference, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001186 return *this;
1187 }
1188
Dean Moldovan03f627e2016-11-01 11:44:57 +01001189 /// Uses return_value_policy::reference_internal by default
1190 template <typename Getter, typename... Extra>
1191 class_ &def_property_readonly(const char *name, const Getter &fget, const Extra& ...extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001192 return def_property_readonly(name, cpp_function(method_adaptor<type>(fget)),
1193 return_value_policy::reference_internal, extra...);
Dean Moldovan03f627e2016-11-01 11:44:57 +01001194 }
1195
1196 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001197 template <typename... Extra>
1198 class_ &def_property_readonly(const char *name, const cpp_function &fget, const Extra& ...extra) {
Dean Moldovan03f627e2016-11-01 11:44:57 +01001199 return def_property(name, fget, cpp_function(), extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001200 }
1201
Dean Moldovan03f627e2016-11-01 11:44:57 +01001202 /// Uses return_value_policy::reference by default
1203 template <typename Getter, typename... Extra>
1204 class_ &def_property_readonly_static(const char *name, const Getter &fget, const Extra& ...extra) {
1205 return def_property_readonly_static(name, cpp_function(fget), return_value_policy::reference, extra...);
1206 }
1207
1208 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001209 template <typename... Extra>
1210 class_ &def_property_readonly_static(const char *name, const cpp_function &fget, const Extra& ...extra) {
Dean Moldovan03f627e2016-11-01 11:44:57 +01001211 return def_property_static(name, fget, cpp_function(), extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001212 }
1213
Dean Moldovan03f627e2016-11-01 11:44:57 +01001214 /// Uses return_value_policy::reference_internal by default
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001215 template <typename Getter, typename Setter, typename... Extra>
1216 class_ &def_property(const char *name, const Getter &fget, const Setter &fset, const Extra& ...extra) {
1217 return def_property(name, fget, cpp_function(method_adaptor<type>(fset)), extra...);
1218 }
Dean Moldovan03f627e2016-11-01 11:44:57 +01001219 template <typename Getter, typename... Extra>
1220 class_ &def_property(const char *name, const Getter &fget, const cpp_function &fset, const Extra& ...extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001221 return def_property(name, cpp_function(method_adaptor<type>(fget)), fset,
1222 return_value_policy::reference_internal, extra...);
Dean Moldovan03f627e2016-11-01 11:44:57 +01001223 }
1224
1225 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001226 template <typename... Extra>
1227 class_ &def_property(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
Wenzel Jakob0b489582016-03-25 16:13:10 +01001228 return def_property_static(name, fget, fset, is_method(*this), extra...);
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001229 }
1230
Dean Moldovan03f627e2016-11-01 11:44:57 +01001231 /// Uses return_value_policy::reference by default
1232 template <typename Getter, typename... Extra>
1233 class_ &def_property_static(const char *name, const Getter &fget, const cpp_function &fset, const Extra& ...extra) {
1234 return def_property_static(name, cpp_function(fget), fset, return_value_policy::reference, extra...);
1235 }
1236
1237 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001238 template <typename... Extra>
1239 class_ &def_property_static(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
1240 auto rec_fget = get_function_record(fget), rec_fset = get_function_record(fset);
Wenzel Jakob7c99ff22016-06-02 20:33:01 +02001241 char *doc_prev = rec_fget->doc; /* 'extra' field may include a property-specific documentation string */
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001242 detail::process_attributes<Extra...>::init(extra..., rec_fget);
Wenzel Jakob7c99ff22016-06-02 20:33:01 +02001243 if (rec_fget->doc && rec_fget->doc != doc_prev) {
1244 free(doc_prev);
1245 rec_fget->doc = strdup(rec_fget->doc);
1246 }
1247 if (rec_fset) {
1248 doc_prev = rec_fset->doc;
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001249 detail::process_attributes<Extra...>::init(extra..., rec_fset);
Wenzel Jakob7c99ff22016-06-02 20:33:01 +02001250 if (rec_fset->doc && rec_fset->doc != doc_prev) {
1251 free(doc_prev);
1252 rec_fset->doc = strdup(rec_fset->doc);
1253 }
1254 }
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001255 def_property_static_impl(name, fget, fset, rec_fget);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001256 return *this;
1257 }
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001258
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001259private:
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001260 /// Initialize holder object, variant 1: object derives from enable_shared_from_this
1261 template <typename T>
Jason Rhinelander353615f2017-07-25 00:53:23 -04001262 static void init_holder(detail::instance *inst, detail::value_and_holder &v_h,
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001263 const holder_type * /* unused */, const std::enable_shared_from_this<T> * /* dummy */) {
Wenzel Jakob6e213c92015-11-24 23:05:58 +01001264 try {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001265 auto sh = std::dynamic_pointer_cast<typename holder_type::element_type>(
1266 v_h.value_ptr<type>()->shared_from_this());
Jason Rhinelanderb8ac4382017-05-19 13:34:55 -04001267 if (sh) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001268 new (&v_h.holder<holder_type>()) holder_type(std::move(sh));
1269 v_h.set_holder_constructed();
Dean Moldovanab90ec62016-12-07 02:36:44 +01001270 }
Jason Rhinelanderb8ac4382017-05-19 13:34:55 -04001271 } catch (const std::bad_weak_ptr &) {}
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001272
1273 if (!v_h.holder_constructed() && inst->owned) {
1274 new (&v_h.holder<holder_type>()) holder_type(v_h.value_ptr<type>());
1275 v_h.set_holder_constructed();
Wenzel Jakob6e213c92015-11-24 23:05:58 +01001276 }
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001277 }
1278
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001279 static void init_holder_from_existing(const detail::value_and_holder &v_h,
1280 const holder_type *holder_ptr, std::true_type /*is_copy_constructible*/) {
1281 new (&v_h.holder<holder_type>()) holder_type(*reinterpret_cast<const holder_type *>(holder_ptr));
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001282 }
1283
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001284 static void init_holder_from_existing(const detail::value_and_holder &v_h,
1285 const holder_type *holder_ptr, std::false_type /*is_copy_constructible*/) {
1286 new (&v_h.holder<holder_type>()) holder_type(std::move(*const_cast<holder_type *>(holder_ptr)));
Dean Moldovanec009a72017-01-31 17:05:44 +01001287 }
1288
1289 /// Initialize holder object, variant 2: try to construct from existing holder object, if possible
Jason Rhinelander353615f2017-07-25 00:53:23 -04001290 static void init_holder(detail::instance *inst, detail::value_and_holder &v_h,
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001291 const holder_type *holder_ptr, const void * /* dummy -- not enable_shared_from_this<T>) */) {
Dean Moldovanec009a72017-01-31 17:05:44 +01001292 if (holder_ptr) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001293 init_holder_from_existing(v_h, holder_ptr, std::is_copy_constructible<holder_type>());
1294 v_h.set_holder_constructed();
Dean Moldovanec009a72017-01-31 17:05:44 +01001295 } else if (inst->owned || detail::always_construct_holder<holder_type>::value) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001296 new (&v_h.holder<holder_type>()) holder_type(v_h.value_ptr<type>());
1297 v_h.set_holder_constructed();
Jason Rhinelanderc07ec312016-11-06 13:12:48 -05001298 }
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001299 }
1300
Jason Rhinelander353615f2017-07-25 00:53:23 -04001301 /// Performs instance initialization including constructing a holder and registering the known
1302 /// instance. Should be called as soon as the `type` value_ptr is set for an instance. Takes an
1303 /// optional pointer to an existing holder to use; if not specified and the instance is
1304 /// `.owned`, a new holder will be constructed to manage the value pointer.
1305 static void init_instance(detail::instance *inst, const void *holder_ptr) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001306 auto v_h = inst->get_value_and_holder(detail::get_type_info(typeid(type)));
Jason Rhinelandercca20a72017-07-29 03:56:01 -04001307 if (!v_h.instance_registered()) {
1308 register_instance(inst, v_h.value_ptr(), v_h.type);
1309 v_h.set_instance_registered();
1310 }
Jason Rhinelander353615f2017-07-25 00:53:23 -04001311 init_holder(inst, v_h, (const holder_type *) holder_ptr, v_h.value_ptr<type>());
Wenzel Jakob6e213c92015-11-24 23:05:58 +01001312 }
1313
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001314 /// Deallocates an instance; via holder, if constructed; otherwise via operator delete.
Jason Rhinelander464d9892017-06-12 21:52:48 -04001315 static void dealloc(detail::value_and_holder &v_h) {
1316 if (v_h.holder_constructed()) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001317 v_h.holder<holder_type>().~holder_type();
Jason Rhinelander464d9892017-06-12 21:52:48 -04001318 v_h.set_holder_constructed(false);
1319 }
1320 else {
Jason Rhinelandera03408c2017-07-23 00:32:58 -04001321 detail::call_operator_delete(v_h.value_ptr<type>(), v_h.type->type_size);
Jason Rhinelander464d9892017-06-12 21:52:48 -04001322 }
1323 v_h.value_ptr() = nullptr;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001324 }
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001325
1326 static detail::function_record *get_function_record(handle h) {
1327 h = detail::get_function(h);
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001328 return h ? (detail::function_record *) reinterpret_borrow<capsule>(PyCFunction_GET_SELF(h.ptr()))
Dean Moldovanc7ac16b2016-10-28 03:08:15 +02001329 : nullptr;
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001330 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001331};
1332
Dean Moldovan68986792017-08-30 23:40:55 +02001333/// Binds an existing constructor taking arguments Args...
1334template <typename... Args> detail::initimpl::constructor<Args...> init() { return {}; }
1335/// Like `init<Args...>()`, but the instance is always constructed through the alias class (even
1336/// when not inheriting on the Python side).
1337template <typename... Args> detail::initimpl::alias_constructor<Args...> init_alias() { return {}; }
1338
1339/// Binds a factory function as a constructor
1340template <typename Func, typename Ret = detail::initimpl::factory<Func>>
1341Ret init(Func &&f) { return {std::forward<Func>(f)}; }
1342
1343/// Dual-argument factory function: the first function is called when no alias is needed, the second
1344/// when an alias is needed (i.e. due to python-side inheritance). Arguments must be identical.
1345template <typename CFunc, typename AFunc, typename Ret = detail::initimpl::factory<CFunc, AFunc>>
1346Ret init(CFunc &&c, AFunc &&a) {
1347 return {std::forward<CFunc>(c), std::forward<AFunc>(a)};
1348}
1349
1350/// Binds pickling functions `__getstate__` and `__setstate__` and ensures that the type
1351/// returned by `__getstate__` is the same as the argument accepted by `__setstate__`.
1352template <typename GetState, typename SetState>
1353detail::initimpl::pickle_factory<GetState, SetState> pickle(GetState &&g, SetState &&s) {
1354 return {std::forward<GetState>(g), std::forward<SetState>(s)};
Marcin Wojdyrfbab29c2017-09-04 18:37:16 +01001355}
Dean Moldovan68986792017-08-30 23:40:55 +02001356
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001357/// Binds C++ enumerations and enumeration classes to Python
1358template <typename Type> class enum_ : public class_<Type> {
1359public:
Wenzel Jakob8ac97152016-09-05 17:20:50 +09001360 using class_<Type>::def;
Matthieu Becaf936e12017-03-03 08:45:50 -08001361 using class_<Type>::def_property_readonly_static;
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001362 using Scalar = typename std::underlying_type<Type>::type;
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001363
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001364 template <typename... Extra>
1365 enum_(const handle &scope, const char *name, const Extra&... extra)
Matthieu Becaf936e12017-03-03 08:45:50 -08001366 : class_<Type>(scope, name, extra...), m_entries(), m_parent(scope) {
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001367
Dean Moldovan82ece942017-03-29 11:55:18 +02001368 constexpr bool is_arithmetic = detail::any_of<std::is_same<arithmetic, Extra>...>::value;
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001369
Matthieu Becaf936e12017-03-03 08:45:50 -08001370 auto m_entries_ptr = m_entries.inc_ref().ptr();
1371 def("__repr__", [name, m_entries_ptr](Type value) -> pybind11::str {
1372 for (const auto &kv : reinterpret_borrow<dict>(m_entries_ptr)) {
1373 if (pybind11::cast<Type>(kv.second) == value)
1374 return pybind11::str("{}.{}").format(name, kv.first);
1375 }
1376 return pybind11::str("{}.???").format(name);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001377 });
Matthieu Becaf936e12017-03-03 08:45:50 -08001378 def_property_readonly_static("__members__", [m_entries_ptr](object /* self */) {
1379 dict m;
1380 for (const auto &kv : reinterpret_borrow<dict>(m_entries_ptr))
1381 m[kv.first] = kv.second;
1382 return m;
1383 }, return_value_policy::copy);
Dean Moldovan68986792017-08-30 23:40:55 +02001384 def(init([](Scalar i) { return static_cast<Type>(i); }));
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001385 def("__int__", [](Type value) { return (Scalar) value; });
Wenzel Jakobe6fd2cd2017-04-28 14:46:52 +02001386 #if PY_MAJOR_VERSION < 3
1387 def("__long__", [](Type value) { return (Scalar) value; });
1388 #endif
Wenzel Jakob8ac97152016-09-05 17:20:50 +09001389 def("__eq__", [](const Type &value, Type *value2) { return value2 && value == *value2; });
1390 def("__ne__", [](const Type &value, Type *value2) { return !value2 || value != *value2; });
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001391 if (is_arithmetic) {
1392 def("__lt__", [](const Type &value, Type *value2) { return value2 && value < *value2; });
1393 def("__gt__", [](const Type &value, Type *value2) { return value2 && value > *value2; });
1394 def("__le__", [](const Type &value, Type *value2) { return value2 && value <= *value2; });
1395 def("__ge__", [](const Type &value, Type *value2) { return value2 && value >= *value2; });
1396 }
1397 if (std::is_convertible<Type, Scalar>::value) {
Jason Rhinelanderd41a2732016-08-04 00:21:37 -04001398 // Don't provide comparison with the underlying type if the enum isn't convertible,
1399 // i.e. if Type is a scoped enum, mirroring the C++ behaviour. (NB: we explicitly
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001400 // convert Type to Scalar below anyway because this needs to compile).
1401 def("__eq__", [](const Type &value, Scalar value2) { return (Scalar) value == value2; });
1402 def("__ne__", [](const Type &value, Scalar value2) { return (Scalar) value != value2; });
1403 if (is_arithmetic) {
1404 def("__lt__", [](const Type &value, Scalar value2) { return (Scalar) value < value2; });
1405 def("__gt__", [](const Type &value, Scalar value2) { return (Scalar) value > value2; });
1406 def("__le__", [](const Type &value, Scalar value2) { return (Scalar) value <= value2; });
1407 def("__ge__", [](const Type &value, Scalar value2) { return (Scalar) value >= value2; });
1408 def("__invert__", [](const Type &value) { return ~((Scalar) value); });
1409 def("__and__", [](const Type &value, Scalar value2) { return (Scalar) value & value2; });
1410 def("__or__", [](const Type &value, Scalar value2) { return (Scalar) value | value2; });
1411 def("__xor__", [](const Type &value, Scalar value2) { return (Scalar) value ^ value2; });
1412 def("__rand__", [](const Type &value, Scalar value2) { return (Scalar) value & value2; });
1413 def("__ror__", [](const Type &value, Scalar value2) { return (Scalar) value | value2; });
1414 def("__rxor__", [](const Type &value, Scalar value2) { return (Scalar) value ^ value2; });
1415 def("__and__", [](const Type &value, const Type &value2) { return (Scalar) value & (Scalar) value2; });
1416 def("__or__", [](const Type &value, const Type &value2) { return (Scalar) value | (Scalar) value2; });
1417 def("__xor__", [](const Type &value, const Type &value2) { return (Scalar) value ^ (Scalar) value2; });
1418 }
Jason Rhinelanderd41a2732016-08-04 00:21:37 -04001419 }
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001420 def("__hash__", [](const Type &value) { return (Scalar) value; });
Wenzel Jakobfe342412016-09-06 13:02:29 +09001421 // Pickling and unpickling -- needed for use with the 'multiprocessing' module
Dean Moldovan68986792017-08-30 23:40:55 +02001422 def(pickle([](const Type &value) { return pybind11::make_tuple((Scalar) value); },
1423 [](tuple t) { return static_cast<Type>(t[0].cast<Scalar>()); }));
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001424 }
1425
1426 /// Export enumeration entries into the parent scope
Matthieu Becaf936e12017-03-03 08:45:50 -08001427 enum_& export_values() {
1428 for (const auto &kv : m_entries)
1429 m_parent.attr(kv.first) = kv.second;
Wenzel Jakobe916d842016-11-04 16:51:14 +01001430 return *this;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001431 }
1432
1433 /// Add an enumeration entry
1434 enum_& value(char const* name, Type value) {
Matthieu Becaf936e12017-03-03 08:45:50 -08001435 auto v = pybind11::cast(value, return_value_policy::copy);
1436 this->attr(name) = v;
1437 m_entries[pybind11::str(name)] = v;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001438 return *this;
1439 }
Matthieu Becaf936e12017-03-03 08:45:50 -08001440
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001441private:
Matthieu Becaf936e12017-03-03 08:45:50 -08001442 dict m_entries;
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001443 handle m_parent;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001444};
1445
1446NAMESPACE_BEGIN(detail)
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001447
Jason Rhinelanderec62d972016-09-09 02:42:51 -04001448
Jason Rhinelanderf2ecd892016-08-10 12:08:04 -04001449inline void keep_alive_impl(handle nurse, handle patient) {
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001450 if (!nurse || !patient)
Wenzel Jakob678d7872016-01-17 22:36:41 +01001451 pybind11_fail("Could not activate keep_alive!");
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001452
Ivan Smirnov984c7622016-08-29 02:38:47 +01001453 if (patient.is_none() || nurse.is_none())
Glen Walkerf45bb582016-08-16 17:50:43 +12001454 return; /* Nothing to keep alive or nothing to be kept alive by */
Wenzel Jakob9b880ba2016-04-25 03:25:13 +02001455
Bruce Merry9d698f72017-06-24 14:58:42 +02001456 auto tinfo = all_type_info(Py_TYPE(nurse.ptr()));
1457 if (!tinfo.empty()) {
1458 /* It's a pybind-registered type, so we can store the patient in the
1459 * internal list. */
1460 add_patient(nurse.ptr(), patient.ptr());
1461 }
1462 else {
1463 /* Fall back to clever approach based on weak references taken from
1464 * Boost.Python. This is not used for pybind-registered types because
1465 * the objects can be destroyed out-of-order in a GC pass. */
1466 cpp_function disable_lifesupport(
1467 [patient](handle weakref) { patient.dec_ref(); weakref.dec_ref(); });
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001468
Bruce Merry9d698f72017-06-24 14:58:42 +02001469 weakref wr(nurse, disable_lifesupport);
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001470
Bruce Merry9d698f72017-06-24 14:58:42 +02001471 patient.inc_ref(); /* reference patient and leak the weak reference */
1472 (void) wr.release();
1473 }
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001474}
1475
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -05001476PYBIND11_NOINLINE inline void keep_alive_impl(size_t Nurse, size_t Patient, function_call &call, handle ret) {
Dean Moldovan7939f4b2017-09-04 13:49:19 +02001477 auto get_arg = [&](size_t n) {
1478 if (n == 0)
1479 return ret;
1480 else if (n == 1 && call.init_self)
1481 return call.init_self;
1482 else if (n <= call.args.size())
1483 return call.args[n - 1];
1484 return handle();
1485 };
1486
1487 keep_alive_impl(get_arg(Nurse), get_arg(Patient));
Jason Rhinelanderf2ecd892016-08-10 12:08:04 -04001488}
1489
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001490inline std::pair<decltype(internals::registered_types_py)::iterator, bool> all_type_info_get_cache(PyTypeObject *type) {
1491 auto res = get_internals().registered_types_py
Jason Rhinelander12be4cd2017-07-29 03:53:45 -04001492#ifdef __cpp_lib_unordered_map_try_emplace
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001493 .try_emplace(type);
1494#else
1495 .emplace(type, std::vector<detail::type_info *>());
1496#endif
1497 if (res.second) {
1498 // New cache entry created; set up a weak reference to automatically remove it if the type
1499 // gets destroyed:
1500 weakref((PyObject *) type, cpp_function([type](handle wr) {
1501 get_internals().registered_types_py.erase(type);
1502 wr.dec_ref();
1503 })).release();
1504 }
1505
1506 return res;
1507}
1508
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001509template <typename Iterator, typename Sentinel, bool KeyIterator, return_value_policy Policy>
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001510struct iterator_state {
1511 Iterator it;
1512 Sentinel end;
Dean Moldovancaedf742017-06-09 16:49:04 +02001513 bool first_or_done;
Ivan Smirnovdaed1ab2016-06-17 22:29:39 +01001514};
Wenzel Jakobb2825952016-04-13 23:33:00 +02001515
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001516NAMESPACE_END(detail)
1517
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001518/// Makes a python iterator from a first and past-the-end C++ InputIterator.
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001519template <return_value_policy Policy = return_value_policy::reference_internal,
1520 typename Iterator,
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001521 typename Sentinel,
Wenzel Jakob5dd33d82016-05-30 11:28:21 +02001522 typename ValueType = decltype(*std::declval<Iterator>()),
1523 typename... Extra>
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001524iterator make_iterator(Iterator first, Sentinel last, Extra &&... extra) {
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001525 typedef detail::iterator_state<Iterator, Sentinel, false, Policy> state;
Wenzel Jakobb2825952016-04-13 23:33:00 +02001526
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001527 if (!detail::get_type_info(typeid(state), false)) {
Jason Rhinelander7437c692017-07-28 22:03:44 -04001528 class_<state>(handle(), "iterator", pybind11::module_local())
Wenzel Jakobb2825952016-04-13 23:33:00 +02001529 .def("__iter__", [](state &s) -> state& { return s; })
Wenzel Jakob5dd33d82016-05-30 11:28:21 +02001530 .def("__next__", [](state &s) -> ValueType {
Dean Moldovancaedf742017-06-09 16:49:04 +02001531 if (!s.first_or_done)
Ivan Smirnovdaed1ab2016-06-17 22:29:39 +01001532 ++s.it;
1533 else
Dean Moldovancaedf742017-06-09 16:49:04 +02001534 s.first_or_done = false;
1535 if (s.it == s.end) {
1536 s.first_or_done = true;
Wenzel Jakobb2825952016-04-13 23:33:00 +02001537 throw stop_iteration();
Dean Moldovancaedf742017-06-09 16:49:04 +02001538 }
Ivan Smirnovdaed1ab2016-06-17 22:29:39 +01001539 return *s.it;
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001540 }, std::forward<Extra>(extra)..., Policy);
Wenzel Jakobb2825952016-04-13 23:33:00 +02001541 }
1542
Dean Moldovancaedf742017-06-09 16:49:04 +02001543 return cast(state{first, last, true});
Wenzel Jakobb2825952016-04-13 23:33:00 +02001544}
Wenzel Jakob146397e2016-09-06 13:06:31 +09001545
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001546/// Makes an python iterator over the keys (`.first`) of a iterator over pairs from a
1547/// first and past-the-end InputIterator.
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001548template <return_value_policy Policy = return_value_policy::reference_internal,
1549 typename Iterator,
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001550 typename Sentinel,
Ivan Smirnovc5a1c8a2016-08-24 23:27:19 +01001551 typename KeyType = decltype((*std::declval<Iterator>()).first),
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001552 typename... Extra>
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001553iterator make_key_iterator(Iterator first, Sentinel last, Extra &&... extra) {
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001554 typedef detail::iterator_state<Iterator, Sentinel, true, Policy> state;
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001555
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001556 if (!detail::get_type_info(typeid(state), false)) {
Jason Rhinelander7437c692017-07-28 22:03:44 -04001557 class_<state>(handle(), "iterator", pybind11::module_local())
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001558 .def("__iter__", [](state &s) -> state& { return s; })
1559 .def("__next__", [](state &s) -> KeyType {
Dean Moldovancaedf742017-06-09 16:49:04 +02001560 if (!s.first_or_done)
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001561 ++s.it;
1562 else
Dean Moldovancaedf742017-06-09 16:49:04 +02001563 s.first_or_done = false;
1564 if (s.it == s.end) {
1565 s.first_or_done = true;
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001566 throw stop_iteration();
Dean Moldovancaedf742017-06-09 16:49:04 +02001567 }
Ivan Smirnovc5a1c8a2016-08-24 23:27:19 +01001568 return (*s.it).first;
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001569 }, std::forward<Extra>(extra)..., Policy);
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001570 }
1571
Dean Moldovancaedf742017-06-09 16:49:04 +02001572 return cast(state{first, last, true});
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001573}
Wenzel Jakobb2825952016-04-13 23:33:00 +02001574
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001575/// Makes an iterator over values of an stl container or other container supporting
1576/// `std::begin()`/`std::end()`
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001577template <return_value_policy Policy = return_value_policy::reference_internal,
1578 typename Type, typename... Extra> iterator make_iterator(Type &value, Extra&&... extra) {
1579 return make_iterator<Policy>(std::begin(value), std::end(value), extra...);
Wenzel Jakobbf0c7dc2016-04-18 10:52:12 +02001580}
1581
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001582/// Makes an iterator over the keys (`.first`) of a stl map-like container supporting
1583/// `std::begin()`/`std::end()`
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001584template <return_value_policy Policy = return_value_policy::reference_internal,
1585 typename Type, typename... Extra> iterator make_key_iterator(Type &value, Extra&&... extra) {
1586 return make_key_iterator<Policy>(std::begin(value), std::end(value), extra...);
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001587}
1588
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001589template <typename InputType, typename OutputType> void implicitly_convertible() {
Wenzel Jakob8ed5b8a2017-08-28 16:34:06 +02001590 struct set_flag {
1591 bool &flag;
1592 set_flag(bool &flag) : flag(flag) { flag = true; }
1593 ~set_flag() { flag = false; }
1594 };
Wenzel Jakob2ac50442016-01-17 22:36:35 +01001595 auto implicit_caster = [](PyObject *obj, PyTypeObject *type) -> PyObject * {
Wenzel Jakob8ed5b8a2017-08-28 16:34:06 +02001596 static bool currently_used = false;
1597 if (currently_used) // implicit conversions are non-reentrant
1598 return nullptr;
1599 set_flag flag_helper(currently_used);
Dean Moldovan5f07fac2017-01-03 11:52:05 +01001600 if (!detail::make_caster<InputType>().load(obj, false))
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001601 return nullptr;
1602 tuple args(1);
1603 args[0] = obj;
1604 PyObject *result = PyObject_Call((PyObject *) type, args.ptr(), nullptr);
1605 if (result == nullptr)
1606 PyErr_Clear();
1607 return result;
1608 };
Ivan Smirnov8f3e0452016-10-23 15:43:03 +01001609
1610 if (auto tinfo = detail::get_type_info(typeid(OutputType)))
1611 tinfo->implicit_conversions.push_back(implicit_caster);
1612 else
Wenzel Jakob678d7872016-01-17 22:36:41 +01001613 pybind11_fail("implicitly_convertible: Unable to find type " + type_id<OutputType>());
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001614}
1615
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001616template <typename ExceptionTranslator>
1617void register_exception_translator(ExceptionTranslator&& translator) {
1618 detail::get_internals().registered_exception_translators.push_front(
1619 std::forward<ExceptionTranslator>(translator));
1620}
1621
Jason Rhinelander37b23832017-05-22 12:06:16 -04001622/**
1623 * Wrapper to generate a new Python exception type.
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001624 *
1625 * This should only be used with PyErr_SetString for now.
1626 * It is not (yet) possible to use as a py::base.
1627 * Template type argument is reserved for future use.
1628 */
1629template <typename type>
1630class exception : public object {
1631public:
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001632 exception(handle scope, const char *name, PyObject *base = PyExc_Exception) {
1633 std::string full_name = scope.attr("__name__").cast<std::string>() +
1634 std::string(".") + name;
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -05001635 m_ptr = PyErr_NewException(const_cast<char *>(full_name.c_str()), base, NULL);
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001636 if (hasattr(scope, name))
1637 pybind11_fail("Error during initialization: multiple incompatible "
1638 "definitions with name \"" + std::string(name) + "\"");
1639 scope.attr(name) = *this;
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001640 }
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001641
1642 // Sets the current python exception to this exception object with the given message
1643 void operator()(const char *message) {
1644 PyErr_SetString(m_ptr, message);
1645 }
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001646};
1647
Jason Rhinelander37b23832017-05-22 12:06:16 -04001648/**
1649 * Registers a Python exception in `m` of the given `name` and installs an exception translator to
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001650 * translate the C++ exception to the created Python exception using the exceptions what() method.
1651 * This is intended for simple exception translations; for more complex translation, register the
1652 * exception object and translator directly.
1653 */
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001654template <typename CppException>
1655exception<CppException> &register_exception(handle scope,
1656 const char *name,
1657 PyObject *base = PyExc_Exception) {
1658 static exception<CppException> ex(scope, name, base);
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001659 register_exception_translator([](std::exception_ptr p) {
1660 if (!p) return;
1661 try {
1662 std::rethrow_exception(p);
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001663 } catch (const CppException &e) {
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001664 ex(e.what());
1665 }
1666 });
1667 return ex;
1668}
1669
Dean Moldovan67990d92016-08-29 18:03:34 +02001670NAMESPACE_BEGIN(detail)
1671PYBIND11_NOINLINE inline void print(tuple args, dict kwargs) {
1672 auto strings = tuple(args.size());
1673 for (size_t i = 0; i < args.size(); ++i) {
Dean Moldovane18bc022016-10-25 22:12:39 +02001674 strings[i] = str(args[i]);
Dean Moldovan67990d92016-08-29 18:03:34 +02001675 }
Dean Moldovan865e4302016-09-21 01:06:32 +02001676 auto sep = kwargs.contains("sep") ? kwargs["sep"] : cast(" ");
Dean Moldovan242b1462016-09-08 17:02:04 +02001677 auto line = sep.attr("join")(strings);
Dean Moldovan67990d92016-08-29 18:03:34 +02001678
Wenzel Jakobc49d6e52016-10-13 10:34:52 +02001679 object file;
1680 if (kwargs.contains("file")) {
1681 file = kwargs["file"].cast<object>();
1682 } else {
1683 try {
1684 file = module::import("sys").attr("stdout");
esquires67a68f12016-12-01 05:35:34 -05001685 } catch (const error_already_set &) {
Wenzel Jakobc49d6e52016-10-13 10:34:52 +02001686 /* If print() is called from code that is executed as
1687 part of garbage collection during interpreter shutdown,
1688 importing 'sys' can fail. Give up rather than crashing the
1689 interpreter in this case. */
1690 return;
1691 }
1692 }
1693
Dean Moldovan242b1462016-09-08 17:02:04 +02001694 auto write = file.attr("write");
Dean Moldovan67990d92016-08-29 18:03:34 +02001695 write(line);
Dean Moldovan865e4302016-09-21 01:06:32 +02001696 write(kwargs.contains("end") ? kwargs["end"] : cast("\n"));
Dean Moldovan67990d92016-08-29 18:03:34 +02001697
Wenzel Jakobc49d6e52016-10-13 10:34:52 +02001698 if (kwargs.contains("flush") && kwargs["flush"].cast<bool>())
Dean Moldovan242b1462016-09-08 17:02:04 +02001699 file.attr("flush")();
Dean Moldovan67990d92016-08-29 18:03:34 +02001700}
1701NAMESPACE_END(detail)
1702
1703template <return_value_policy policy = return_value_policy::automatic_reference, typename... Args>
1704void print(Args &&...args) {
1705 auto c = detail::collect_arguments<policy>(std::forward<Args>(args)...);
1706 detail::print(c.args(), c.kwargs());
1707}
1708
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001709#if defined(WITH_THREAD) && !defined(PYPY_VERSION)
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001710
1711/* The functions below essentially reproduce the PyGILState_* API using a RAII
1712 * pattern, but there are a few important differences:
1713 *
1714 * 1. When acquiring the GIL from an non-main thread during the finalization
1715 * phase, the GILState API blindly terminates the calling thread, which
1716 * is often not what is wanted. This API does not do this.
1717 *
1718 * 2. The gil_scoped_release function can optionally cut the relationship
1719 * of a PyThreadState and its associated thread, which allows moving it to
1720 * another thread (this is a fairly rare/advanced use case).
1721 *
1722 * 3. The reference count of an acquired thread state can be controlled. This
1723 * can be handy to prevent cases where callbacks issued from an external
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001724 * thread would otherwise constantly construct and destroy thread state data
1725 * structures.
Wenzel Jakob69e1a5c2016-05-26 14:29:31 +02001726 *
1727 * See the Python bindings of NanoGUI (http://github.com/wjakob/nanogui) for an
1728 * example which uses features 2 and 3 to migrate the Python thread of
1729 * execution to another thread (to run the event loop on the original thread,
1730 * in this case).
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001731 */
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001732
1733class gil_scoped_acquire {
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001734public:
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001735 PYBIND11_NOINLINE gil_scoped_acquire() {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001736 auto const &internals = detail::get_internals();
1737 tstate = (PyThreadState *) PyThread_get_key_value(internals.tstate);
1738
1739 if (!tstate) {
1740 tstate = PyThreadState_New(internals.istate);
1741 #if !defined(NDEBUG)
1742 if (!tstate)
1743 pybind11_fail("scoped_acquire: could not create thread state!");
1744 #endif
1745 tstate->gilstate_counter = 0;
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001746 #if PY_MAJOR_VERSION < 3
1747 PyThread_delete_key_value(internals.tstate);
1748 #endif
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001749 PyThread_set_key_value(internals.tstate, tstate);
1750 } else {
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001751 release = detail::get_thread_state_unchecked() != tstate;
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001752 }
1753
1754 if (release) {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001755 /* Work around an annoying assertion in PyThreadState_Swap */
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001756 #if defined(Py_DEBUG)
1757 PyInterpreterState *interp = tstate->interp;
1758 tstate->interp = nullptr;
1759 #endif
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001760 PyEval_AcquireThread(tstate);
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001761 #if defined(Py_DEBUG)
1762 tstate->interp = interp;
1763 #endif
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001764 }
1765
1766 inc_ref();
1767 }
1768
1769 void inc_ref() {
1770 ++tstate->gilstate_counter;
1771 }
1772
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001773 PYBIND11_NOINLINE void dec_ref() {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001774 --tstate->gilstate_counter;
1775 #if !defined(NDEBUG)
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001776 if (detail::get_thread_state_unchecked() != tstate)
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001777 pybind11_fail("scoped_acquire::dec_ref(): thread state must be current!");
1778 if (tstate->gilstate_counter < 0)
1779 pybind11_fail("scoped_acquire::dec_ref(): reference count underflow!");
1780 #endif
1781 if (tstate->gilstate_counter == 0) {
1782 #if !defined(NDEBUG)
1783 if (!release)
1784 pybind11_fail("scoped_acquire::dec_ref(): internal error!");
1785 #endif
1786 PyThreadState_Clear(tstate);
1787 PyThreadState_DeleteCurrent();
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001788 PyThread_delete_key_value(detail::get_internals().tstate);
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001789 release = false;
1790 }
1791 }
1792
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001793 PYBIND11_NOINLINE ~gil_scoped_acquire() {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001794 dec_ref();
1795 if (release)
1796 PyEval_SaveThread();
1797 }
1798private:
1799 PyThreadState *tstate = nullptr;
1800 bool release = true;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001801};
1802
1803class gil_scoped_release {
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001804public:
Jason Rhinelander12d76602016-10-16 16:27:42 -04001805 explicit gil_scoped_release(bool disassoc = false) : disassoc(disassoc) {
Dean Moldovan2d6116b2017-06-20 23:50:51 +02001806 // `get_internals()` must be called here unconditionally in order to initialize
1807 // `internals.tstate` for subsequent `gil_scoped_acquire` calls. Otherwise, an
1808 // initialization race could occur as multiple threads try `gil_scoped_acquire`.
1809 const auto &internals = detail::get_internals();
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001810 tstate = PyEval_SaveThread();
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02001811 if (disassoc) {
Dean Moldovan2d6116b2017-06-20 23:50:51 +02001812 auto key = internals.tstate;
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02001813 #if PY_MAJOR_VERSION < 3
1814 PyThread_delete_key_value(key);
1815 #else
1816 PyThread_set_key_value(key, nullptr);
1817 #endif
1818 }
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001819 }
1820 ~gil_scoped_release() {
1821 if (!tstate)
1822 return;
1823 PyEval_RestoreThread(tstate);
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02001824 if (disassoc) {
Boris Schäling20ee9352016-05-28 12:26:18 +02001825 auto key = detail::get_internals().tstate;
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02001826 #if PY_MAJOR_VERSION < 3
1827 PyThread_delete_key_value(key);
1828 #endif
1829 PyThread_set_key_value(key, tstate);
1830 }
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001831 }
1832private:
1833 PyThreadState *tstate;
1834 bool disassoc;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001835};
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001836#elif defined(PYPY_VERSION)
1837class gil_scoped_acquire {
1838 PyGILState_STATE state;
1839public:
1840 gil_scoped_acquire() { state = PyGILState_Ensure(); }
1841 ~gil_scoped_acquire() { PyGILState_Release(state); }
1842};
1843
1844class gil_scoped_release {
1845 PyThreadState *state;
1846public:
1847 gil_scoped_release() { state = PyEval_SaveThread(); }
1848 ~gil_scoped_release() { PyEval_RestoreThread(state); }
1849};
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001850#else
1851class gil_scoped_acquire { };
1852class gil_scoped_release { };
Felipe Lema2547ca42016-01-25 16:22:44 -03001853#endif
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001854
Wenzel Jakob8d396fc2016-11-24 23:11:02 +01001855error_already_set::~error_already_set() {
Jason Rhinelander1682b672017-07-20 23:14:33 -04001856 if (type) {
Wenzel Jakob8d396fc2016-11-24 23:11:02 +01001857 gil_scoped_acquire gil;
Jason Rhinelander1682b672017-07-20 23:14:33 -04001858 type.release().dec_ref();
1859 value.release().dec_ref();
1860 trace.release().dec_ref();
Wenzel Jakob8d396fc2016-11-24 23:11:02 +01001861 }
1862}
1863
Jason Rhinelander1b05ce52016-08-09 17:57:59 -04001864inline function get_type_overload(const void *this_ptr, const detail::type_info *this_type, const char *name) {
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001865 handle self = detail::get_object_handle(this_ptr, this_type);
1866 if (!self)
Wenzel Jakobac0fde92015-10-01 18:37:26 +02001867 return function();
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001868 handle type = self.get_type();
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001869 auto key = std::make_pair(type.ptr(), name);
1870
Wenzel Jakobf5c154a2016-04-11 18:13:08 +02001871 /* Cache functions that aren't overloaded in Python to avoid
1872 many costly Python dictionary lookups below */
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001873 auto &cache = detail::get_internals().inactive_overload_cache;
1874 if (cache.find(key) != cache.end())
1875 return function();
1876
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001877 function overload = getattr(self, name, function());
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001878 if (overload.is_cpp_function()) {
1879 cache.insert(key);
1880 return function();
1881 }
Wenzel Jakob27e8e102016-01-17 22:36:37 +01001882
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001883 /* Don't call dispatch code if invoked from overridden function.
1884 Unfortunately this doesn't work on PyPy. */
1885#if !defined(PYPY_VERSION)
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001886 PyFrameObject *frame = PyThreadState_Get()->frame;
Dean Moldovane18bc022016-10-25 22:12:39 +02001887 if (frame && (std::string) str(frame->f_code->co_name) == name &&
Wenzel Jakobf5c154a2016-04-11 18:13:08 +02001888 frame->f_code->co_argcount > 0) {
1889 PyFrame_FastToLocals(frame);
1890 PyObject *self_caller = PyDict_GetItem(
1891 frame->f_locals, PyTuple_GET_ITEM(frame->f_code->co_varnames, 0));
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001892 if (self_caller == self.ptr())
Wenzel Jakobf5c154a2016-04-11 18:13:08 +02001893 return function();
1894 }
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001895#else
1896 /* PyPy currently doesn't provide a detailed cpyext emulation of
1897 frame objects, so we have to emulate this using Python. This
1898 is going to be slow..*/
1899 dict d; d["self"] = self; d["name"] = pybind11::str(name);
1900 PyObject *result = PyRun_String(
1901 "import inspect\n"
1902 "frame = inspect.currentframe()\n"
1903 "if frame is not None:\n"
1904 " frame = frame.f_back\n"
1905 " if frame is not None and str(frame.f_code.co_name) == name and "
1906 "frame.f_code.co_argcount > 0:\n"
1907 " self_caller = frame.f_locals[frame.f_code.co_varnames[0]]\n"
1908 " if self_caller == self:\n"
1909 " self = None\n",
1910 Py_file_input, d.ptr(), d.ptr());
1911 if (result == nullptr)
1912 throw error_already_set();
Dean Moldovan36f0a152017-02-08 01:01:56 +01001913 if (d["self"].is_none())
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001914 return function();
1915 Py_DECREF(result);
1916#endif
1917
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001918 return overload;
1919}
1920
Jason Rhinelander1b05ce52016-08-09 17:57:59 -04001921template <class T> function get_overload(const T *this_ptr, const char *name) {
Ivan Smirnov8f3e0452016-10-23 15:43:03 +01001922 auto tinfo = detail::get_type_info(typeid(T));
1923 return tinfo ? get_type_overload(this_ptr, tinfo, name) : function();
Jason Rhinelander1b05ce52016-08-09 17:57:59 -04001924}
1925
Jason Rhinelander20978262016-08-29 18:16:46 -04001926#define PYBIND11_OVERLOAD_INT(ret_type, cname, name, ...) { \
Wenzel Jakob8f4eb002015-10-15 18:13:33 +02001927 pybind11::gil_scoped_acquire gil; \
Jason Rhinelander20978262016-08-29 18:16:46 -04001928 pybind11::function overload = pybind11::get_overload(static_cast<const cname *>(this), name); \
Jason Rhinelander7dfb9322016-09-08 14:49:43 -04001929 if (overload) { \
Jason Rhinelander3e4fe6c2016-09-11 12:17:41 -04001930 auto o = overload(__VA_ARGS__); \
Jason Rhinelander7dfb9322016-09-08 14:49:43 -04001931 if (pybind11::detail::cast_is_temporary_value_reference<ret_type>::value) { \
Jason Rhinelander3e4fe6c2016-09-11 12:17:41 -04001932 static pybind11::detail::overload_caster_t<ret_type> caster; \
1933 return pybind11::detail::cast_ref<ret_type>(std::move(o), caster); \
Jason Rhinelander7dfb9322016-09-08 14:49:43 -04001934 } \
1935 else return pybind11::detail::cast_safe<ret_type>(std::move(o)); \
1936 } \
1937 }
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001938
Wenzel Jakob1e3be732016-05-24 23:42:05 +02001939#define PYBIND11_OVERLOAD_NAME(ret_type, cname, name, fn, ...) \
Jason Rhinelander20978262016-08-29 18:16:46 -04001940 PYBIND11_OVERLOAD_INT(ret_type, cname, name, __VA_ARGS__) \
Wenzel Jakob1e3be732016-05-24 23:42:05 +02001941 return cname::fn(__VA_ARGS__)
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001942
Wenzel Jakob1e3be732016-05-24 23:42:05 +02001943#define PYBIND11_OVERLOAD_PURE_NAME(ret_type, cname, name, fn, ...) \
Jason Rhinelander20978262016-08-29 18:16:46 -04001944 PYBIND11_OVERLOAD_INT(ret_type, cname, name, __VA_ARGS__) \
Wenzel Jakob1e3be732016-05-24 23:42:05 +02001945 pybind11::pybind11_fail("Tried to call pure virtual function \"" #cname "::" name "\"");
1946
1947#define PYBIND11_OVERLOAD(ret_type, cname, fn, ...) \
1948 PYBIND11_OVERLOAD_NAME(ret_type, cname, #fn, fn, __VA_ARGS__)
1949
1950#define PYBIND11_OVERLOAD_PURE(ret_type, cname, fn, ...) \
1951 PYBIND11_OVERLOAD_PURE_NAME(ret_type, cname, #fn, fn, __VA_ARGS__)
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001952
Jason Rhinelandera859dd62017-08-10 12:03:29 -04001953NAMESPACE_END(PYBIND11_NAMESPACE)
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001954
1955#if defined(_MSC_VER)
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001956# pragma warning(pop)
Wenzel Jakob1ffce742016-08-25 01:43:33 +02001957#elif defined(__INTEL_COMPILER)
1958/* Leave ignored warnings on */
Wenzel Jakob6d252962016-05-01 20:47:49 +02001959#elif defined(__GNUG__) && !defined(__clang__)
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001960# pragma GCC diagnostic pop
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001961#endif