blob: 90b8ebcc631b64accfadf7381aca06142acf5a96 [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)) {
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100249#if defined(PYPY_VERSION)
250 signature += handle((PyObject *) tinfo->type)
251 .attr("__module__")
252 .cast<std::string>() + ".";
253#endif
Ivan Smirnov8f3e0452016-10-23 15:43:03 +0100254 signature += tinfo->type->tp_name;
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200255 } else if (rec->is_new_style_constructor && arg_index == 0) {
256 // A new-style `__init__` takes `self` as `value_and_holder`.
257 // Rewrite it to the proper class type.
Jason Rhinelander464d9892017-06-12 21:52:48 -0400258#if defined(PYPY_VERSION)
259 signature += rec->scope.attr("__module__").cast<std::string>() + ".";
260#endif
261 signature += ((PyTypeObject *) rec->scope.ptr())->tp_name;
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100262 } else {
263 std::string tname(t->name());
264 detail::clean_type_id(tname);
265 signature += tname;
266 }
267 } else {
268 signature += c;
269 }
270 }
Dean Moldovan0aef6422017-08-31 14:38:23 +0200271 if (arg_index != args || types[type_index] != nullptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100272 pybind11_fail("Internal error while parsing type signature (2)");
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100273
Wenzel Jakob57082212015-09-04 23:42:12 +0200274#if PY_MAJOR_VERSION < 3
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100275 if (strcmp(rec->name, "__next__") == 0) {
276 std::free(rec->name);
277 rec->name = strdup("next");
Wenzel Jakobd1bfc4e2016-05-16 18:52:46 +0200278 } else if (strcmp(rec->name, "__bool__") == 0) {
279 std::free(rec->name);
280 rec->name = strdup("__nonzero__");
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100281 }
Wenzel Jakob57082212015-09-04 23:42:12 +0200282#endif
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100283 rec->signature = strdup(signature.c_str());
284 rec->args.shrink_to_fit();
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500285 rec->nargs = (std::uint16_t) args;
Wenzel Jakobbd4a5292015-07-11 17:41:48 +0200286
Jason Rhinelander0a90b2d2017-04-16 20:30:52 -0400287 if (rec->sibling && PYBIND11_INSTANCE_METHOD_CHECK(rec->sibling.ptr()))
288 rec->sibling = PYBIND11_INSTANCE_METHOD_GET_FUNCTION(rec->sibling.ptr());
Wenzel Jakob57082212015-09-04 23:42:12 +0200289
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100290 detail::function_record *chain = nullptr, *chain_start = rec;
Jason Rhinelander6873c202016-10-24 21:58:22 -0400291 if (rec->sibling) {
292 if (PyCFunction_Check(rec->sibling.ptr())) {
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100293 auto rec_capsule = reinterpret_borrow<capsule>(PyCFunction_GET_SELF(rec->sibling.ptr()));
Jason Rhinelander6873c202016-10-24 21:58:22 -0400294 chain = (detail::function_record *) rec_capsule;
295 /* Never append a method to an overload chain of a parent class;
296 instead, hide the parent's overloads in this case */
Dean Moldovan36f0a152017-02-08 01:01:56 +0100297 if (!chain->scope.is(rec->scope))
Jason Rhinelander6873c202016-10-24 21:58:22 -0400298 chain = nullptr;
299 }
300 // Don't trigger for things like the default __init__, which are wrapper_descriptors that we are intentionally replacing
301 else if (!rec->sibling.is_none() && rec->name[0] != '_')
302 pybind11_fail("Cannot overload existing non-function object \"" + std::string(rec->name) +
303 "\" with a function of the same name");
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +0200304 }
305
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100306 if (!chain) {
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100307 /* No existing overload was found, create a new function object */
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100308 rec->def = new PyMethodDef();
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500309 std::memset(rec->def, 0, sizeof(PyMethodDef));
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100310 rec->def->ml_name = rec->name;
311 rec->def->ml_meth = reinterpret_cast<PyCFunction>(*dispatcher);
312 rec->def->ml_flags = METH_VARARGS | METH_KEYWORDS;
Wenzel Jakoba6501792016-02-04 23:02:07 +0100313
Wenzel Jakobb16421e2017-03-22 22:04:00 +0100314 capsule rec_capsule(rec, [](void *ptr) {
315 destruct((detail::function_record *) ptr);
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100316 });
Wenzel Jakoba6501792016-02-04 23:02:07 +0100317
318 object scope_module;
319 if (rec->scope) {
Dean Moldovan865e4302016-09-21 01:06:32 +0200320 if (hasattr(rec->scope, "__module__")) {
321 scope_module = rec->scope.attr("__module__");
322 } else if (hasattr(rec->scope, "__name__")) {
323 scope_module = rec->scope.attr("__name__");
324 }
Wenzel Jakoba6501792016-02-04 23:02:07 +0100325 }
326
327 m_ptr = PyCFunction_NewEx(rec->def, rec_capsule.ptr(), scope_module.ptr());
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200328 if (!m_ptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100329 pybind11_fail("cpp_function::cpp_function(): Could not allocate function object");
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200330 } else {
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100331 /* Append at the end of the overload chain */
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100332 m_ptr = rec->sibling.ptr();
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200333 inc_ref();
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100334 chain_start = chain;
Jason Rhinelanderd355f2f2017-04-16 22:31:13 -0400335 if (chain->is_method != rec->is_method)
336 pybind11_fail("overloading a method with both static and instance methods is not supported; "
337 #if defined(NDEBUG)
338 "compile in debug mode for more details"
339 #else
340 "error while attempting to bind " + std::string(rec->is_method ? "instance" : "static") + " method " +
341 std::string(pybind11::str(rec->scope.attr("__name__"))) + "." + std::string(rec->name) + signature
342 #endif
343 );
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100344 while (chain->next)
345 chain = chain->next;
346 chain->next = rec;
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200347 }
Wenzel Jakob281aa0e2015-07-30 15:29:00 +0200348
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200349 std::string signatures;
Wenzel Jakob71867832015-07-29 17:43:52 +0200350 int index = 0;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100351 /* Create a nice pydoc rec including all signatures and
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100352 docstrings of the functions in the overload chain */
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100353 if (chain && options::show_function_signatures()) {
Sylvain Corlay0e04fdf2016-03-08 16:42:12 -0500354 // First a generic signature
355 signatures += rec->name;
356 signatures += "(*args, **kwargs)\n";
357 signatures += "Overloaded function.\n\n";
358 }
359 // Then specific overload signatures
Jason Rhinelander10d13042017-03-08 12:32:42 -0500360 bool first_user_def = true;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100361 for (auto it = chain_start; it != nullptr; it = it->next) {
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100362 if (options::show_function_signatures()) {
Jason Rhinelander10d13042017-03-08 12:32:42 -0500363 if (index > 0) signatures += "\n";
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100364 if (chain)
365 signatures += std::to_string(++index) + ". ";
366 signatures += rec->name;
367 signatures += it->signature;
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100368 signatures += "\n";
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100369 }
370 if (it->doc && strlen(it->doc) > 0 && options::show_user_defined_docstrings()) {
Jason Rhinelander10d13042017-03-08 12:32:42 -0500371 // If we're appending another docstring, and aren't printing function signatures, we
372 // need to append a newline first:
373 if (!options::show_function_signatures()) {
374 if (first_user_def) first_user_def = false;
375 else signatures += "\n";
376 }
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100377 if (options::show_function_signatures()) signatures += "\n";
Wenzel Jakob218b6ce2016-02-28 23:52:37 +0100378 signatures += it->doc;
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100379 if (options::show_function_signatures()) signatures += "\n";
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100380 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200381 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100382
383 /* Install docstring */
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200384 PyCFunctionObject *func = (PyCFunctionObject *) m_ptr;
385 if (func->m_ml->ml_doc)
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500386 std::free(const_cast<char *>(func->m_ml->ml_doc));
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200387 func->m_ml->ml_doc = strdup(signatures.c_str());
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100388
Wenzel Jakob31fbf182016-11-20 05:27:05 +0100389 if (rec->is_method) {
390 m_ptr = PYBIND11_INSTANCE_METHOD_NEW(m_ptr, rec->scope.ptr());
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200391 if (!m_ptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100392 pybind11_fail("cpp_function::cpp_function(): Could not allocate instance method object");
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200393 Py_DECREF(func);
394 }
395 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100396
397 /// When a cpp_function is GCed, release any memory allocated by pybind11
398 static void destruct(detail::function_record *rec) {
399 while (rec) {
400 detail::function_record *next = rec->next;
401 if (rec->free_data)
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100402 rec->free_data(rec);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100403 std::free((char *) rec->name);
404 std::free((char *) rec->doc);
405 std::free((char *) rec->signature);
406 for (auto &arg: rec->args) {
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500407 std::free(const_cast<char *>(arg.name));
408 std::free(const_cast<char *>(arg.descr));
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100409 arg.value.dec_ref();
410 }
411 if (rec->def) {
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500412 std::free(const_cast<char *>(rec->def->ml_doc));
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100413 delete rec->def;
414 }
415 delete rec;
416 rec = next;
417 }
418 }
419
420 /// Main dispatch logic for calls to functions bound using pybind11
Jason Rhinelander2686da82017-01-21 23:42:14 -0500421 static PyObject *dispatcher(PyObject *self, PyObject *args_in, PyObject *kwargs_in) {
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500422 using namespace detail;
423
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100424 /* Iterator over the list of potentially admissible overloads */
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500425 function_record *overloads = (function_record *) PyCapsule_GetPointer(self, nullptr),
426 *it = overloads;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100427
428 /* Need to know how many arguments + keyword arguments there are to pick the right overload */
Jason Rhinelander2686da82017-01-21 23:42:14 -0500429 const size_t n_args_in = (size_t) PyTuple_GET_SIZE(args_in);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100430
Jason Rhinelander2686da82017-01-21 23:42:14 -0500431 handle parent = n_args_in > 0 ? PyTuple_GET_ITEM(args_in, 0) : nullptr,
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100432 result = PYBIND11_TRY_NEXT_OVERLOAD;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500433
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200434 auto self_value_and_holder = value_and_holder();
435 if (overloads->is_constructor) {
436 const auto tinfo = get_type_info((PyTypeObject *) overloads->scope.ptr());
437 const auto pi = reinterpret_cast<instance *>(parent.ptr());
438 self_value_and_holder = pi->get_value_and_holder(tinfo, false);
439
440 if (!self_value_and_holder.type || !self_value_and_holder.inst) {
441 PyErr_SetString(PyExc_TypeError, "__init__(self, ...) called with invalid `self` argument");
442 return nullptr;
443 }
444
445 // If this value is already registered it must mean __init__ is invoked multiple times;
446 // we really can't support that in C++, so just ignore the second __init__.
447 if (self_value_and_holder.instance_registered())
448 return none().release().ptr();
449 }
450
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100451 try {
Jason Rhinelandere5505892017-02-03 18:25:34 -0500452 // We do this in two passes: in the first pass, we load arguments with `convert=false`;
453 // in the second, we allow conversion (except for arguments with an explicit
454 // py::arg().noconvert()). This lets us prefer calls without conversion, with
455 // conversion as a fallback.
456 std::vector<function_call> second_pass;
457
458 // However, if there are no overloads, we can just skip the no-convert pass entirely
459 const bool overloaded = it != nullptr && it->next != nullptr;
460
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100461 for (; it != nullptr; it = it->next) {
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500462
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100463 /* For each overload:
Jason Rhinelander2686da82017-01-21 23:42:14 -0500464 1. Copy all positional arguments we were given, also checking to make sure that
465 named positional arguments weren't *also* specified via kwarg.
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100466 2. If we weren't given enough, try to make up the omitted ones by checking
Jason Rhinelander2686da82017-01-21 23:42:14 -0500467 whether they were provided by a kwarg matching the `py::arg("name")` name. If
468 so, use it (and remove it from kwargs; if not, see if the function binding
469 provided a default that we can use.
470 3. Ensure that either all keyword arguments were "consumed", or that the function
471 takes a kwargs argument to accept unconsumed kwargs.
472 4. Any positional arguments still left get put into a tuple (for args), and any
473 leftover kwargs get put into a dict.
474 5. Pack everything into a vector; if we have py::args or py::kwargs, they are an
475 extra tuple or dict at the end of the positional arguments.
476 6. Call the function call dispatcher (function_record::impl)
477
478 If one of these fail, move on to the next overload and keep trying until we get a
479 result other than PYBIND11_TRY_NEXT_OVERLOAD.
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100480 */
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100481
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500482 function_record &func = *it;
483 size_t pos_args = func.nargs; // Number of positional arguments that we need
484 if (func.has_args) --pos_args; // (but don't count py::args
485 if (func.has_kwargs) --pos_args; // or py::kwargs)
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100486
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500487 if (!func.has_args && n_args_in > pos_args)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500488 continue; // Too many arguments for this overload
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100489
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500490 if (n_args_in < pos_args && func.args.size() < pos_args)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500491 continue; // Not enough arguments given, and not enough defaults to fill in the blanks
492
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500493 function_call call(func, parent);
Jason Rhinelander2686da82017-01-21 23:42:14 -0500494
495 size_t args_to_copy = std::min(pos_args, n_args_in);
496 size_t args_copied = 0;
497
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200498 // 0. Inject new-style `self` argument
499 if (func.is_new_style_constructor) {
500 // The `value` may have been preallocated by an old-style `__init__`
501 // if it was a preceding candidate for overload resolution.
502 if (self_value_and_holder)
503 self_value_and_holder.type->dealloc(self_value_and_holder);
504
Dean Moldovan7939f4b2017-09-04 13:49:19 +0200505 call.init_self = PyTuple_GET_ITEM(args_in, 0);
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200506 call.args.push_back(reinterpret_cast<PyObject *>(&self_value_and_holder));
507 call.args_convert.push_back(false);
508 ++args_copied;
509 }
510
Jason Rhinelander2686da82017-01-21 23:42:14 -0500511 // 1. Copy any position arguments given.
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400512 bool bad_arg = false;
Jason Rhinelander2686da82017-01-21 23:42:14 -0500513 for (; args_copied < args_to_copy; ++args_copied) {
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400514 argument_record *arg_rec = args_copied < func.args.size() ? &func.args[args_copied] : nullptr;
515 if (kwargs_in && arg_rec && arg_rec->name && PyDict_GetItemString(kwargs_in, arg_rec->name)) {
516 bad_arg = true;
Jason Rhinelandercaa13792017-02-23 19:54:53 -0500517 break;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100518 }
Jason Rhinelander2686da82017-01-21 23:42:14 -0500519
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400520 handle arg(PyTuple_GET_ITEM(args_in, args_copied));
521 if (arg_rec && !arg_rec->none && arg.is_none()) {
522 bad_arg = true;
523 break;
524 }
525 call.args.push_back(arg);
526 call.args_convert.push_back(arg_rec ? arg_rec->convert : true);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100527 }
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400528 if (bad_arg)
Jason Rhinelandercaa13792017-02-23 19:54:53 -0500529 continue; // Maybe it was meant for another overload (issue #688)
Wenzel Jakobbd57eb42016-05-01 14:42:20 +0200530
Jason Rhinelander2686da82017-01-21 23:42:14 -0500531 // We'll need to copy this if we steal some kwargs for defaults
532 dict kwargs = reinterpret_borrow<dict>(kwargs_in);
533
534 // 2. Check kwargs and, failing that, defaults that may help complete the list
535 if (args_copied < pos_args) {
536 bool copied_kwargs = false;
537
538 for (; args_copied < pos_args; ++args_copied) {
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500539 const auto &arg = func.args[args_copied];
Jason Rhinelander2686da82017-01-21 23:42:14 -0500540
541 handle value;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500542 if (kwargs_in && arg.name)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500543 value = PyDict_GetItemString(kwargs.ptr(), arg.name);
544
545 if (value) {
546 // Consume a kwargs value
547 if (!copied_kwargs) {
548 kwargs = reinterpret_steal<dict>(PyDict_Copy(kwargs.ptr()));
549 copied_kwargs = true;
550 }
551 PyDict_DelItemString(kwargs.ptr(), arg.name);
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100552 } else if (arg.value) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500553 value = arg.value;
554 }
555
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500556 if (value) {
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500557 call.args.push_back(value);
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500558 call.args_convert.push_back(arg.convert);
559 }
Jason Rhinelander2686da82017-01-21 23:42:14 -0500560 else
561 break;
562 }
563
564 if (args_copied < pos_args)
565 continue; // Not enough arguments, defaults, or kwargs to fill the positional arguments
566 }
567
568 // 3. Check everything was consumed (unless we have a kwargs arg)
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500569 if (kwargs && kwargs.size() > 0 && !func.has_kwargs)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500570 continue; // Unconsumed kwargs, but no py::kwargs argument to accept them
571
572 // 4a. If we have a py::args argument, create a new tuple with leftovers
573 tuple extra_args;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500574 if (func.has_args) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500575 if (args_to_copy == 0) {
576 // We didn't copy out any position arguments from the args_in tuple, so we
577 // can reuse it directly without copying:
578 extra_args = reinterpret_borrow<tuple>(args_in);
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100579 } else if (args_copied >= n_args_in) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500580 extra_args = tuple(0);
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100581 } else {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500582 size_t args_size = n_args_in - args_copied;
583 extra_args = tuple(args_size);
584 for (size_t i = 0; i < args_size; ++i) {
585 handle item = PyTuple_GET_ITEM(args_in, args_copied + i);
586 extra_args[i] = item.inc_ref().ptr();
587 }
588 }
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500589 call.args.push_back(extra_args);
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500590 call.args_convert.push_back(false);
Jason Rhinelander2686da82017-01-21 23:42:14 -0500591 }
592
593 // 4b. If we have a py::kwargs, pass on any remaining kwargs
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500594 if (func.has_kwargs) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500595 if (!kwargs.ptr())
596 kwargs = dict(); // If we didn't get one, send an empty one
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500597 call.args.push_back(kwargs);
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500598 call.args_convert.push_back(false);
Jason Rhinelander2686da82017-01-21 23:42:14 -0500599 }
600
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500601 // 5. Put everything in a vector. Not technically step 5, we've been building it
602 // in `call.args` all along.
603 #if !defined(NDEBUG)
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500604 if (call.args.size() != func.nargs || call.args_convert.size() != func.nargs)
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500605 pybind11_fail("Internal error: function call dispatcher inserted wrong number of arguments!");
606 #endif
Jason Rhinelander2686da82017-01-21 23:42:14 -0500607
Jason Rhinelandere5505892017-02-03 18:25:34 -0500608 std::vector<bool> second_pass_convert;
609 if (overloaded) {
610 // We're in the first no-convert pass, so swap out the conversion flags for a
611 // set of all-false flags. If the call fails, we'll swap the flags back in for
612 // the conversion-allowed call below.
613 second_pass_convert.resize(func.nargs, false);
614 call.args_convert.swap(second_pass_convert);
615 }
616
Jason Rhinelander2686da82017-01-21 23:42:14 -0500617 // 6. Call the function.
Wenzel Jakobbd57eb42016-05-01 14:42:20 +0200618 try {
Dean Moldovanaf2dda32017-06-26 20:34:06 +0200619 loader_life_support guard{};
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500620 result = func.impl(call);
Wenzel Jakob00062592016-07-01 16:07:35 +0200621 } catch (reference_cast_error &) {
Wenzel Jakobbd57eb42016-05-01 14:42:20 +0200622 result = PYBIND11_TRY_NEXT_OVERLOAD;
623 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100624
625 if (result.ptr() != PYBIND11_TRY_NEXT_OVERLOAD)
626 break;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500627
Jason Rhinelandere5505892017-02-03 18:25:34 -0500628 if (overloaded) {
629 // The (overloaded) call failed; if the call has at least one argument that
630 // permits conversion (i.e. it hasn't been explicitly specified `.noconvert()`)
631 // then add this call to the list of second pass overloads to try.
632 for (size_t i = func.is_method ? 1 : 0; i < pos_args; i++) {
633 if (second_pass_convert[i]) {
634 // Found one: swap the converting flags back in and store the call for
635 // the second pass.
636 call.args_convert.swap(second_pass_convert);
637 second_pass.push_back(std::move(call));
638 break;
639 }
640 }
641 }
642 }
643
644 if (overloaded && !second_pass.empty() && result.ptr() == PYBIND11_TRY_NEXT_OVERLOAD) {
645 // The no-conversion pass finished without success, try again with conversion allowed
646 for (auto &call : second_pass) {
647 try {
Dean Moldovanaf2dda32017-06-26 20:34:06 +0200648 loader_life_support guard{};
Jason Rhinelandere5505892017-02-03 18:25:34 -0500649 result = call.func.impl(call);
650 } catch (reference_cast_error &) {
651 result = PYBIND11_TRY_NEXT_OVERLOAD;
652 }
653
654 if (result.ptr() != PYBIND11_TRY_NEXT_OVERLOAD)
655 break;
656 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100657 }
Dean Moldovan135ba8d2016-09-10 11:58:02 +0200658 } catch (error_already_set &e) {
659 e.restore();
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400660 return nullptr;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100661 } catch (...) {
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400662 /* When an exception is caught, give each registered exception
663 translator a chance to translate it to a Python exception
664 in reverse order of registration.
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200665
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400666 A translator may choose to do one of the following:
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200667
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400668 - catch the exception and call PyErr_SetString or PyErr_SetObject
669 to set a standard (or custom) Python exception, or
670 - do nothing and let the exception fall through to the next translator, or
671 - delegate translation to the next translator by throwing a new type of exception. */
672
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200673 auto last_exception = std::current_exception();
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500674 auto &registered_exception_translators = get_internals().registered_exception_translators;
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400675 for (auto& translator : registered_exception_translators) {
676 try {
677 translator(last_exception);
678 } catch (...) {
679 last_exception = std::current_exception();
680 continue;
681 }
682 return nullptr;
683 }
684 PyErr_SetString(PyExc_SystemError, "Exception escaped from default exception translator!");
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100685 return nullptr;
686 }
687
Dean Moldovan2b4477e2017-09-09 20:21:34 +0200688 auto append_note_if_missing_header_is_suspected = [](std::string &msg) {
689 if (msg.find("std::") != std::string::npos) {
690 msg += "\n\n"
691 "Did you forget to `#include <pybind11/stl.h>`? Or <pybind11/complex.h>,\n"
692 "<pybind11/functional.h>, <pybind11/chrono.h>, etc. Some automatic\n"
693 "conversions are optional and require extra headers to be included\n"
694 "when compiling your pybind11 module.";
695 }
696 };
697
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100698 if (result.ptr() == PYBIND11_TRY_NEXT_OVERLOAD) {
Wenzel Jakob382484a2016-09-10 15:28:37 +0900699 if (overloads->is_operator)
700 return handle(Py_NotImplemented).inc_ref().ptr();
701
Wenzel Jakobe99ebae2016-09-12 11:44:37 +0900702 std::string msg = std::string(overloads->name) + "(): incompatible " +
703 std::string(overloads->is_constructor ? "constructor" : "function") +
704 " arguments. The following argument types are supported:\n";
705
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100706 int ctr = 0;
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500707 for (function_record *it2 = overloads; it2 != nullptr; it2 = it2->next) {
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100708 msg += " "+ std::to_string(++ctr) + ". ";
Jason Rhinelander4e45e182016-07-17 17:43:00 -0400709
710 bool wrote_sig = false;
711 if (overloads->is_constructor) {
Dean Moldovanecced6c2016-07-31 20:03:18 +0200712 // For a constructor, rewrite `(self: Object, arg0, ...) -> NoneType` as `Object(arg0, ...)`
Jason Rhinelander4e45e182016-07-17 17:43:00 -0400713 std::string sig = it2->signature;
Dean Moldovanecced6c2016-07-31 20:03:18 +0200714 size_t start = sig.find('(') + 7; // skip "(self: "
Jason Rhinelander4e45e182016-07-17 17:43:00 -0400715 if (start < sig.size()) {
716 // End at the , for the next argument
717 size_t end = sig.find(", "), next = end + 2;
718 size_t ret = sig.rfind(" -> ");
719 // Or the ), if there is no comma:
720 if (end >= sig.size()) next = end = sig.find(')');
721 if (start < end && next < sig.size()) {
722 msg.append(sig, start, end - start);
723 msg += '(';
724 msg.append(sig, next, ret - next);
725 wrote_sig = true;
726 }
727 }
728 }
729 if (!wrote_sig) msg += it2->signature;
730
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100731 msg += "\n";
732 }
Wenzel Jakobe99ebae2016-09-12 11:44:37 +0900733 msg += "\nInvoked with: ";
Jason Rhinelander2686da82017-01-21 23:42:14 -0500734 auto args_ = reinterpret_borrow<tuple>(args_in);
Jason Rhinelander231e1672017-02-23 21:04:46 -0500735 bool some_args = false;
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200736 for (size_t ti = overloads->is_constructor ? 1 : 0; ti < args_.size(); ++ti) {
Jason Rhinelander231e1672017-02-23 21:04:46 -0500737 if (!some_args) some_args = true;
738 else msg += ", ";
Jason Rhinelander7146d622016-11-22 05:28:40 -0500739 msg += pybind11::repr(args_[ti]);
Andreas Bergmeier16d43942016-05-24 09:19:35 +0200740 }
Jason Rhinelander231e1672017-02-23 21:04:46 -0500741 if (kwargs_in) {
742 auto kwargs = reinterpret_borrow<dict>(kwargs_in);
743 if (kwargs.size() > 0) {
744 if (some_args) msg += "; ";
745 msg += "kwargs: ";
746 bool first = true;
747 for (auto kwarg : kwargs) {
748 if (first) first = false;
749 else msg += ", ";
750 msg += pybind11::str("{}={!r}").format(kwarg.first, kwarg.second);
751 }
752 }
753 }
754
Dean Moldovan2b4477e2017-09-09 20:21:34 +0200755 append_note_if_missing_header_is_suspected(msg);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100756 PyErr_SetString(PyExc_TypeError, msg.c_str());
757 return nullptr;
758 } else if (!result) {
759 std::string msg = "Unable to convert function return value to a "
760 "Python type! The signature was\n\t";
761 msg += it->signature;
Dean Moldovan2b4477e2017-09-09 20:21:34 +0200762 append_note_if_missing_header_is_suspected(msg);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100763 PyErr_SetString(PyExc_TypeError, msg.c_str());
764 return nullptr;
765 } else {
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200766 if (overloads->is_constructor && !self_value_and_holder.holder_constructed()) {
Jason Rhinelander464d9892017-06-12 21:52:48 -0400767 auto *pi = reinterpret_cast<instance *>(parent.ptr());
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200768 self_value_and_holder.type->init_instance(pi, nullptr);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100769 }
770 return result.ptr();
771 }
772 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200773};
774
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100775/// Wrapper for Python extension modules
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200776class module : public object {
777public:
Wenzel Jakobb1b71402015-10-18 16:48:30 +0200778 PYBIND11_OBJECT_DEFAULT(module, object, PyModule_Check)
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200779
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100780 /// Create a new top-level Python module with the given name and docstring
Jason Rhinelander12d76602016-10-16 16:27:42 -0400781 explicit module(const char *name, const char *doc = nullptr) {
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100782 if (!options::show_user_defined_docstrings()) doc = nullptr;
Wenzel Jakob57082212015-09-04 23:42:12 +0200783#if PY_MAJOR_VERSION >= 3
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200784 PyModuleDef *def = new PyModuleDef();
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500785 std::memset(def, 0, sizeof(PyModuleDef));
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200786 def->m_name = name;
787 def->m_doc = doc;
788 def->m_size = -1;
789 Py_INCREF(def);
790 m_ptr = PyModule_Create(def);
Wenzel Jakob57082212015-09-04 23:42:12 +0200791#else
792 m_ptr = Py_InitModule3(name, nullptr, doc);
793#endif
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200794 if (m_ptr == nullptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100795 pybind11_fail("Internal error in module::module()");
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200796 inc_ref();
797 }
798
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100799 /** \rst
800 Create Python binding for a new function within the module scope. ``Func``
801 can be a plain C++ function, a function pointer, or a lambda function. For
802 details on the ``Extra&& ... extra`` argument, see section :ref:`extras`.
803 \endrst */
Wenzel Jakob71867832015-07-29 17:43:52 +0200804 template <typename Func, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100805 module &def(const char *name_, Func &&f, const Extra& ... extra) {
Dean Moldovan865e4302016-09-21 01:06:32 +0200806 cpp_function func(std::forward<Func>(f), name(name_), scope(*this),
807 sibling(getattr(*this, name_, none())), extra...);
Jason Rhinelander6873c202016-10-24 21:58:22 -0400808 // NB: allow overwriting here because cpp_function sets up a chain with the intention of
809 // overwriting (and has already checked internally that it isn't overwriting non-functions).
810 add_object(name_, func, true /* overwrite */);
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200811 return *this;
812 }
813
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100814 /** \rst
815 Create and return a new Python submodule with the given name and docstring.
816 This also works recursively, i.e.
817
818 .. code-block:: cpp
819
820 py::module m("example", "pybind11 example plugin");
821 py::module m2 = m.def_submodule("sub", "A submodule of 'example'");
822 py::module m3 = m2.def_submodule("subsub", "A submodule of 'example.sub'");
823 \endrst */
Wenzel Jakobbd4a5292015-07-11 17:41:48 +0200824 module def_submodule(const char *name, const char *doc = nullptr) {
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200825 std::string full_name = std::string(PyModule_GetName(m_ptr))
826 + std::string(".") + std::string(name);
Dean Moldovanc7ac16b2016-10-28 03:08:15 +0200827 auto result = reinterpret_borrow<module>(PyImport_AddModule(full_name.c_str()));
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100828 if (doc && options::show_user_defined_docstrings())
Wenzel Jakob8f4eb002015-10-15 18:13:33 +0200829 result.attr("__doc__") = pybind11::str(doc);
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200830 attr(name) = result;
831 return result;
832 }
Wenzel Jakobdb028d62015-10-13 23:44:25 +0200833
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100834 /// Import and return a module or throws `error_already_set`.
Wenzel Jakobdb028d62015-10-13 23:44:25 +0200835 static module import(const char *name) {
Wenzel Jakobdd57a342015-12-26 14:04:52 +0100836 PyObject *obj = PyImport_ImportModule(name);
837 if (!obj)
esquires67a68f12016-12-01 05:35:34 -0500838 throw error_already_set();
Dean Moldovanc7ac16b2016-10-28 03:08:15 +0200839 return reinterpret_steal<module>(obj);
Wenzel Jakobdb028d62015-10-13 23:44:25 +0200840 }
Jason Rhinelander6873c202016-10-24 21:58:22 -0400841
Gunnar Läthénc64e6b12017-09-12 08:05:05 +0200842 /// Reload the module or throws `error_already_set`.
843 void reload() {
844 PyObject *obj = PyImport_ReloadModule(ptr());
845 if (!obj)
846 throw error_already_set();
847 *this = reinterpret_steal<module>(obj);
848 }
849
Jason Rhinelander6873c202016-10-24 21:58:22 -0400850 // Adds an object to the module using the given name. Throws if an object with the given name
851 // already exists.
852 //
853 // overwrite should almost always be false: attempting to overwrite objects that pybind11 has
854 // established will, in most cases, break things.
Wenzel Jakobaa1b3162017-03-30 11:59:32 +0200855 PYBIND11_NOINLINE void add_object(const char *name, handle obj, bool overwrite = false) {
Jason Rhinelander6873c202016-10-24 21:58:22 -0400856 if (!overwrite && hasattr(*this, name))
857 pybind11_fail("Error during initialization: multiple incompatible definitions with name \"" +
858 std::string(name) + "\"");
859
Wenzel Jakobaa1b3162017-03-30 11:59:32 +0200860 PyModule_AddObject(ptr(), name, obj.inc_ref().ptr() /* steals a reference */);
Jason Rhinelander6873c202016-10-24 21:58:22 -0400861 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200862};
863
Dean Moldovan22c413b2017-03-30 00:20:42 +0200864/// \ingroup python_builtins
Dean Moldovan1d3c4bc2017-06-06 17:05:19 +0200865/// Return a dictionary representing the global variables in the current execution frame,
866/// or ``__main__.__dict__`` if there is no frame (usually when the interpreter is embedded).
867inline dict globals() {
868 PyObject *p = PyEval_GetGlobals();
869 return reinterpret_borrow<dict>(p ? p : module::import("__main__").attr("__dict__").ptr());
870}
Dean Moldovan22c413b2017-03-30 00:20:42 +0200871
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200872NAMESPACE_BEGIN(detail)
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100873/// Generic support for creating new Python heap types
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100874class generic_type : public object {
Jason Rhinelander5fffe202016-09-06 12:17:06 -0400875 template <typename...> friend class class_;
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200876public:
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100877 PYBIND11_OBJECT_DEFAULT(generic_type, object, PyType_Check)
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100878protected:
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100879 void initialize(const type_record &rec) {
880 if (rec.scope && hasattr(rec.scope, rec.name))
881 pybind11_fail("generic_type: cannot initialize type \"" + std::string(rec.name) +
882 "\": an object with that name is already defined");
Wenzel Jakob38d8b8c2016-05-31 09:53:28 +0200883
Jason Rhinelander5e14aa62017-08-17 11:38:05 -0400884 if (rec.module_local ? get_local_type_info(*rec.type) : get_global_type_info(*rec.type))
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100885 pybind11_fail("generic_type: type \"" + std::string(rec.name) +
Wenzel Jakob38d8b8c2016-05-31 09:53:28 +0200886 "\" is already registered!");
887
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100888 m_ptr = make_new_python_type(rec);
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200889
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100890 /* Register supplemental type information in C++ dict */
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100891 auto *tinfo = new detail::type_info();
892 tinfo->type = (PyTypeObject *) m_ptr;
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400893 tinfo->cpptype = rec.type;
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100894 tinfo->type_size = rec.type_size;
Dean Moldovan0d765f42017-03-21 01:15:20 +0100895 tinfo->operator_new = rec.operator_new;
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500896 tinfo->holder_size_in_ptrs = size_in_ptrs(rec.holder_size);
Jason Rhinelander353615f2017-07-25 00:53:23 -0400897 tinfo->init_instance = rec.init_instance;
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100898 tinfo->dealloc = rec.dealloc;
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400899 tinfo->simple_type = true;
900 tinfo->simple_ancestors = true;
Jason Rhinelander7437c692017-07-28 22:03:44 -0400901 tinfo->default_holder = rec.default_holder;
902 tinfo->module_local = rec.module_local;
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100903
904 auto &internals = get_internals();
905 auto tindex = std::type_index(*rec.type);
Ivan Smirnova6e6a8b2016-10-23 15:27:13 +0100906 tinfo->direct_conversions = &internals.direct_conversions[tindex];
Jason Rhinelander7437c692017-07-28 22:03:44 -0400907 if (rec.module_local)
908 registered_local_types_cpp()[tindex] = tinfo;
909 else
910 internals.registered_types_cpp[tindex] = tinfo;
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500911 internals.registered_types_py[(PyTypeObject *) m_ptr] = { tinfo };
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100912
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400913 if (rec.bases.size() > 1 || rec.multiple_inheritance) {
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100914 mark_parents_nonsimple(tinfo->type);
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400915 tinfo->simple_ancestors = false;
916 }
917 else if (rec.bases.size() == 1) {
918 auto parent_tinfo = get_type_info((PyTypeObject *) rec.bases[0].ptr());
919 tinfo->simple_ancestors = parent_tinfo->simple_ancestors;
920 }
Jason Rhinelander5e14aa62017-08-17 11:38:05 -0400921
922 if (rec.module_local) {
923 // Stash the local typeinfo and loader so that external modules can access it.
924 tinfo->module_local_load = &type_caster_generic::local_load;
Dean Moldovan96997a42017-08-20 17:14:09 +0200925 setattr(m_ptr, PYBIND11_MODULE_LOCAL_ID, capsule(tinfo));
Jason Rhinelander5e14aa62017-08-17 11:38:05 -0400926 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200927 }
928
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +0900929 /// Helper function which tags all parents of a type using mult. inheritance
930 void mark_parents_nonsimple(PyTypeObject *value) {
Dean Moldovanc7ac16b2016-10-28 03:08:15 +0200931 auto t = reinterpret_borrow<tuple>(value->tp_bases);
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +0900932 for (handle h : t) {
933 auto tinfo2 = get_type_info((PyTypeObject *) h.ptr());
934 if (tinfo2)
935 tinfo2->simple_type = false;
936 mark_parents_nonsimple((PyTypeObject *) h.ptr());
937 }
938 }
939
Wenzel Jakob43398a82015-07-28 16:12:20 +0200940 void install_buffer_funcs(
941 buffer_info *(*get_buffer)(PyObject *, void *),
942 void *get_buffer_data) {
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200943 PyHeapTypeObject *type = (PyHeapTypeObject*) m_ptr;
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100944 auto tinfo = detail::get_type_info(&type->ht_type);
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100945
946 if (!type->ht_type.tp_as_buffer)
947 pybind11_fail(
948 "To be able to register buffer protocol support for the type '" +
949 std::string(tinfo->type->tp_name) +
950 "' the associated class<>(..) invocation must "
951 "include the pybind11::buffer_protocol() annotation!");
952
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100953 tinfo->get_buffer = get_buffer;
954 tinfo->get_buffer_data = get_buffer_data;
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200955 }
956
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100957 void def_property_static_impl(const char *name,
958 handle fget, handle fset,
959 detail::function_record *rec_fget) {
Dean Moldovanc91f8bd2017-02-13 18:11:24 +0100960 const auto is_static = !(rec_fget->is_method && rec_fget->scope);
961 const auto has_doc = rec_fget->doc && pybind11::options::show_user_defined_docstrings();
962
Dean Moldovanc91f8bd2017-02-13 18:11:24 +0100963 auto property = handle((PyObject *) (is_static ? get_internals().static_property_type
964 : &PyProperty_Type));
965 attr(name) = property(fget.ptr() ? fget : none(),
966 fset.ptr() ? fset : none(),
967 /*deleter*/none(),
968 pybind11::str(has_doc ? rec_fget->doc : ""));
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100969 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200970};
Jason Rhinelander6b52c832016-09-06 12:27:00 -0400971
Dean Moldovan0d765f42017-03-21 01:15:20 +0100972/// Set the pointer to operator new if it exists. The cast is needed because it can be overloaded.
973template <typename T, typename = void_t<decltype(static_cast<void *(*)(size_t)>(T::operator new))>>
974void set_operator_new(type_record *r) { r->operator_new = &T::operator new; }
975
976template <typename> void set_operator_new(...) { }
977
Jason Rhinelandera03408c2017-07-23 00:32:58 -0400978template <typename T, typename SFINAE = void> struct has_operator_delete : std::false_type { };
979template <typename T> struct has_operator_delete<T, void_t<decltype(static_cast<void (*)(void *)>(T::operator delete))>>
980 : std::true_type { };
981template <typename T, typename SFINAE = void> struct has_operator_delete_size : std::false_type { };
982template <typename T> struct has_operator_delete_size<T, void_t<decltype(static_cast<void (*)(void *, size_t)>(T::operator delete))>>
983 : std::true_type { };
Dean Moldovan0d765f42017-03-21 01:15:20 +0100984/// Call class-specific delete if it exists or global otherwise. Can also be an overload set.
Jason Rhinelandera03408c2017-07-23 00:32:58 -0400985template <typename T, enable_if_t<has_operator_delete<T>::value, int> = 0>
986void call_operator_delete(T *p, size_t) { T::operator delete(p); }
987template <typename T, enable_if_t<!has_operator_delete<T>::value && has_operator_delete_size<T>::value, int> = 0>
988void call_operator_delete(T *p, size_t s) { T::operator delete(p, s); }
Dean Moldovan0d765f42017-03-21 01:15:20 +0100989
Jason Rhinelandera03408c2017-07-23 00:32:58 -0400990inline void call_operator_delete(void *p, size_t) { ::operator delete(p); }
Dean Moldovan0d765f42017-03-21 01:15:20 +0100991
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200992NAMESPACE_END(detail)
993
Jason Rhinelander23bf8942017-05-16 11:07:28 -0400994/// Given a pointer to a member function, cast it to its `Derived` version.
995/// Forward everything else unchanged.
996template <typename /*Derived*/, typename F>
997auto method_adaptor(F &&f) -> decltype(std::forward<F>(f)) { return std::forward<F>(f); }
998
999template <typename Derived, typename Return, typename Class, typename... Args>
Jason Rhinelander76722922017-10-03 10:09:49 -03001000auto method_adaptor(Return (Class::*pmf)(Args...)) -> Return (Derived::*)(Args...) {
1001 static_assert(detail::is_accessible_base_of<Class, Derived>::value,
1002 "Cannot bind an inaccessible base class method; use a lambda definition instead");
1003 return pmf;
1004}
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001005
1006template <typename Derived, typename Return, typename Class, typename... Args>
Jason Rhinelander76722922017-10-03 10:09:49 -03001007auto method_adaptor(Return (Class::*pmf)(Args...) const) -> Return (Derived::*)(Args...) const {
1008 static_assert(detail::is_accessible_base_of<Class, Derived>::value,
1009 "Cannot bind an inaccessible base class method; use a lambda definition instead");
1010 return pmf;
1011}
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001012
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001013template <typename type_, typename... options>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001014class class_ : public detail::generic_type {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001015 template <typename T> using is_holder = detail::is_holder_type<type_, T>;
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001016 template <typename T> using is_subtype = detail::is_strict_base_of<type_, T>;
1017 template <typename T> using is_base = detail::is_strict_base_of<T, type_>;
Jason Rhinelanderfa5d05e2016-12-12 18:11:49 -05001018 // struct instead of using here to help MSVC:
1019 template <typename T> struct is_valid_class_option :
1020 detail::any_of<is_holder<T>, is_subtype<T>, is_base<T>> {};
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001021
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001022public:
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001023 using type = type_;
Dean Moldovan82ece942017-03-29 11:55:18 +02001024 using type_alias = detail::exactly_one_t<is_subtype, void, options...>;
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001025 constexpr static bool has_alias = !std::is_void<type_alias>::value;
Dean Moldovan82ece942017-03-29 11:55:18 +02001026 using holder_type = detail::exactly_one_t<is_holder, std::unique_ptr<type>, options...>;
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001027
Jason Rhinelanderfa5d05e2016-12-12 18:11:49 -05001028 static_assert(detail::all_of<is_valid_class_option<options>...>::value,
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001029 "Unknown/invalid class_ template parameters provided");
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001030
Jason Rhinelander42e5ddc2017-06-12 21:48:36 -04001031 static_assert(!has_alias || std::is_polymorphic<type>::value,
1032 "Cannot use an alias class with a non-polymorphic type");
1033
Dean Moldovanc7ac16b2016-10-28 03:08:15 +02001034 PYBIND11_OBJECT(class_, generic_type, PyType_Check)
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001035
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001036 template <typename... Extra>
1037 class_(handle scope, const char *name, const Extra &... extra) {
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001038 using namespace detail;
1039
1040 // MI can only be specified via class_ template options, not constructor parameters
1041 static_assert(
1042 none_of<is_pyobject<Extra>...>::value || // no base class arguments, or:
1043 ( constexpr_sum(is_pyobject<Extra>::value...) == 1 && // Exactly one base
1044 constexpr_sum(is_base<options>::value...) == 0 && // no template option bases
1045 none_of<std::is_same<multiple_inheritance, Extra>...>::value), // no multiple_inheritance attr
1046 "Error: multiple inheritance bases must be specified via class_ template options");
1047
1048 type_record record;
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001049 record.scope = scope;
1050 record.name = name;
1051 record.type = &typeid(type);
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001052 record.type_size = sizeof(conditional_t<has_alias, type_alias, type>);
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001053 record.holder_size = sizeof(holder_type);
Jason Rhinelander353615f2017-07-25 00:53:23 -04001054 record.init_instance = init_instance;
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001055 record.dealloc = dealloc;
Pim Schellartcc88aae2017-01-31 10:52:11 -05001056 record.default_holder = std::is_same<holder_type, std::unique_ptr<type>>::value;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001057
Dean Moldovan0d765f42017-03-21 01:15:20 +01001058 set_operator_new<type>(&record);
1059
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001060 /* Register base classes specified via template arguments to class_, if any */
Jason Rhinelander926e2cf2017-03-25 22:41:06 -03001061 PYBIND11_EXPAND_SIDE_EFFECTS(add_base<options>(record));
Jason Rhinelander6b52c832016-09-06 12:27:00 -04001062
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001063 /* Process optional arguments, if any */
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001064 process_attributes<Extra...>::init(extra..., &record);
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001065
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001066 generic_type::initialize(record);
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001067
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001068 if (has_alias) {
Jason Rhinelander7437c692017-07-28 22:03:44 -04001069 auto &instances = record.module_local ? registered_local_types_cpp() : get_internals().registered_types_cpp;
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001070 instances[std::type_index(typeid(type_alias))] = instances[std::type_index(typeid(type))];
1071 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001072 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001073
Wenzel Jakobc1fc27e2016-09-13 00:36:43 +09001074 template <typename Base, detail::enable_if_t<is_base<Base>::value, int> = 0>
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001075 static void add_base(detail::type_record &rec) {
Jason Rhinelander21966962017-06-21 13:38:10 -04001076 rec.add_base(typeid(Base), [](void *src) -> void * {
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001077 return static_cast<Base *>(reinterpret_cast<type *>(src));
1078 });
1079 }
1080
Wenzel Jakobc1fc27e2016-09-13 00:36:43 +09001081 template <typename Base, detail::enable_if_t<!is_base<Base>::value, int> = 0>
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001082 static void add_base(detail::type_record &) { }
1083
Wenzel Jakob71867832015-07-29 17:43:52 +02001084 template <typename Func, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001085 class_ &def(const char *name_, Func&& f, const Extra&... extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001086 cpp_function cf(method_adaptor<type>(std::forward<Func>(f)), name(name_), is_method(*this),
Dean Moldovan865e4302016-09-21 01:06:32 +02001087 sibling(getattr(*this, name_, none())), extra...);
Wenzel Jakob57082212015-09-04 23:42:12 +02001088 attr(cf.name()) = cf;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001089 return *this;
1090 }
1091
Wenzel Jakob71867832015-07-29 17:43:52 +02001092 template <typename Func, typename... Extra> class_ &
Jason Rhinelander139a0822017-03-12 17:59:07 -03001093 def_static(const char *name_, Func &&f, const Extra&... extra) {
1094 static_assert(!std::is_member_function_pointer<Func>::value,
1095 "def_static(...) called with a non-static member function pointer");
Dean Moldovan865e4302016-09-21 01:06:32 +02001096 cpp_function cf(std::forward<Func>(f), name(name_), scope(*this),
1097 sibling(getattr(*this, name_, none())), extra...);
Wenzel Jakob57082212015-09-04 23:42:12 +02001098 attr(cf.name()) = cf;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001099 return *this;
1100 }
1101
Wenzel Jakob71867832015-07-29 17:43:52 +02001102 template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001103 class_ &def(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001104 op.execute(*this, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001105 return *this;
1106 }
1107
Wenzel Jakob71867832015-07-29 17:43:52 +02001108 template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001109 class_ & def_cast(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001110 op.execute_cast(*this, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001111 return *this;
1112 }
1113
Wenzel Jakob71867832015-07-29 17:43:52 +02001114 template <typename... Args, typename... Extra>
Jason Rhinelanderc4e18002017-08-17 00:01:42 -04001115 class_ &def(const detail::initimpl::constructor<Args...> &init, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001116 init.execute(*this, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001117 return *this;
1118 }
1119
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001120 template <typename... Args, typename... Extra>
Jason Rhinelanderc4e18002017-08-17 00:01:42 -04001121 class_ &def(const detail::initimpl::alias_constructor<Args...> &init, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001122 init.execute(*this, extra...);
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001123 return *this;
1124 }
1125
Jason Rhinelander464d9892017-06-12 21:52:48 -04001126 template <typename... Args, typename... Extra>
1127 class_ &def(detail::initimpl::factory<Args...> &&init, const Extra&... extra) {
1128 std::move(init).execute(*this, extra...);
1129 return *this;
1130 }
1131
Dean Moldovan1e5a7da2017-08-24 01:53:15 +02001132 template <typename... Args, typename... Extra>
1133 class_ &def(detail::initimpl::pickle_factory<Args...> &&pf, const Extra &...extra) {
1134 std::move(pf).execute(*this, extra...);
1135 return *this;
1136 }
1137
Wenzel Jakob71867832015-07-29 17:43:52 +02001138 template <typename Func> class_& def_buffer(Func &&func) {
Wenzel Jakob43398a82015-07-28 16:12:20 +02001139 struct capture { Func func; };
1140 capture *ptr = new capture { std::forward<Func>(func) };
1141 install_buffer_funcs([](PyObject *obj, void *ptr) -> buffer_info* {
Dean Moldovan5f07fac2017-01-03 11:52:05 +01001142 detail::make_caster<type> caster;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001143 if (!caster.load(obj, false))
1144 return nullptr;
Wenzel Jakob43398a82015-07-28 16:12:20 +02001145 return new buffer_info(((capture *) ptr)->func(caster));
1146 }, ptr);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001147 return *this;
1148 }
1149
Bruce Merryfe0cf8b2017-05-17 10:52:33 +02001150 template <typename Return, typename Class, typename... Args>
1151 class_ &def_buffer(Return (Class::*func)(Args...)) {
1152 return def_buffer([func] (type &obj) { return (obj.*func)(); });
1153 }
1154
1155 template <typename Return, typename Class, typename... Args>
1156 class_ &def_buffer(Return (Class::*func)(Args...) const) {
1157 return def_buffer([func] (const type &obj) { return (obj.*func)(); });
1158 }
1159
Wenzel Jakob71867832015-07-29 17:43:52 +02001160 template <typename C, typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001161 class_ &def_readwrite(const char *name, D C::*pm, const Extra&... extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001162 static_assert(std::is_base_of<C, type>::value, "def_readwrite() requires a class member (or base class member)");
1163 cpp_function fget([pm](const type &c) -> const D &{ return c.*pm; }, is_method(*this)),
1164 fset([pm](type &c, const D &value) { c.*pm = value; }, is_method(*this));
Wenzel Jakob0b489582016-03-25 16:13:10 +01001165 def_property(name, fget, fset, return_value_policy::reference_internal, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001166 return *this;
1167 }
1168
Wenzel Jakob71867832015-07-29 17:43:52 +02001169 template <typename C, typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001170 class_ &def_readonly(const char *name, const D C::*pm, const Extra& ...extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001171 static_assert(std::is_base_of<C, type>::value, "def_readonly() requires a class member (or base class member)");
1172 cpp_function fget([pm](const type &c) -> const D &{ return c.*pm; }, is_method(*this));
Wenzel Jakob0b489582016-03-25 16:13:10 +01001173 def_property_readonly(name, fget, return_value_policy::reference_internal, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001174 return *this;
1175 }
1176
Wenzel Jakob71867832015-07-29 17:43:52 +02001177 template <typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001178 class_ &def_readwrite_static(const char *name, D *pm, const Extra& ...extra) {
Wenzel Jakob0b489582016-03-25 16:13:10 +01001179 cpp_function fget([pm](object) -> const D &{ return *pm; }, scope(*this)),
1180 fset([pm](object, const D &value) { *pm = value; }, scope(*this));
1181 def_property_static(name, fget, fset, return_value_policy::reference, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001182 return *this;
1183 }
1184
Wenzel Jakob71867832015-07-29 17:43:52 +02001185 template <typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001186 class_ &def_readonly_static(const char *name, const D *pm, const Extra& ...extra) {
Wenzel Jakob0b489582016-03-25 16:13:10 +01001187 cpp_function fget([pm](object) -> const D &{ return *pm; }, scope(*this));
1188 def_property_readonly_static(name, fget, return_value_policy::reference, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001189 return *this;
1190 }
1191
Dean Moldovan03f627e2016-11-01 11:44:57 +01001192 /// Uses return_value_policy::reference_internal by default
1193 template <typename Getter, typename... Extra>
1194 class_ &def_property_readonly(const char *name, const Getter &fget, const Extra& ...extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001195 return def_property_readonly(name, cpp_function(method_adaptor<type>(fget)),
1196 return_value_policy::reference_internal, extra...);
Dean Moldovan03f627e2016-11-01 11:44:57 +01001197 }
1198
1199 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001200 template <typename... Extra>
1201 class_ &def_property_readonly(const char *name, const cpp_function &fget, const Extra& ...extra) {
Dean Moldovan03f627e2016-11-01 11:44:57 +01001202 return def_property(name, fget, cpp_function(), extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001203 }
1204
Dean Moldovan03f627e2016-11-01 11:44:57 +01001205 /// Uses return_value_policy::reference by default
1206 template <typename Getter, typename... Extra>
1207 class_ &def_property_readonly_static(const char *name, const Getter &fget, const Extra& ...extra) {
1208 return def_property_readonly_static(name, cpp_function(fget), return_value_policy::reference, extra...);
1209 }
1210
1211 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001212 template <typename... Extra>
1213 class_ &def_property_readonly_static(const char *name, const cpp_function &fget, const Extra& ...extra) {
Dean Moldovan03f627e2016-11-01 11:44:57 +01001214 return def_property_static(name, fget, cpp_function(), extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001215 }
1216
Dean Moldovan03f627e2016-11-01 11:44:57 +01001217 /// Uses return_value_policy::reference_internal by default
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001218 template <typename Getter, typename Setter, typename... Extra>
1219 class_ &def_property(const char *name, const Getter &fget, const Setter &fset, const Extra& ...extra) {
1220 return def_property(name, fget, cpp_function(method_adaptor<type>(fset)), extra...);
1221 }
Dean Moldovan03f627e2016-11-01 11:44:57 +01001222 template <typename Getter, typename... Extra>
1223 class_ &def_property(const char *name, const Getter &fget, const cpp_function &fset, const Extra& ...extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001224 return def_property(name, cpp_function(method_adaptor<type>(fget)), fset,
1225 return_value_policy::reference_internal, extra...);
Dean Moldovan03f627e2016-11-01 11:44:57 +01001226 }
1227
1228 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001229 template <typename... Extra>
1230 class_ &def_property(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
Wenzel Jakob0b489582016-03-25 16:13:10 +01001231 return def_property_static(name, fget, fset, is_method(*this), extra...);
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001232 }
1233
Dean Moldovan03f627e2016-11-01 11:44:57 +01001234 /// Uses return_value_policy::reference by default
1235 template <typename Getter, typename... Extra>
1236 class_ &def_property_static(const char *name, const Getter &fget, const cpp_function &fset, const Extra& ...extra) {
1237 return def_property_static(name, cpp_function(fget), fset, return_value_policy::reference, extra...);
1238 }
1239
1240 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001241 template <typename... Extra>
1242 class_ &def_property_static(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
1243 auto rec_fget = get_function_record(fget), rec_fset = get_function_record(fset);
Wenzel Jakob7c99ff22016-06-02 20:33:01 +02001244 char *doc_prev = rec_fget->doc; /* 'extra' field may include a property-specific documentation string */
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001245 detail::process_attributes<Extra...>::init(extra..., rec_fget);
Wenzel Jakob7c99ff22016-06-02 20:33:01 +02001246 if (rec_fget->doc && rec_fget->doc != doc_prev) {
1247 free(doc_prev);
1248 rec_fget->doc = strdup(rec_fget->doc);
1249 }
1250 if (rec_fset) {
1251 doc_prev = rec_fset->doc;
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001252 detail::process_attributes<Extra...>::init(extra..., rec_fset);
Wenzel Jakob7c99ff22016-06-02 20:33:01 +02001253 if (rec_fset->doc && rec_fset->doc != doc_prev) {
1254 free(doc_prev);
1255 rec_fset->doc = strdup(rec_fset->doc);
1256 }
1257 }
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001258 def_property_static_impl(name, fget, fset, rec_fget);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001259 return *this;
1260 }
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001261
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001262private:
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001263 /// Initialize holder object, variant 1: object derives from enable_shared_from_this
1264 template <typename T>
Jason Rhinelander353615f2017-07-25 00:53:23 -04001265 static void init_holder(detail::instance *inst, detail::value_and_holder &v_h,
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001266 const holder_type * /* unused */, const std::enable_shared_from_this<T> * /* dummy */) {
Wenzel Jakob6e213c92015-11-24 23:05:58 +01001267 try {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001268 auto sh = std::dynamic_pointer_cast<typename holder_type::element_type>(
1269 v_h.value_ptr<type>()->shared_from_this());
Jason Rhinelanderb8ac4382017-05-19 13:34:55 -04001270 if (sh) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001271 new (&v_h.holder<holder_type>()) holder_type(std::move(sh));
1272 v_h.set_holder_constructed();
Dean Moldovanab90ec62016-12-07 02:36:44 +01001273 }
Jason Rhinelanderb8ac4382017-05-19 13:34:55 -04001274 } catch (const std::bad_weak_ptr &) {}
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001275
1276 if (!v_h.holder_constructed() && inst->owned) {
1277 new (&v_h.holder<holder_type>()) holder_type(v_h.value_ptr<type>());
1278 v_h.set_holder_constructed();
Wenzel Jakob6e213c92015-11-24 23:05:58 +01001279 }
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001280 }
1281
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001282 static void init_holder_from_existing(const detail::value_and_holder &v_h,
1283 const holder_type *holder_ptr, std::true_type /*is_copy_constructible*/) {
1284 new (&v_h.holder<holder_type>()) holder_type(*reinterpret_cast<const holder_type *>(holder_ptr));
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001285 }
1286
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001287 static void init_holder_from_existing(const detail::value_and_holder &v_h,
1288 const holder_type *holder_ptr, std::false_type /*is_copy_constructible*/) {
1289 new (&v_h.holder<holder_type>()) holder_type(std::move(*const_cast<holder_type *>(holder_ptr)));
Dean Moldovanec009a72017-01-31 17:05:44 +01001290 }
1291
1292 /// Initialize holder object, variant 2: try to construct from existing holder object, if possible
Jason Rhinelander353615f2017-07-25 00:53:23 -04001293 static void init_holder(detail::instance *inst, detail::value_and_holder &v_h,
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001294 const holder_type *holder_ptr, const void * /* dummy -- not enable_shared_from_this<T>) */) {
Dean Moldovanec009a72017-01-31 17:05:44 +01001295 if (holder_ptr) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001296 init_holder_from_existing(v_h, holder_ptr, std::is_copy_constructible<holder_type>());
1297 v_h.set_holder_constructed();
Dean Moldovanec009a72017-01-31 17:05:44 +01001298 } else if (inst->owned || detail::always_construct_holder<holder_type>::value) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001299 new (&v_h.holder<holder_type>()) holder_type(v_h.value_ptr<type>());
1300 v_h.set_holder_constructed();
Jason Rhinelanderc07ec312016-11-06 13:12:48 -05001301 }
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001302 }
1303
Jason Rhinelander353615f2017-07-25 00:53:23 -04001304 /// Performs instance initialization including constructing a holder and registering the known
1305 /// instance. Should be called as soon as the `type` value_ptr is set for an instance. Takes an
1306 /// optional pointer to an existing holder to use; if not specified and the instance is
1307 /// `.owned`, a new holder will be constructed to manage the value pointer.
1308 static void init_instance(detail::instance *inst, const void *holder_ptr) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001309 auto v_h = inst->get_value_and_holder(detail::get_type_info(typeid(type)));
Jason Rhinelandercca20a72017-07-29 03:56:01 -04001310 if (!v_h.instance_registered()) {
1311 register_instance(inst, v_h.value_ptr(), v_h.type);
1312 v_h.set_instance_registered();
1313 }
Jason Rhinelander353615f2017-07-25 00:53:23 -04001314 init_holder(inst, v_h, (const holder_type *) holder_ptr, v_h.value_ptr<type>());
Wenzel Jakob6e213c92015-11-24 23:05:58 +01001315 }
1316
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001317 /// Deallocates an instance; via holder, if constructed; otherwise via operator delete.
Jason Rhinelander464d9892017-06-12 21:52:48 -04001318 static void dealloc(detail::value_and_holder &v_h) {
1319 if (v_h.holder_constructed()) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001320 v_h.holder<holder_type>().~holder_type();
Jason Rhinelander464d9892017-06-12 21:52:48 -04001321 v_h.set_holder_constructed(false);
1322 }
1323 else {
Jason Rhinelandera03408c2017-07-23 00:32:58 -04001324 detail::call_operator_delete(v_h.value_ptr<type>(), v_h.type->type_size);
Jason Rhinelander464d9892017-06-12 21:52:48 -04001325 }
1326 v_h.value_ptr() = nullptr;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001327 }
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001328
1329 static detail::function_record *get_function_record(handle h) {
1330 h = detail::get_function(h);
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001331 return h ? (detail::function_record *) reinterpret_borrow<capsule>(PyCFunction_GET_SELF(h.ptr()))
Dean Moldovanc7ac16b2016-10-28 03:08:15 +02001332 : nullptr;
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001333 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001334};
1335
Dean Moldovan68986792017-08-30 23:40:55 +02001336/// Binds an existing constructor taking arguments Args...
1337template <typename... Args> detail::initimpl::constructor<Args...> init() { return {}; }
1338/// Like `init<Args...>()`, but the instance is always constructed through the alias class (even
1339/// when not inheriting on the Python side).
1340template <typename... Args> detail::initimpl::alias_constructor<Args...> init_alias() { return {}; }
1341
1342/// Binds a factory function as a constructor
1343template <typename Func, typename Ret = detail::initimpl::factory<Func>>
1344Ret init(Func &&f) { return {std::forward<Func>(f)}; }
1345
1346/// Dual-argument factory function: the first function is called when no alias is needed, the second
1347/// when an alias is needed (i.e. due to python-side inheritance). Arguments must be identical.
1348template <typename CFunc, typename AFunc, typename Ret = detail::initimpl::factory<CFunc, AFunc>>
1349Ret init(CFunc &&c, AFunc &&a) {
1350 return {std::forward<CFunc>(c), std::forward<AFunc>(a)};
1351}
1352
1353/// Binds pickling functions `__getstate__` and `__setstate__` and ensures that the type
1354/// returned by `__getstate__` is the same as the argument accepted by `__setstate__`.
1355template <typename GetState, typename SetState>
1356detail::initimpl::pickle_factory<GetState, SetState> pickle(GetState &&g, SetState &&s) {
1357 return {std::forward<GetState>(g), std::forward<SetState>(s)};
Marcin Wojdyrfbab29c2017-09-04 18:37:16 +01001358}
Dean Moldovan68986792017-08-30 23:40:55 +02001359
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001360/// Binds C++ enumerations and enumeration classes to Python
1361template <typename Type> class enum_ : public class_<Type> {
1362public:
Wenzel Jakob8ac97152016-09-05 17:20:50 +09001363 using class_<Type>::def;
Matthieu Becaf936e12017-03-03 08:45:50 -08001364 using class_<Type>::def_property_readonly_static;
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001365 using Scalar = typename std::underlying_type<Type>::type;
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001366
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001367 template <typename... Extra>
1368 enum_(const handle &scope, const char *name, const Extra&... extra)
Matthieu Becaf936e12017-03-03 08:45:50 -08001369 : class_<Type>(scope, name, extra...), m_entries(), m_parent(scope) {
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001370
Dean Moldovan82ece942017-03-29 11:55:18 +02001371 constexpr bool is_arithmetic = detail::any_of<std::is_same<arithmetic, Extra>...>::value;
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001372
Matthieu Becaf936e12017-03-03 08:45:50 -08001373 auto m_entries_ptr = m_entries.inc_ref().ptr();
1374 def("__repr__", [name, m_entries_ptr](Type value) -> pybind11::str {
1375 for (const auto &kv : reinterpret_borrow<dict>(m_entries_ptr)) {
1376 if (pybind11::cast<Type>(kv.second) == value)
1377 return pybind11::str("{}.{}").format(name, kv.first);
1378 }
1379 return pybind11::str("{}.???").format(name);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001380 });
Matthieu Becaf936e12017-03-03 08:45:50 -08001381 def_property_readonly_static("__members__", [m_entries_ptr](object /* self */) {
1382 dict m;
1383 for (const auto &kv : reinterpret_borrow<dict>(m_entries_ptr))
1384 m[kv.first] = kv.second;
1385 return m;
1386 }, return_value_policy::copy);
Dean Moldovan68986792017-08-30 23:40:55 +02001387 def(init([](Scalar i) { return static_cast<Type>(i); }));
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001388 def("__int__", [](Type value) { return (Scalar) value; });
Wenzel Jakobe6fd2cd2017-04-28 14:46:52 +02001389 #if PY_MAJOR_VERSION < 3
1390 def("__long__", [](Type value) { return (Scalar) value; });
1391 #endif
Wenzel Jakob8ac97152016-09-05 17:20:50 +09001392 def("__eq__", [](const Type &value, Type *value2) { return value2 && value == *value2; });
1393 def("__ne__", [](const Type &value, Type *value2) { return !value2 || value != *value2; });
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001394 if (is_arithmetic) {
1395 def("__lt__", [](const Type &value, Type *value2) { return value2 && value < *value2; });
1396 def("__gt__", [](const Type &value, Type *value2) { return value2 && value > *value2; });
1397 def("__le__", [](const Type &value, Type *value2) { return value2 && value <= *value2; });
1398 def("__ge__", [](const Type &value, Type *value2) { return value2 && value >= *value2; });
1399 }
1400 if (std::is_convertible<Type, Scalar>::value) {
Jason Rhinelanderd41a2732016-08-04 00:21:37 -04001401 // Don't provide comparison with the underlying type if the enum isn't convertible,
1402 // i.e. if Type is a scoped enum, mirroring the C++ behaviour. (NB: we explicitly
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001403 // convert Type to Scalar below anyway because this needs to compile).
1404 def("__eq__", [](const Type &value, Scalar value2) { return (Scalar) value == value2; });
1405 def("__ne__", [](const Type &value, Scalar value2) { return (Scalar) value != value2; });
1406 if (is_arithmetic) {
1407 def("__lt__", [](const Type &value, Scalar value2) { return (Scalar) value < value2; });
1408 def("__gt__", [](const Type &value, Scalar value2) { return (Scalar) value > value2; });
1409 def("__le__", [](const Type &value, Scalar value2) { return (Scalar) value <= value2; });
1410 def("__ge__", [](const Type &value, Scalar value2) { return (Scalar) value >= value2; });
1411 def("__invert__", [](const Type &value) { return ~((Scalar) value); });
1412 def("__and__", [](const Type &value, Scalar value2) { return (Scalar) value & value2; });
1413 def("__or__", [](const Type &value, Scalar value2) { return (Scalar) value | value2; });
1414 def("__xor__", [](const Type &value, Scalar value2) { return (Scalar) value ^ value2; });
1415 def("__rand__", [](const Type &value, Scalar value2) { return (Scalar) value & value2; });
1416 def("__ror__", [](const Type &value, Scalar value2) { return (Scalar) value | value2; });
1417 def("__rxor__", [](const Type &value, Scalar value2) { return (Scalar) value ^ value2; });
1418 def("__and__", [](const Type &value, const Type &value2) { return (Scalar) value & (Scalar) value2; });
1419 def("__or__", [](const Type &value, const Type &value2) { return (Scalar) value | (Scalar) value2; });
1420 def("__xor__", [](const Type &value, const Type &value2) { return (Scalar) value ^ (Scalar) value2; });
1421 }
Jason Rhinelanderd41a2732016-08-04 00:21:37 -04001422 }
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001423 def("__hash__", [](const Type &value) { return (Scalar) value; });
Wenzel Jakobfe342412016-09-06 13:02:29 +09001424 // Pickling and unpickling -- needed for use with the 'multiprocessing' module
Dean Moldovan68986792017-08-30 23:40:55 +02001425 def(pickle([](const Type &value) { return pybind11::make_tuple((Scalar) value); },
1426 [](tuple t) { return static_cast<Type>(t[0].cast<Scalar>()); }));
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001427 }
1428
1429 /// Export enumeration entries into the parent scope
Matthieu Becaf936e12017-03-03 08:45:50 -08001430 enum_& export_values() {
1431 for (const auto &kv : m_entries)
1432 m_parent.attr(kv.first) = kv.second;
Wenzel Jakobe916d842016-11-04 16:51:14 +01001433 return *this;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001434 }
1435
1436 /// Add an enumeration entry
1437 enum_& value(char const* name, Type value) {
Matthieu Becaf936e12017-03-03 08:45:50 -08001438 auto v = pybind11::cast(value, return_value_policy::copy);
1439 this->attr(name) = v;
1440 m_entries[pybind11::str(name)] = v;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001441 return *this;
1442 }
Matthieu Becaf936e12017-03-03 08:45:50 -08001443
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001444private:
Matthieu Becaf936e12017-03-03 08:45:50 -08001445 dict m_entries;
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001446 handle m_parent;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001447};
1448
1449NAMESPACE_BEGIN(detail)
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001450
Jason Rhinelanderec62d972016-09-09 02:42:51 -04001451
Jason Rhinelanderf2ecd892016-08-10 12:08:04 -04001452inline void keep_alive_impl(handle nurse, handle patient) {
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001453 if (!nurse || !patient)
Wenzel Jakob678d7872016-01-17 22:36:41 +01001454 pybind11_fail("Could not activate keep_alive!");
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001455
Ivan Smirnov984c7622016-08-29 02:38:47 +01001456 if (patient.is_none() || nurse.is_none())
Glen Walkerf45bb582016-08-16 17:50:43 +12001457 return; /* Nothing to keep alive or nothing to be kept alive by */
Wenzel Jakob9b880ba2016-04-25 03:25:13 +02001458
Bruce Merry9d698f72017-06-24 14:58:42 +02001459 auto tinfo = all_type_info(Py_TYPE(nurse.ptr()));
1460 if (!tinfo.empty()) {
1461 /* It's a pybind-registered type, so we can store the patient in the
1462 * internal list. */
1463 add_patient(nurse.ptr(), patient.ptr());
1464 }
1465 else {
1466 /* Fall back to clever approach based on weak references taken from
1467 * Boost.Python. This is not used for pybind-registered types because
1468 * the objects can be destroyed out-of-order in a GC pass. */
1469 cpp_function disable_lifesupport(
1470 [patient](handle weakref) { patient.dec_ref(); weakref.dec_ref(); });
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001471
Bruce Merry9d698f72017-06-24 14:58:42 +02001472 weakref wr(nurse, disable_lifesupport);
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001473
Bruce Merry9d698f72017-06-24 14:58:42 +02001474 patient.inc_ref(); /* reference patient and leak the weak reference */
1475 (void) wr.release();
1476 }
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001477}
1478
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -05001479PYBIND11_NOINLINE inline void keep_alive_impl(size_t Nurse, size_t Patient, function_call &call, handle ret) {
Dean Moldovan7939f4b2017-09-04 13:49:19 +02001480 auto get_arg = [&](size_t n) {
1481 if (n == 0)
1482 return ret;
1483 else if (n == 1 && call.init_self)
1484 return call.init_self;
1485 else if (n <= call.args.size())
1486 return call.args[n - 1];
1487 return handle();
1488 };
1489
1490 keep_alive_impl(get_arg(Nurse), get_arg(Patient));
Jason Rhinelanderf2ecd892016-08-10 12:08:04 -04001491}
1492
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001493inline std::pair<decltype(internals::registered_types_py)::iterator, bool> all_type_info_get_cache(PyTypeObject *type) {
1494 auto res = get_internals().registered_types_py
Jason Rhinelander12be4cd2017-07-29 03:53:45 -04001495#ifdef __cpp_lib_unordered_map_try_emplace
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001496 .try_emplace(type);
1497#else
1498 .emplace(type, std::vector<detail::type_info *>());
1499#endif
1500 if (res.second) {
1501 // New cache entry created; set up a weak reference to automatically remove it if the type
1502 // gets destroyed:
1503 weakref((PyObject *) type, cpp_function([type](handle wr) {
1504 get_internals().registered_types_py.erase(type);
1505 wr.dec_ref();
1506 })).release();
1507 }
1508
1509 return res;
1510}
1511
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001512template <typename Iterator, typename Sentinel, bool KeyIterator, return_value_policy Policy>
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001513struct iterator_state {
1514 Iterator it;
1515 Sentinel end;
Dean Moldovancaedf742017-06-09 16:49:04 +02001516 bool first_or_done;
Ivan Smirnovdaed1ab2016-06-17 22:29:39 +01001517};
Wenzel Jakobb2825952016-04-13 23:33:00 +02001518
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001519NAMESPACE_END(detail)
1520
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001521/// Makes a python iterator from a first and past-the-end C++ InputIterator.
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001522template <return_value_policy Policy = return_value_policy::reference_internal,
1523 typename Iterator,
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001524 typename Sentinel,
Wenzel Jakob5dd33d82016-05-30 11:28:21 +02001525 typename ValueType = decltype(*std::declval<Iterator>()),
1526 typename... Extra>
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001527iterator make_iterator(Iterator first, Sentinel last, Extra &&... extra) {
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001528 typedef detail::iterator_state<Iterator, Sentinel, false, Policy> state;
Wenzel Jakobb2825952016-04-13 23:33:00 +02001529
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001530 if (!detail::get_type_info(typeid(state), false)) {
Jason Rhinelander7437c692017-07-28 22:03:44 -04001531 class_<state>(handle(), "iterator", pybind11::module_local())
Wenzel Jakobb2825952016-04-13 23:33:00 +02001532 .def("__iter__", [](state &s) -> state& { return s; })
Wenzel Jakob5dd33d82016-05-30 11:28:21 +02001533 .def("__next__", [](state &s) -> ValueType {
Dean Moldovancaedf742017-06-09 16:49:04 +02001534 if (!s.first_or_done)
Ivan Smirnovdaed1ab2016-06-17 22:29:39 +01001535 ++s.it;
1536 else
Dean Moldovancaedf742017-06-09 16:49:04 +02001537 s.first_or_done = false;
1538 if (s.it == s.end) {
1539 s.first_or_done = true;
Wenzel Jakobb2825952016-04-13 23:33:00 +02001540 throw stop_iteration();
Dean Moldovancaedf742017-06-09 16:49:04 +02001541 }
Ivan Smirnovdaed1ab2016-06-17 22:29:39 +01001542 return *s.it;
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001543 }, std::forward<Extra>(extra)..., Policy);
Wenzel Jakobb2825952016-04-13 23:33:00 +02001544 }
1545
Dean Moldovancaedf742017-06-09 16:49:04 +02001546 return cast(state{first, last, true});
Wenzel Jakobb2825952016-04-13 23:33:00 +02001547}
Wenzel Jakob146397e2016-09-06 13:06:31 +09001548
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001549/// Makes an python iterator over the keys (`.first`) of a iterator over pairs from a
1550/// first and past-the-end InputIterator.
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001551template <return_value_policy Policy = return_value_policy::reference_internal,
1552 typename Iterator,
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001553 typename Sentinel,
Ivan Smirnovc5a1c8a2016-08-24 23:27:19 +01001554 typename KeyType = decltype((*std::declval<Iterator>()).first),
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001555 typename... Extra>
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001556iterator make_key_iterator(Iterator first, Sentinel last, Extra &&... extra) {
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001557 typedef detail::iterator_state<Iterator, Sentinel, true, Policy> state;
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001558
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001559 if (!detail::get_type_info(typeid(state), false)) {
Jason Rhinelander7437c692017-07-28 22:03:44 -04001560 class_<state>(handle(), "iterator", pybind11::module_local())
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001561 .def("__iter__", [](state &s) -> state& { return s; })
1562 .def("__next__", [](state &s) -> KeyType {
Dean Moldovancaedf742017-06-09 16:49:04 +02001563 if (!s.first_or_done)
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001564 ++s.it;
1565 else
Dean Moldovancaedf742017-06-09 16:49:04 +02001566 s.first_or_done = false;
1567 if (s.it == s.end) {
1568 s.first_or_done = true;
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001569 throw stop_iteration();
Dean Moldovancaedf742017-06-09 16:49:04 +02001570 }
Ivan Smirnovc5a1c8a2016-08-24 23:27:19 +01001571 return (*s.it).first;
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001572 }, std::forward<Extra>(extra)..., Policy);
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001573 }
1574
Dean Moldovancaedf742017-06-09 16:49:04 +02001575 return cast(state{first, last, true});
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001576}
Wenzel Jakobb2825952016-04-13 23:33:00 +02001577
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001578/// Makes an iterator over values of an stl container or other container supporting
1579/// `std::begin()`/`std::end()`
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001580template <return_value_policy Policy = return_value_policy::reference_internal,
1581 typename Type, typename... Extra> iterator make_iterator(Type &value, Extra&&... extra) {
1582 return make_iterator<Policy>(std::begin(value), std::end(value), extra...);
Wenzel Jakobbf0c7dc2016-04-18 10:52:12 +02001583}
1584
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001585/// Makes an iterator over the keys (`.first`) of a stl map-like container supporting
1586/// `std::begin()`/`std::end()`
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001587template <return_value_policy Policy = return_value_policy::reference_internal,
1588 typename Type, typename... Extra> iterator make_key_iterator(Type &value, Extra&&... extra) {
1589 return make_key_iterator<Policy>(std::begin(value), std::end(value), extra...);
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001590}
1591
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001592template <typename InputType, typename OutputType> void implicitly_convertible() {
Wenzel Jakob8ed5b8a2017-08-28 16:34:06 +02001593 struct set_flag {
1594 bool &flag;
1595 set_flag(bool &flag) : flag(flag) { flag = true; }
1596 ~set_flag() { flag = false; }
1597 };
Wenzel Jakob2ac50442016-01-17 22:36:35 +01001598 auto implicit_caster = [](PyObject *obj, PyTypeObject *type) -> PyObject * {
Wenzel Jakob8ed5b8a2017-08-28 16:34:06 +02001599 static bool currently_used = false;
1600 if (currently_used) // implicit conversions are non-reentrant
1601 return nullptr;
1602 set_flag flag_helper(currently_used);
Dean Moldovan5f07fac2017-01-03 11:52:05 +01001603 if (!detail::make_caster<InputType>().load(obj, false))
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001604 return nullptr;
1605 tuple args(1);
1606 args[0] = obj;
1607 PyObject *result = PyObject_Call((PyObject *) type, args.ptr(), nullptr);
1608 if (result == nullptr)
1609 PyErr_Clear();
1610 return result;
1611 };
Ivan Smirnov8f3e0452016-10-23 15:43:03 +01001612
1613 if (auto tinfo = detail::get_type_info(typeid(OutputType)))
1614 tinfo->implicit_conversions.push_back(implicit_caster);
1615 else
Wenzel Jakob678d7872016-01-17 22:36:41 +01001616 pybind11_fail("implicitly_convertible: Unable to find type " + type_id<OutputType>());
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001617}
1618
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001619template <typename ExceptionTranslator>
1620void register_exception_translator(ExceptionTranslator&& translator) {
1621 detail::get_internals().registered_exception_translators.push_front(
1622 std::forward<ExceptionTranslator>(translator));
1623}
1624
Jason Rhinelander37b23832017-05-22 12:06:16 -04001625/**
1626 * Wrapper to generate a new Python exception type.
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001627 *
1628 * This should only be used with PyErr_SetString for now.
1629 * It is not (yet) possible to use as a py::base.
1630 * Template type argument is reserved for future use.
1631 */
1632template <typename type>
1633class exception : public object {
1634public:
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001635 exception(handle scope, const char *name, PyObject *base = PyExc_Exception) {
1636 std::string full_name = scope.attr("__name__").cast<std::string>() +
1637 std::string(".") + name;
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -05001638 m_ptr = PyErr_NewException(const_cast<char *>(full_name.c_str()), base, NULL);
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001639 if (hasattr(scope, name))
1640 pybind11_fail("Error during initialization: multiple incompatible "
1641 "definitions with name \"" + std::string(name) + "\"");
1642 scope.attr(name) = *this;
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001643 }
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001644
1645 // Sets the current python exception to this exception object with the given message
1646 void operator()(const char *message) {
1647 PyErr_SetString(m_ptr, message);
1648 }
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001649};
1650
Jason Rhinelander37b23832017-05-22 12:06:16 -04001651/**
1652 * Registers a Python exception in `m` of the given `name` and installs an exception translator to
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001653 * translate the C++ exception to the created Python exception using the exceptions what() method.
1654 * This is intended for simple exception translations; for more complex translation, register the
1655 * exception object and translator directly.
1656 */
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001657template <typename CppException>
1658exception<CppException> &register_exception(handle scope,
1659 const char *name,
1660 PyObject *base = PyExc_Exception) {
1661 static exception<CppException> ex(scope, name, base);
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001662 register_exception_translator([](std::exception_ptr p) {
1663 if (!p) return;
1664 try {
1665 std::rethrow_exception(p);
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001666 } catch (const CppException &e) {
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001667 ex(e.what());
1668 }
1669 });
1670 return ex;
1671}
1672
Dean Moldovan67990d92016-08-29 18:03:34 +02001673NAMESPACE_BEGIN(detail)
1674PYBIND11_NOINLINE inline void print(tuple args, dict kwargs) {
1675 auto strings = tuple(args.size());
1676 for (size_t i = 0; i < args.size(); ++i) {
Dean Moldovane18bc022016-10-25 22:12:39 +02001677 strings[i] = str(args[i]);
Dean Moldovan67990d92016-08-29 18:03:34 +02001678 }
Dean Moldovan865e4302016-09-21 01:06:32 +02001679 auto sep = kwargs.contains("sep") ? kwargs["sep"] : cast(" ");
Dean Moldovan242b1462016-09-08 17:02:04 +02001680 auto line = sep.attr("join")(strings);
Dean Moldovan67990d92016-08-29 18:03:34 +02001681
Wenzel Jakobc49d6e52016-10-13 10:34:52 +02001682 object file;
1683 if (kwargs.contains("file")) {
1684 file = kwargs["file"].cast<object>();
1685 } else {
1686 try {
1687 file = module::import("sys").attr("stdout");
esquires67a68f12016-12-01 05:35:34 -05001688 } catch (const error_already_set &) {
Wenzel Jakobc49d6e52016-10-13 10:34:52 +02001689 /* If print() is called from code that is executed as
1690 part of garbage collection during interpreter shutdown,
1691 importing 'sys' can fail. Give up rather than crashing the
1692 interpreter in this case. */
1693 return;
1694 }
1695 }
1696
Dean Moldovan242b1462016-09-08 17:02:04 +02001697 auto write = file.attr("write");
Dean Moldovan67990d92016-08-29 18:03:34 +02001698 write(line);
Dean Moldovan865e4302016-09-21 01:06:32 +02001699 write(kwargs.contains("end") ? kwargs["end"] : cast("\n"));
Dean Moldovan67990d92016-08-29 18:03:34 +02001700
Wenzel Jakobc49d6e52016-10-13 10:34:52 +02001701 if (kwargs.contains("flush") && kwargs["flush"].cast<bool>())
Dean Moldovan242b1462016-09-08 17:02:04 +02001702 file.attr("flush")();
Dean Moldovan67990d92016-08-29 18:03:34 +02001703}
1704NAMESPACE_END(detail)
1705
1706template <return_value_policy policy = return_value_policy::automatic_reference, typename... Args>
1707void print(Args &&...args) {
1708 auto c = detail::collect_arguments<policy>(std::forward<Args>(args)...);
1709 detail::print(c.args(), c.kwargs());
1710}
1711
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001712#if defined(WITH_THREAD) && !defined(PYPY_VERSION)
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001713
1714/* The functions below essentially reproduce the PyGILState_* API using a RAII
1715 * pattern, but there are a few important differences:
1716 *
1717 * 1. When acquiring the GIL from an non-main thread during the finalization
1718 * phase, the GILState API blindly terminates the calling thread, which
1719 * is often not what is wanted. This API does not do this.
1720 *
1721 * 2. The gil_scoped_release function can optionally cut the relationship
1722 * of a PyThreadState and its associated thread, which allows moving it to
1723 * another thread (this is a fairly rare/advanced use case).
1724 *
1725 * 3. The reference count of an acquired thread state can be controlled. This
1726 * can be handy to prevent cases where callbacks issued from an external
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001727 * thread would otherwise constantly construct and destroy thread state data
1728 * structures.
Wenzel Jakob69e1a5c2016-05-26 14:29:31 +02001729 *
1730 * See the Python bindings of NanoGUI (http://github.com/wjakob/nanogui) for an
1731 * example which uses features 2 and 3 to migrate the Python thread of
1732 * execution to another thread (to run the event loop on the original thread,
1733 * in this case).
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001734 */
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001735
1736class gil_scoped_acquire {
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001737public:
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001738 PYBIND11_NOINLINE gil_scoped_acquire() {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001739 auto const &internals = detail::get_internals();
1740 tstate = (PyThreadState *) PyThread_get_key_value(internals.tstate);
1741
1742 if (!tstate) {
1743 tstate = PyThreadState_New(internals.istate);
1744 #if !defined(NDEBUG)
1745 if (!tstate)
1746 pybind11_fail("scoped_acquire: could not create thread state!");
1747 #endif
1748 tstate->gilstate_counter = 0;
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001749 #if PY_MAJOR_VERSION < 3
1750 PyThread_delete_key_value(internals.tstate);
1751 #endif
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001752 PyThread_set_key_value(internals.tstate, tstate);
1753 } else {
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001754 release = detail::get_thread_state_unchecked() != tstate;
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001755 }
1756
1757 if (release) {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001758 /* Work around an annoying assertion in PyThreadState_Swap */
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001759 #if defined(Py_DEBUG)
1760 PyInterpreterState *interp = tstate->interp;
1761 tstate->interp = nullptr;
1762 #endif
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001763 PyEval_AcquireThread(tstate);
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001764 #if defined(Py_DEBUG)
1765 tstate->interp = interp;
1766 #endif
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001767 }
1768
1769 inc_ref();
1770 }
1771
1772 void inc_ref() {
1773 ++tstate->gilstate_counter;
1774 }
1775
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001776 PYBIND11_NOINLINE void dec_ref() {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001777 --tstate->gilstate_counter;
1778 #if !defined(NDEBUG)
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001779 if (detail::get_thread_state_unchecked() != tstate)
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001780 pybind11_fail("scoped_acquire::dec_ref(): thread state must be current!");
1781 if (tstate->gilstate_counter < 0)
1782 pybind11_fail("scoped_acquire::dec_ref(): reference count underflow!");
1783 #endif
1784 if (tstate->gilstate_counter == 0) {
1785 #if !defined(NDEBUG)
1786 if (!release)
1787 pybind11_fail("scoped_acquire::dec_ref(): internal error!");
1788 #endif
1789 PyThreadState_Clear(tstate);
1790 PyThreadState_DeleteCurrent();
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001791 PyThread_delete_key_value(detail::get_internals().tstate);
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001792 release = false;
1793 }
1794 }
1795
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001796 PYBIND11_NOINLINE ~gil_scoped_acquire() {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001797 dec_ref();
1798 if (release)
1799 PyEval_SaveThread();
1800 }
1801private:
1802 PyThreadState *tstate = nullptr;
1803 bool release = true;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001804};
1805
1806class gil_scoped_release {
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001807public:
Jason Rhinelander12d76602016-10-16 16:27:42 -04001808 explicit gil_scoped_release(bool disassoc = false) : disassoc(disassoc) {
Dean Moldovan2d6116b2017-06-20 23:50:51 +02001809 // `get_internals()` must be called here unconditionally in order to initialize
1810 // `internals.tstate` for subsequent `gil_scoped_acquire` calls. Otherwise, an
1811 // initialization race could occur as multiple threads try `gil_scoped_acquire`.
1812 const auto &internals = detail::get_internals();
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001813 tstate = PyEval_SaveThread();
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02001814 if (disassoc) {
Dean Moldovan2d6116b2017-06-20 23:50:51 +02001815 auto key = internals.tstate;
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02001816 #if PY_MAJOR_VERSION < 3
1817 PyThread_delete_key_value(key);
1818 #else
1819 PyThread_set_key_value(key, nullptr);
1820 #endif
1821 }
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001822 }
1823 ~gil_scoped_release() {
1824 if (!tstate)
1825 return;
1826 PyEval_RestoreThread(tstate);
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02001827 if (disassoc) {
Boris Schäling20ee9352016-05-28 12:26:18 +02001828 auto key = detail::get_internals().tstate;
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02001829 #if PY_MAJOR_VERSION < 3
1830 PyThread_delete_key_value(key);
1831 #endif
1832 PyThread_set_key_value(key, tstate);
1833 }
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001834 }
1835private:
1836 PyThreadState *tstate;
1837 bool disassoc;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001838};
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001839#elif defined(PYPY_VERSION)
1840class gil_scoped_acquire {
1841 PyGILState_STATE state;
1842public:
1843 gil_scoped_acquire() { state = PyGILState_Ensure(); }
1844 ~gil_scoped_acquire() { PyGILState_Release(state); }
1845};
1846
1847class gil_scoped_release {
1848 PyThreadState *state;
1849public:
1850 gil_scoped_release() { state = PyEval_SaveThread(); }
1851 ~gil_scoped_release() { PyEval_RestoreThread(state); }
1852};
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001853#else
1854class gil_scoped_acquire { };
1855class gil_scoped_release { };
Felipe Lema2547ca42016-01-25 16:22:44 -03001856#endif
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001857
Wenzel Jakob8d396fc2016-11-24 23:11:02 +01001858error_already_set::~error_already_set() {
Jason Rhinelander1682b672017-07-20 23:14:33 -04001859 if (type) {
Wenzel Jakob8d396fc2016-11-24 23:11:02 +01001860 gil_scoped_acquire gil;
Jason Rhinelander1682b672017-07-20 23:14:33 -04001861 type.release().dec_ref();
1862 value.release().dec_ref();
1863 trace.release().dec_ref();
Wenzel Jakob8d396fc2016-11-24 23:11:02 +01001864 }
1865}
1866
Jason Rhinelander1b05ce52016-08-09 17:57:59 -04001867inline function get_type_overload(const void *this_ptr, const detail::type_info *this_type, const char *name) {
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001868 handle self = detail::get_object_handle(this_ptr, this_type);
1869 if (!self)
Wenzel Jakobac0fde92015-10-01 18:37:26 +02001870 return function();
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001871 handle type = self.get_type();
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001872 auto key = std::make_pair(type.ptr(), name);
1873
Wenzel Jakobf5c154a2016-04-11 18:13:08 +02001874 /* Cache functions that aren't overloaded in Python to avoid
1875 many costly Python dictionary lookups below */
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001876 auto &cache = detail::get_internals().inactive_overload_cache;
1877 if (cache.find(key) != cache.end())
1878 return function();
1879
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001880 function overload = getattr(self, name, function());
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001881 if (overload.is_cpp_function()) {
1882 cache.insert(key);
1883 return function();
1884 }
Wenzel Jakob27e8e102016-01-17 22:36:37 +01001885
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001886 /* Don't call dispatch code if invoked from overridden function.
1887 Unfortunately this doesn't work on PyPy. */
1888#if !defined(PYPY_VERSION)
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001889 PyFrameObject *frame = PyThreadState_Get()->frame;
Dean Moldovane18bc022016-10-25 22:12:39 +02001890 if (frame && (std::string) str(frame->f_code->co_name) == name &&
Wenzel Jakobf5c154a2016-04-11 18:13:08 +02001891 frame->f_code->co_argcount > 0) {
1892 PyFrame_FastToLocals(frame);
1893 PyObject *self_caller = PyDict_GetItem(
1894 frame->f_locals, PyTuple_GET_ITEM(frame->f_code->co_varnames, 0));
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001895 if (self_caller == self.ptr())
Wenzel Jakobf5c154a2016-04-11 18:13:08 +02001896 return function();
1897 }
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001898#else
1899 /* PyPy currently doesn't provide a detailed cpyext emulation of
1900 frame objects, so we have to emulate this using Python. This
1901 is going to be slow..*/
1902 dict d; d["self"] = self; d["name"] = pybind11::str(name);
1903 PyObject *result = PyRun_String(
1904 "import inspect\n"
1905 "frame = inspect.currentframe()\n"
1906 "if frame is not None:\n"
1907 " frame = frame.f_back\n"
1908 " if frame is not None and str(frame.f_code.co_name) == name and "
1909 "frame.f_code.co_argcount > 0:\n"
1910 " self_caller = frame.f_locals[frame.f_code.co_varnames[0]]\n"
1911 " if self_caller == self:\n"
1912 " self = None\n",
1913 Py_file_input, d.ptr(), d.ptr());
1914 if (result == nullptr)
1915 throw error_already_set();
Dean Moldovan36f0a152017-02-08 01:01:56 +01001916 if (d["self"].is_none())
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001917 return function();
1918 Py_DECREF(result);
1919#endif
1920
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001921 return overload;
1922}
1923
Jason Rhinelander1b05ce52016-08-09 17:57:59 -04001924template <class T> function get_overload(const T *this_ptr, const char *name) {
Ivan Smirnov8f3e0452016-10-23 15:43:03 +01001925 auto tinfo = detail::get_type_info(typeid(T));
1926 return tinfo ? get_type_overload(this_ptr, tinfo, name) : function();
Jason Rhinelander1b05ce52016-08-09 17:57:59 -04001927}
1928
Jason Rhinelander20978262016-08-29 18:16:46 -04001929#define PYBIND11_OVERLOAD_INT(ret_type, cname, name, ...) { \
Wenzel Jakob8f4eb002015-10-15 18:13:33 +02001930 pybind11::gil_scoped_acquire gil; \
Jason Rhinelander20978262016-08-29 18:16:46 -04001931 pybind11::function overload = pybind11::get_overload(static_cast<const cname *>(this), name); \
Jason Rhinelander7dfb9322016-09-08 14:49:43 -04001932 if (overload) { \
Jason Rhinelander3e4fe6c2016-09-11 12:17:41 -04001933 auto o = overload(__VA_ARGS__); \
Jason Rhinelander7dfb9322016-09-08 14:49:43 -04001934 if (pybind11::detail::cast_is_temporary_value_reference<ret_type>::value) { \
Jason Rhinelander3e4fe6c2016-09-11 12:17:41 -04001935 static pybind11::detail::overload_caster_t<ret_type> caster; \
1936 return pybind11::detail::cast_ref<ret_type>(std::move(o), caster); \
Jason Rhinelander7dfb9322016-09-08 14:49:43 -04001937 } \
1938 else return pybind11::detail::cast_safe<ret_type>(std::move(o)); \
1939 } \
1940 }
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001941
Wenzel Jakob1e3be732016-05-24 23:42:05 +02001942#define PYBIND11_OVERLOAD_NAME(ret_type, cname, name, fn, ...) \
Jason Rhinelander20978262016-08-29 18:16:46 -04001943 PYBIND11_OVERLOAD_INT(ret_type, cname, name, __VA_ARGS__) \
Wenzel Jakob1e3be732016-05-24 23:42:05 +02001944 return cname::fn(__VA_ARGS__)
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001945
Wenzel Jakob1e3be732016-05-24 23:42:05 +02001946#define PYBIND11_OVERLOAD_PURE_NAME(ret_type, cname, name, fn, ...) \
Jason Rhinelander20978262016-08-29 18:16:46 -04001947 PYBIND11_OVERLOAD_INT(ret_type, cname, name, __VA_ARGS__) \
Wenzel Jakob1e3be732016-05-24 23:42:05 +02001948 pybind11::pybind11_fail("Tried to call pure virtual function \"" #cname "::" name "\"");
1949
1950#define PYBIND11_OVERLOAD(ret_type, cname, fn, ...) \
1951 PYBIND11_OVERLOAD_NAME(ret_type, cname, #fn, fn, __VA_ARGS__)
1952
1953#define PYBIND11_OVERLOAD_PURE(ret_type, cname, fn, ...) \
1954 PYBIND11_OVERLOAD_PURE_NAME(ret_type, cname, #fn, fn, __VA_ARGS__)
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001955
Jason Rhinelandera859dd62017-08-10 12:03:29 -04001956NAMESPACE_END(PYBIND11_NAMESPACE)
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001957
1958#if defined(_MSC_VER)
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001959# pragma warning(pop)
Wenzel Jakob1ffce742016-08-25 01:43:33 +02001960#elif defined(__INTEL_COMPILER)
1961/* Leave ignored warnings on */
Wenzel Jakob6d252962016-05-01 20:47:49 +02001962#elif defined(__GNUG__) && !defined(__clang__)
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001963# pragma GCC diagnostic pop
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001964#endif