blob: 285fc5346f15bc1af2d8d4f295c7b65e8bdd715a [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 Moldovan9e625582016-06-04 00:27:32 +020095
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 Moldovaned23dda2016-08-04 01:40:40 +0200166 using detail::descr; using detail::_;
Dean Moldovan719c1732016-11-27 18:19:34 +0100167 PYBIND11_DESCR signature = _("(") + cast_in::arg_names() + _(") -> ") + cast_out::name();
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100168
169 /* Register the function with Python from generic (non-templated) code */
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100170 initialize_generic(rec, signature.text(), signature.types(), 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;
220 size_t type_depth = 0, char_index = 0, type_index = 0, arg_index = 0;
221 while (true) {
222 char c = text[char_index++];
223 if (c == '\0')
224 break;
225
226 if (c == '{') {
Dean Moldovanecced6c2016-07-31 20:03:18 +0200227 // Write arg name for everything except *args, **kwargs and return type.
Dean Moldovaned23dda2016-08-04 01:40:40 +0200228 if (type_depth == 0 && text[char_index] != '*' && arg_index < args) {
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500229 if (!rec->args.empty() && rec->args[arg_index].name) {
Dean Moldovanecced6c2016-07-31 20:03:18 +0200230 signature += rec->args[arg_index].name;
Wenzel Jakob31fbf182016-11-20 05:27:05 +0100231 } else if (arg_index == 0 && rec->is_method) {
Dean Moldovanecced6c2016-07-31 20:03:18 +0200232 signature += "self";
233 } else {
Wenzel Jakob31fbf182016-11-20 05:27:05 +0100234 signature += "arg" + std::to_string(arg_index - (rec->is_method ? 1 : 0));
Dean Moldovanecced6c2016-07-31 20:03:18 +0200235 }
236 signature += ": ";
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100237 }
238 ++type_depth;
239 } else if (c == '}') {
240 --type_depth;
Dean Moldovaned23dda2016-08-04 01:40:40 +0200241 if (type_depth == 0) {
Dean Moldovanecced6c2016-07-31 20:03:18 +0200242 if (arg_index < rec->args.size() && rec->args[arg_index].descr) {
243 signature += "=";
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100244 signature += rec->args[arg_index].descr;
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100245 }
246 arg_index++;
247 }
248 } else if (c == '%') {
249 const std::type_info *t = types[type_index++];
Wenzel Jakobb2c2c792016-01-17 22:36:40 +0100250 if (!t)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100251 pybind11_fail("Internal error while parsing type signature (1)");
Ivan Smirnov8f3e0452016-10-23 15:43:03 +0100252 if (auto tinfo = detail::get_type_info(*t)) {
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100253#if defined(PYPY_VERSION)
254 signature += handle((PyObject *) tinfo->type)
255 .attr("__module__")
256 .cast<std::string>() + ".";
257#endif
Ivan Smirnov8f3e0452016-10-23 15:43:03 +0100258 signature += tinfo->type->tp_name;
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200259 } else if (rec->is_new_style_constructor && arg_index == 0) {
260 // A new-style `__init__` takes `self` as `value_and_holder`.
261 // Rewrite it to the proper class type.
Jason Rhinelander464d9892017-06-12 21:52:48 -0400262#if defined(PYPY_VERSION)
263 signature += rec->scope.attr("__module__").cast<std::string>() + ".";
264#endif
265 signature += ((PyTypeObject *) rec->scope.ptr())->tp_name;
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100266 } else {
267 std::string tname(t->name());
268 detail::clean_type_id(tname);
269 signature += tname;
270 }
271 } else {
272 signature += c;
273 }
274 }
Wenzel Jakob95d18692016-01-17 22:36:40 +0100275 if (type_depth != 0 || types[type_index] != nullptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100276 pybind11_fail("Internal error while parsing type signature (2)");
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100277
Jason Rhinelanderca0e82b2017-05-09 14:34:45 -0400278 #if !defined(PYBIND11_CONSTEXPR_DESCR)
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100279 delete[] types;
280 delete[] text;
281 #endif
Wenzel Jakobf5fae922015-08-24 15:31:24 +0200282
Wenzel Jakob57082212015-09-04 23:42:12 +0200283#if PY_MAJOR_VERSION < 3
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100284 if (strcmp(rec->name, "__next__") == 0) {
285 std::free(rec->name);
286 rec->name = strdup("next");
Wenzel Jakobd1bfc4e2016-05-16 18:52:46 +0200287 } else if (strcmp(rec->name, "__bool__") == 0) {
288 std::free(rec->name);
289 rec->name = strdup("__nonzero__");
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100290 }
Wenzel Jakob57082212015-09-04 23:42:12 +0200291#endif
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100292 rec->signature = strdup(signature.c_str());
293 rec->args.shrink_to_fit();
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500294 rec->nargs = (std::uint16_t) args;
Wenzel Jakobbd4a5292015-07-11 17:41:48 +0200295
Jason Rhinelander0a90b2d2017-04-16 20:30:52 -0400296 if (rec->sibling && PYBIND11_INSTANCE_METHOD_CHECK(rec->sibling.ptr()))
297 rec->sibling = PYBIND11_INSTANCE_METHOD_GET_FUNCTION(rec->sibling.ptr());
Wenzel Jakob57082212015-09-04 23:42:12 +0200298
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100299 detail::function_record *chain = nullptr, *chain_start = rec;
Jason Rhinelander6873c202016-10-24 21:58:22 -0400300 if (rec->sibling) {
301 if (PyCFunction_Check(rec->sibling.ptr())) {
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100302 auto rec_capsule = reinterpret_borrow<capsule>(PyCFunction_GET_SELF(rec->sibling.ptr()));
Jason Rhinelander6873c202016-10-24 21:58:22 -0400303 chain = (detail::function_record *) rec_capsule;
304 /* Never append a method to an overload chain of a parent class;
305 instead, hide the parent's overloads in this case */
Dean Moldovan36f0a152017-02-08 01:01:56 +0100306 if (!chain->scope.is(rec->scope))
Jason Rhinelander6873c202016-10-24 21:58:22 -0400307 chain = nullptr;
308 }
309 // Don't trigger for things like the default __init__, which are wrapper_descriptors that we are intentionally replacing
310 else if (!rec->sibling.is_none() && rec->name[0] != '_')
311 pybind11_fail("Cannot overload existing non-function object \"" + std::string(rec->name) +
312 "\" with a function of the same name");
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +0200313 }
314
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100315 if (!chain) {
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100316 /* No existing overload was found, create a new function object */
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100317 rec->def = new PyMethodDef();
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500318 std::memset(rec->def, 0, sizeof(PyMethodDef));
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100319 rec->def->ml_name = rec->name;
320 rec->def->ml_meth = reinterpret_cast<PyCFunction>(*dispatcher);
321 rec->def->ml_flags = METH_VARARGS | METH_KEYWORDS;
Wenzel Jakoba6501792016-02-04 23:02:07 +0100322
Wenzel Jakobb16421e2017-03-22 22:04:00 +0100323 capsule rec_capsule(rec, [](void *ptr) {
324 destruct((detail::function_record *) ptr);
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100325 });
Wenzel Jakoba6501792016-02-04 23:02:07 +0100326
327 object scope_module;
328 if (rec->scope) {
Dean Moldovan865e4302016-09-21 01:06:32 +0200329 if (hasattr(rec->scope, "__module__")) {
330 scope_module = rec->scope.attr("__module__");
331 } else if (hasattr(rec->scope, "__name__")) {
332 scope_module = rec->scope.attr("__name__");
333 }
Wenzel Jakoba6501792016-02-04 23:02:07 +0100334 }
335
336 m_ptr = PyCFunction_NewEx(rec->def, rec_capsule.ptr(), scope_module.ptr());
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200337 if (!m_ptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100338 pybind11_fail("cpp_function::cpp_function(): Could not allocate function object");
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200339 } else {
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100340 /* Append at the end of the overload chain */
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100341 m_ptr = rec->sibling.ptr();
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200342 inc_ref();
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100343 chain_start = chain;
Jason Rhinelanderd355f2f2017-04-16 22:31:13 -0400344 if (chain->is_method != rec->is_method)
345 pybind11_fail("overloading a method with both static and instance methods is not supported; "
346 #if defined(NDEBUG)
347 "compile in debug mode for more details"
348 #else
349 "error while attempting to bind " + std::string(rec->is_method ? "instance" : "static") + " method " +
350 std::string(pybind11::str(rec->scope.attr("__name__"))) + "." + std::string(rec->name) + signature
351 #endif
352 );
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100353 while (chain->next)
354 chain = chain->next;
355 chain->next = rec;
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200356 }
Wenzel Jakob281aa0e2015-07-30 15:29:00 +0200357
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200358 std::string signatures;
Wenzel Jakob71867832015-07-29 17:43:52 +0200359 int index = 0;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100360 /* Create a nice pydoc rec including all signatures and
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100361 docstrings of the functions in the overload chain */
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100362 if (chain && options::show_function_signatures()) {
Sylvain Corlay0e04fdf2016-03-08 16:42:12 -0500363 // First a generic signature
364 signatures += rec->name;
365 signatures += "(*args, **kwargs)\n";
366 signatures += "Overloaded function.\n\n";
367 }
368 // Then specific overload signatures
Jason Rhinelander10d13042017-03-08 12:32:42 -0500369 bool first_user_def = true;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100370 for (auto it = chain_start; it != nullptr; it = it->next) {
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100371 if (options::show_function_signatures()) {
Jason Rhinelander10d13042017-03-08 12:32:42 -0500372 if (index > 0) signatures += "\n";
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100373 if (chain)
374 signatures += std::to_string(++index) + ". ";
375 signatures += rec->name;
376 signatures += it->signature;
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100377 signatures += "\n";
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100378 }
379 if (it->doc && strlen(it->doc) > 0 && options::show_user_defined_docstrings()) {
Jason Rhinelander10d13042017-03-08 12:32:42 -0500380 // If we're appending another docstring, and aren't printing function signatures, we
381 // need to append a newline first:
382 if (!options::show_function_signatures()) {
383 if (first_user_def) first_user_def = false;
384 else signatures += "\n";
385 }
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100386 if (options::show_function_signatures()) signatures += "\n";
Wenzel Jakob218b6ce2016-02-28 23:52:37 +0100387 signatures += it->doc;
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100388 if (options::show_function_signatures()) signatures += "\n";
Wenzel Jakob66c9a402016-01-17 22:36:36 +0100389 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200390 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100391
392 /* Install docstring */
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200393 PyCFunctionObject *func = (PyCFunctionObject *) m_ptr;
394 if (func->m_ml->ml_doc)
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500395 std::free(const_cast<char *>(func->m_ml->ml_doc));
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200396 func->m_ml->ml_doc = strdup(signatures.c_str());
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100397
Wenzel Jakob31fbf182016-11-20 05:27:05 +0100398 if (rec->is_method) {
399 m_ptr = PYBIND11_INSTANCE_METHOD_NEW(m_ptr, rec->scope.ptr());
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200400 if (!m_ptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100401 pybind11_fail("cpp_function::cpp_function(): Could not allocate instance method object");
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200402 Py_DECREF(func);
403 }
404 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100405
406 /// When a cpp_function is GCed, release any memory allocated by pybind11
407 static void destruct(detail::function_record *rec) {
408 while (rec) {
409 detail::function_record *next = rec->next;
410 if (rec->free_data)
Wenzel Jakob5984baa2016-05-10 15:05:03 +0100411 rec->free_data(rec);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100412 std::free((char *) rec->name);
413 std::free((char *) rec->doc);
414 std::free((char *) rec->signature);
415 for (auto &arg: rec->args) {
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500416 std::free(const_cast<char *>(arg.name));
417 std::free(const_cast<char *>(arg.descr));
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100418 arg.value.dec_ref();
419 }
420 if (rec->def) {
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -0500421 std::free(const_cast<char *>(rec->def->ml_doc));
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100422 delete rec->def;
423 }
424 delete rec;
425 rec = next;
426 }
427 }
428
429 /// Main dispatch logic for calls to functions bound using pybind11
Jason Rhinelander2686da82017-01-21 23:42:14 -0500430 static PyObject *dispatcher(PyObject *self, PyObject *args_in, PyObject *kwargs_in) {
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500431 using namespace detail;
432
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100433 /* Iterator over the list of potentially admissible overloads */
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500434 function_record *overloads = (function_record *) PyCapsule_GetPointer(self, nullptr),
435 *it = overloads;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100436
437 /* Need to know how many arguments + keyword arguments there are to pick the right overload */
Jason Rhinelander2686da82017-01-21 23:42:14 -0500438 const size_t n_args_in = (size_t) PyTuple_GET_SIZE(args_in);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100439
Jason Rhinelander2686da82017-01-21 23:42:14 -0500440 handle parent = n_args_in > 0 ? PyTuple_GET_ITEM(args_in, 0) : nullptr,
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100441 result = PYBIND11_TRY_NEXT_OVERLOAD;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500442
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200443 auto self_value_and_holder = value_and_holder();
444 if (overloads->is_constructor) {
445 const auto tinfo = get_type_info((PyTypeObject *) overloads->scope.ptr());
446 const auto pi = reinterpret_cast<instance *>(parent.ptr());
447 self_value_and_holder = pi->get_value_and_holder(tinfo, false);
448
449 if (!self_value_and_holder.type || !self_value_and_holder.inst) {
450 PyErr_SetString(PyExc_TypeError, "__init__(self, ...) called with invalid `self` argument");
451 return nullptr;
452 }
453
454 // If this value is already registered it must mean __init__ is invoked multiple times;
455 // we really can't support that in C++, so just ignore the second __init__.
456 if (self_value_and_holder.instance_registered())
457 return none().release().ptr();
458 }
459
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100460 try {
Jason Rhinelandere5505892017-02-03 18:25:34 -0500461 // We do this in two passes: in the first pass, we load arguments with `convert=false`;
462 // in the second, we allow conversion (except for arguments with an explicit
463 // py::arg().noconvert()). This lets us prefer calls without conversion, with
464 // conversion as a fallback.
465 std::vector<function_call> second_pass;
466
467 // However, if there are no overloads, we can just skip the no-convert pass entirely
468 const bool overloaded = it != nullptr && it->next != nullptr;
469
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100470 for (; it != nullptr; it = it->next) {
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500471
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100472 /* For each overload:
Jason Rhinelander2686da82017-01-21 23:42:14 -0500473 1. Copy all positional arguments we were given, also checking to make sure that
474 named positional arguments weren't *also* specified via kwarg.
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100475 2. If we weren't given enough, try to make up the omitted ones by checking
Jason Rhinelander2686da82017-01-21 23:42:14 -0500476 whether they were provided by a kwarg matching the `py::arg("name")` name. If
477 so, use it (and remove it from kwargs; if not, see if the function binding
478 provided a default that we can use.
479 3. Ensure that either all keyword arguments were "consumed", or that the function
480 takes a kwargs argument to accept unconsumed kwargs.
481 4. Any positional arguments still left get put into a tuple (for args), and any
482 leftover kwargs get put into a dict.
483 5. Pack everything into a vector; if we have py::args or py::kwargs, they are an
484 extra tuple or dict at the end of the positional arguments.
485 6. Call the function call dispatcher (function_record::impl)
486
487 If one of these fail, move on to the next overload and keep trying until we get a
488 result other than PYBIND11_TRY_NEXT_OVERLOAD.
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100489 */
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100490
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500491 function_record &func = *it;
492 size_t pos_args = func.nargs; // Number of positional arguments that we need
493 if (func.has_args) --pos_args; // (but don't count py::args
494 if (func.has_kwargs) --pos_args; // or py::kwargs)
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100495
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500496 if (!func.has_args && n_args_in > pos_args)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500497 continue; // Too many arguments for this overload
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100498
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500499 if (n_args_in < pos_args && func.args.size() < pos_args)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500500 continue; // Not enough arguments given, and not enough defaults to fill in the blanks
501
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500502 function_call call(func, parent);
Jason Rhinelander2686da82017-01-21 23:42:14 -0500503
504 size_t args_to_copy = std::min(pos_args, n_args_in);
505 size_t args_copied = 0;
506
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200507 // 0. Inject new-style `self` argument
508 if (func.is_new_style_constructor) {
509 // The `value` may have been preallocated by an old-style `__init__`
510 // if it was a preceding candidate for overload resolution.
511 if (self_value_and_holder)
512 self_value_and_holder.type->dealloc(self_value_and_holder);
513
514 call.args.push_back(reinterpret_cast<PyObject *>(&self_value_and_holder));
515 call.args_convert.push_back(false);
516 ++args_copied;
517 }
518
Jason Rhinelander2686da82017-01-21 23:42:14 -0500519 // 1. Copy any position arguments given.
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400520 bool bad_arg = false;
Jason Rhinelander2686da82017-01-21 23:42:14 -0500521 for (; args_copied < args_to_copy; ++args_copied) {
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400522 argument_record *arg_rec = args_copied < func.args.size() ? &func.args[args_copied] : nullptr;
523 if (kwargs_in && arg_rec && arg_rec->name && PyDict_GetItemString(kwargs_in, arg_rec->name)) {
524 bad_arg = true;
Jason Rhinelandercaa13792017-02-23 19:54:53 -0500525 break;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100526 }
Jason Rhinelander2686da82017-01-21 23:42:14 -0500527
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400528 handle arg(PyTuple_GET_ITEM(args_in, args_copied));
529 if (arg_rec && !arg_rec->none && arg.is_none()) {
530 bad_arg = true;
531 break;
532 }
533 call.args.push_back(arg);
534 call.args_convert.push_back(arg_rec ? arg_rec->convert : true);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100535 }
Jason Rhinelander4e1e4a52017-05-17 11:55:43 -0400536 if (bad_arg)
Jason Rhinelandercaa13792017-02-23 19:54:53 -0500537 continue; // Maybe it was meant for another overload (issue #688)
Wenzel Jakobbd57eb42016-05-01 14:42:20 +0200538
Jason Rhinelander2686da82017-01-21 23:42:14 -0500539 // We'll need to copy this if we steal some kwargs for defaults
540 dict kwargs = reinterpret_borrow<dict>(kwargs_in);
541
542 // 2. Check kwargs and, failing that, defaults that may help complete the list
543 if (args_copied < pos_args) {
544 bool copied_kwargs = false;
545
546 for (; args_copied < pos_args; ++args_copied) {
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500547 const auto &arg = func.args[args_copied];
Jason Rhinelander2686da82017-01-21 23:42:14 -0500548
549 handle value;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500550 if (kwargs_in && arg.name)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500551 value = PyDict_GetItemString(kwargs.ptr(), arg.name);
552
553 if (value) {
554 // Consume a kwargs value
555 if (!copied_kwargs) {
556 kwargs = reinterpret_steal<dict>(PyDict_Copy(kwargs.ptr()));
557 copied_kwargs = true;
558 }
559 PyDict_DelItemString(kwargs.ptr(), arg.name);
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100560 } else if (arg.value) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500561 value = arg.value;
562 }
563
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500564 if (value) {
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500565 call.args.push_back(value);
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500566 call.args_convert.push_back(arg.convert);
567 }
Jason Rhinelander2686da82017-01-21 23:42:14 -0500568 else
569 break;
570 }
571
572 if (args_copied < pos_args)
573 continue; // Not enough arguments, defaults, or kwargs to fill the positional arguments
574 }
575
576 // 3. Check everything was consumed (unless we have a kwargs arg)
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500577 if (kwargs && kwargs.size() > 0 && !func.has_kwargs)
Jason Rhinelander2686da82017-01-21 23:42:14 -0500578 continue; // Unconsumed kwargs, but no py::kwargs argument to accept them
579
580 // 4a. If we have a py::args argument, create a new tuple with leftovers
581 tuple extra_args;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500582 if (func.has_args) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500583 if (args_to_copy == 0) {
584 // We didn't copy out any position arguments from the args_in tuple, so we
585 // can reuse it directly without copying:
586 extra_args = reinterpret_borrow<tuple>(args_in);
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100587 } else if (args_copied >= n_args_in) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500588 extra_args = tuple(0);
Wenzel Jakobab60bf12017-01-31 17:23:53 +0100589 } else {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500590 size_t args_size = n_args_in - args_copied;
591 extra_args = tuple(args_size);
592 for (size_t i = 0; i < args_size; ++i) {
593 handle item = PyTuple_GET_ITEM(args_in, args_copied + i);
594 extra_args[i] = item.inc_ref().ptr();
595 }
596 }
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500597 call.args.push_back(extra_args);
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500598 call.args_convert.push_back(false);
Jason Rhinelander2686da82017-01-21 23:42:14 -0500599 }
600
601 // 4b. If we have a py::kwargs, pass on any remaining kwargs
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500602 if (func.has_kwargs) {
Jason Rhinelander2686da82017-01-21 23:42:14 -0500603 if (!kwargs.ptr())
604 kwargs = dict(); // If we didn't get one, send an empty one
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500605 call.args.push_back(kwargs);
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500606 call.args_convert.push_back(false);
Jason Rhinelander2686da82017-01-21 23:42:14 -0500607 }
608
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500609 // 5. Put everything in a vector. Not technically step 5, we've been building it
610 // in `call.args` all along.
611 #if !defined(NDEBUG)
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500612 if (call.args.size() != func.nargs || call.args_convert.size() != func.nargs)
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500613 pybind11_fail("Internal error: function call dispatcher inserted wrong number of arguments!");
614 #endif
Jason Rhinelander2686da82017-01-21 23:42:14 -0500615
Jason Rhinelandere5505892017-02-03 18:25:34 -0500616 std::vector<bool> second_pass_convert;
617 if (overloaded) {
618 // We're in the first no-convert pass, so swap out the conversion flags for a
619 // set of all-false flags. If the call fails, we'll swap the flags back in for
620 // the conversion-allowed call below.
621 second_pass_convert.resize(func.nargs, false);
622 call.args_convert.swap(second_pass_convert);
623 }
624
Jason Rhinelander2686da82017-01-21 23:42:14 -0500625 // 6. Call the function.
Wenzel Jakobbd57eb42016-05-01 14:42:20 +0200626 try {
Dean Moldovanaf2dda32017-06-26 20:34:06 +0200627 loader_life_support guard{};
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500628 result = func.impl(call);
Wenzel Jakob00062592016-07-01 16:07:35 +0200629 } catch (reference_cast_error &) {
Wenzel Jakobbd57eb42016-05-01 14:42:20 +0200630 result = PYBIND11_TRY_NEXT_OVERLOAD;
631 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100632
633 if (result.ptr() != PYBIND11_TRY_NEXT_OVERLOAD)
634 break;
Jason Rhinelanderabc29ca2017-01-23 03:50:00 -0500635
Jason Rhinelandere5505892017-02-03 18:25:34 -0500636 if (overloaded) {
637 // The (overloaded) call failed; if the call has at least one argument that
638 // permits conversion (i.e. it hasn't been explicitly specified `.noconvert()`)
639 // then add this call to the list of second pass overloads to try.
640 for (size_t i = func.is_method ? 1 : 0; i < pos_args; i++) {
641 if (second_pass_convert[i]) {
642 // Found one: swap the converting flags back in and store the call for
643 // the second pass.
644 call.args_convert.swap(second_pass_convert);
645 second_pass.push_back(std::move(call));
646 break;
647 }
648 }
649 }
650 }
651
652 if (overloaded && !second_pass.empty() && result.ptr() == PYBIND11_TRY_NEXT_OVERLOAD) {
653 // The no-conversion pass finished without success, try again with conversion allowed
654 for (auto &call : second_pass) {
655 try {
Dean Moldovanaf2dda32017-06-26 20:34:06 +0200656 loader_life_support guard{};
Jason Rhinelandere5505892017-02-03 18:25:34 -0500657 result = call.func.impl(call);
658 } catch (reference_cast_error &) {
659 result = PYBIND11_TRY_NEXT_OVERLOAD;
660 }
661
662 if (result.ptr() != PYBIND11_TRY_NEXT_OVERLOAD)
663 break;
664 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100665 }
Dean Moldovan135ba8d2016-09-10 11:58:02 +0200666 } catch (error_already_set &e) {
667 e.restore();
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400668 return nullptr;
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100669 } catch (...) {
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400670 /* When an exception is caught, give each registered exception
671 translator a chance to translate it to a Python exception
672 in reverse order of registration.
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200673
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400674 A translator may choose to do one of the following:
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200675
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400676 - catch the exception and call PyErr_SetString or PyErr_SetObject
677 to set a standard (or custom) Python exception, or
678 - do nothing and let the exception fall through to the next translator, or
679 - delegate translation to the next translator by throwing a new type of exception. */
680
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200681 auto last_exception = std::current_exception();
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500682 auto &registered_exception_translators = get_internals().registered_exception_translators;
Pim Schellart5a7d17f2016-06-17 17:35:59 -0400683 for (auto& translator : registered_exception_translators) {
684 try {
685 translator(last_exception);
686 } catch (...) {
687 last_exception = std::current_exception();
688 continue;
689 }
690 return nullptr;
691 }
692 PyErr_SetString(PyExc_SystemError, "Exception escaped from default exception translator!");
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100693 return nullptr;
694 }
695
696 if (result.ptr() == PYBIND11_TRY_NEXT_OVERLOAD) {
Wenzel Jakob382484a2016-09-10 15:28:37 +0900697 if (overloads->is_operator)
698 return handle(Py_NotImplemented).inc_ref().ptr();
699
Wenzel Jakobe99ebae2016-09-12 11:44:37 +0900700 std::string msg = std::string(overloads->name) + "(): incompatible " +
701 std::string(overloads->is_constructor ? "constructor" : "function") +
702 " arguments. The following argument types are supported:\n";
703
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100704 int ctr = 0;
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -0500705 for (function_record *it2 = overloads; it2 != nullptr; it2 = it2->next) {
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100706 msg += " "+ std::to_string(++ctr) + ". ";
Jason Rhinelander4e45e182016-07-17 17:43:00 -0400707
708 bool wrote_sig = false;
709 if (overloads->is_constructor) {
Dean Moldovanecced6c2016-07-31 20:03:18 +0200710 // For a constructor, rewrite `(self: Object, arg0, ...) -> NoneType` as `Object(arg0, ...)`
Jason Rhinelander4e45e182016-07-17 17:43:00 -0400711 std::string sig = it2->signature;
Dean Moldovanecced6c2016-07-31 20:03:18 +0200712 size_t start = sig.find('(') + 7; // skip "(self: "
Jason Rhinelander4e45e182016-07-17 17:43:00 -0400713 if (start < sig.size()) {
714 // End at the , for the next argument
715 size_t end = sig.find(", "), next = end + 2;
716 size_t ret = sig.rfind(" -> ");
717 // Or the ), if there is no comma:
718 if (end >= sig.size()) next = end = sig.find(')');
719 if (start < end && next < sig.size()) {
720 msg.append(sig, start, end - start);
721 msg += '(';
722 msg.append(sig, next, ret - next);
723 wrote_sig = true;
724 }
725 }
726 }
727 if (!wrote_sig) msg += it2->signature;
728
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100729 msg += "\n";
730 }
Wenzel Jakobe99ebae2016-09-12 11:44:37 +0900731 msg += "\nInvoked with: ";
Jason Rhinelander2686da82017-01-21 23:42:14 -0500732 auto args_ = reinterpret_borrow<tuple>(args_in);
Jason Rhinelander231e1672017-02-23 21:04:46 -0500733 bool some_args = false;
Wenzel Jakob1f66a582016-07-18 10:47:10 +0200734 for (size_t ti = overloads->is_constructor ? 1 : 0; ti < args_.size(); ++ti) {
Jason Rhinelander231e1672017-02-23 21:04:46 -0500735 if (!some_args) some_args = true;
736 else msg += ", ";
Jason Rhinelander7146d622016-11-22 05:28:40 -0500737 msg += pybind11::repr(args_[ti]);
Andreas Bergmeier16d43942016-05-24 09:19:35 +0200738 }
Jason Rhinelander231e1672017-02-23 21:04:46 -0500739 if (kwargs_in) {
740 auto kwargs = reinterpret_borrow<dict>(kwargs_in);
741 if (kwargs.size() > 0) {
742 if (some_args) msg += "; ";
743 msg += "kwargs: ";
744 bool first = true;
745 for (auto kwarg : kwargs) {
746 if (first) first = false;
747 else msg += ", ";
748 msg += pybind11::str("{}={!r}").format(kwarg.first, kwarg.second);
749 }
750 }
751 }
752
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100753 PyErr_SetString(PyExc_TypeError, msg.c_str());
754 return nullptr;
755 } else if (!result) {
756 std::string msg = "Unable to convert function return value to a "
757 "Python type! The signature was\n\t";
758 msg += it->signature;
759 PyErr_SetString(PyExc_TypeError, msg.c_str());
760 return nullptr;
761 } else {
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200762 if (overloads->is_constructor && !self_value_and_holder.holder_constructed()) {
Jason Rhinelander464d9892017-06-12 21:52:48 -0400763 auto *pi = reinterpret_cast<instance *>(parent.ptr());
Dean Moldovan39fd6a92017-08-17 02:01:32 +0200764 self_value_and_holder.type->init_instance(pi, nullptr);
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100765 }
766 return result.ptr();
767 }
768 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200769};
770
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100771/// Wrapper for Python extension modules
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200772class module : public object {
773public:
Wenzel Jakobb1b71402015-10-18 16:48:30 +0200774 PYBIND11_OBJECT_DEFAULT(module, object, PyModule_Check)
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200775
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100776 /// Create a new top-level Python module with the given name and docstring
Jason Rhinelander12d76602016-10-16 16:27:42 -0400777 explicit module(const char *name, const char *doc = nullptr) {
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100778 if (!options::show_user_defined_docstrings()) doc = nullptr;
Wenzel Jakob57082212015-09-04 23:42:12 +0200779#if PY_MAJOR_VERSION >= 3
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200780 PyModuleDef *def = new PyModuleDef();
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500781 std::memset(def, 0, sizeof(PyModuleDef));
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200782 def->m_name = name;
783 def->m_doc = doc;
784 def->m_size = -1;
785 Py_INCREF(def);
786 m_ptr = PyModule_Create(def);
Wenzel Jakob57082212015-09-04 23:42:12 +0200787#else
788 m_ptr = Py_InitModule3(name, nullptr, doc);
789#endif
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200790 if (m_ptr == nullptr)
Wenzel Jakob678d7872016-01-17 22:36:41 +0100791 pybind11_fail("Internal error in module::module()");
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200792 inc_ref();
793 }
794
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100795 /** \rst
796 Create Python binding for a new function within the module scope. ``Func``
797 can be a plain C++ function, a function pointer, or a lambda function. For
798 details on the ``Extra&& ... extra`` argument, see section :ref:`extras`.
799 \endrst */
Wenzel Jakob71867832015-07-29 17:43:52 +0200800 template <typename Func, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100801 module &def(const char *name_, Func &&f, const Extra& ... extra) {
Dean Moldovan865e4302016-09-21 01:06:32 +0200802 cpp_function func(std::forward<Func>(f), name(name_), scope(*this),
803 sibling(getattr(*this, name_, none())), extra...);
Jason Rhinelander6873c202016-10-24 21:58:22 -0400804 // NB: allow overwriting here because cpp_function sets up a chain with the intention of
805 // overwriting (and has already checked internally that it isn't overwriting non-functions).
806 add_object(name_, func, true /* overwrite */);
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200807 return *this;
808 }
809
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100810 /** \rst
811 Create and return a new Python submodule with the given name and docstring.
812 This also works recursively, i.e.
813
814 .. code-block:: cpp
815
816 py::module m("example", "pybind11 example plugin");
817 py::module m2 = m.def_submodule("sub", "A submodule of 'example'");
818 py::module m3 = m2.def_submodule("subsub", "A submodule of 'example.sub'");
819 \endrst */
Wenzel Jakobbd4a5292015-07-11 17:41:48 +0200820 module def_submodule(const char *name, const char *doc = nullptr) {
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200821 std::string full_name = std::string(PyModule_GetName(m_ptr))
822 + std::string(".") + std::string(name);
Dean Moldovanc7ac16b2016-10-28 03:08:15 +0200823 auto result = reinterpret_borrow<module>(PyImport_AddModule(full_name.c_str()));
Alexander Stukowski9a110e62016-11-15 12:38:05 +0100824 if (doc && options::show_user_defined_docstrings())
Wenzel Jakob8f4eb002015-10-15 18:13:33 +0200825 result.attr("__doc__") = pybind11::str(doc);
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200826 attr(name) = result;
827 return result;
828 }
Wenzel Jakobdb028d62015-10-13 23:44:25 +0200829
Dean Moldovan57a9bbc2017-01-31 16:54:08 +0100830 /// Import and return a module or throws `error_already_set`.
Wenzel Jakobdb028d62015-10-13 23:44:25 +0200831 static module import(const char *name) {
Wenzel Jakobdd57a342015-12-26 14:04:52 +0100832 PyObject *obj = PyImport_ImportModule(name);
833 if (!obj)
esquires67a68f12016-12-01 05:35:34 -0500834 throw error_already_set();
Dean Moldovanc7ac16b2016-10-28 03:08:15 +0200835 return reinterpret_steal<module>(obj);
Wenzel Jakobdb028d62015-10-13 23:44:25 +0200836 }
Jason Rhinelander6873c202016-10-24 21:58:22 -0400837
838 // Adds an object to the module using the given name. Throws if an object with the given name
839 // already exists.
840 //
841 // overwrite should almost always be false: attempting to overwrite objects that pybind11 has
842 // established will, in most cases, break things.
Wenzel Jakobaa1b3162017-03-30 11:59:32 +0200843 PYBIND11_NOINLINE void add_object(const char *name, handle obj, bool overwrite = false) {
Jason Rhinelander6873c202016-10-24 21:58:22 -0400844 if (!overwrite && hasattr(*this, name))
845 pybind11_fail("Error during initialization: multiple incompatible definitions with name \"" +
846 std::string(name) + "\"");
847
Wenzel Jakobaa1b3162017-03-30 11:59:32 +0200848 PyModule_AddObject(ptr(), name, obj.inc_ref().ptr() /* steals a reference */);
Jason Rhinelander6873c202016-10-24 21:58:22 -0400849 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200850};
851
Dean Moldovan22c413b2017-03-30 00:20:42 +0200852/// \ingroup python_builtins
Dean Moldovan1d3c4bc2017-06-06 17:05:19 +0200853/// Return a dictionary representing the global variables in the current execution frame,
854/// or ``__main__.__dict__`` if there is no frame (usually when the interpreter is embedded).
855inline dict globals() {
856 PyObject *p = PyEval_GetGlobals();
857 return reinterpret_borrow<dict>(p ? p : module::import("__main__").attr("__dict__").ptr());
858}
Dean Moldovan22c413b2017-03-30 00:20:42 +0200859
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200860NAMESPACE_BEGIN(detail)
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100861/// Generic support for creating new Python heap types
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100862class generic_type : public object {
Jason Rhinelander5fffe202016-09-06 12:17:06 -0400863 template <typename...> friend class class_;
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200864public:
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100865 PYBIND11_OBJECT_DEFAULT(generic_type, object, PyType_Check)
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100866protected:
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100867 void initialize(const type_record &rec) {
868 if (rec.scope && hasattr(rec.scope, rec.name))
869 pybind11_fail("generic_type: cannot initialize type \"" + std::string(rec.name) +
870 "\": an object with that name is already defined");
Wenzel Jakob38d8b8c2016-05-31 09:53:28 +0200871
Jason Rhinelander5e14aa62017-08-17 11:38:05 -0400872 if (rec.module_local ? get_local_type_info(*rec.type) : get_global_type_info(*rec.type))
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100873 pybind11_fail("generic_type: type \"" + std::string(rec.name) +
Wenzel Jakob38d8b8c2016-05-31 09:53:28 +0200874 "\" is already registered!");
875
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100876 m_ptr = make_new_python_type(rec);
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200877
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100878 /* Register supplemental type information in C++ dict */
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100879 auto *tinfo = new detail::type_info();
880 tinfo->type = (PyTypeObject *) m_ptr;
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400881 tinfo->cpptype = rec.type;
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100882 tinfo->type_size = rec.type_size;
Dean Moldovan0d765f42017-03-21 01:15:20 +0100883 tinfo->operator_new = rec.operator_new;
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500884 tinfo->holder_size_in_ptrs = size_in_ptrs(rec.holder_size);
Jason Rhinelander353615f2017-07-25 00:53:23 -0400885 tinfo->init_instance = rec.init_instance;
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100886 tinfo->dealloc = rec.dealloc;
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400887 tinfo->simple_type = true;
888 tinfo->simple_ancestors = true;
Jason Rhinelander7437c692017-07-28 22:03:44 -0400889 tinfo->default_holder = rec.default_holder;
890 tinfo->module_local = rec.module_local;
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100891
892 auto &internals = get_internals();
893 auto tindex = std::type_index(*rec.type);
Ivan Smirnova6e6a8b2016-10-23 15:27:13 +0100894 tinfo->direct_conversions = &internals.direct_conversions[tindex];
Jason Rhinelander7437c692017-07-28 22:03:44 -0400895 if (rec.module_local)
896 registered_local_types_cpp()[tindex] = tinfo;
897 else
898 internals.registered_types_cpp[tindex] = tinfo;
Jason Rhinelandere45c2112017-02-22 21:36:09 -0500899 internals.registered_types_py[(PyTypeObject *) m_ptr] = { tinfo };
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100900
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400901 if (rec.bases.size() > 1 || rec.multiple_inheritance) {
Dean Moldovan08cbe8d2017-02-15 21:10:25 +0100902 mark_parents_nonsimple(tinfo->type);
Jason Rhinelander1f8a1002017-04-21 19:01:30 -0400903 tinfo->simple_ancestors = false;
904 }
905 else if (rec.bases.size() == 1) {
906 auto parent_tinfo = get_type_info((PyTypeObject *) rec.bases[0].ptr());
907 tinfo->simple_ancestors = parent_tinfo->simple_ancestors;
908 }
Jason Rhinelander5e14aa62017-08-17 11:38:05 -0400909
910 if (rec.module_local) {
911 // Stash the local typeinfo and loader so that external modules can access it.
912 tinfo->module_local_load = &type_caster_generic::local_load;
Dean Moldovan96997a42017-08-20 17:14:09 +0200913 setattr(m_ptr, PYBIND11_MODULE_LOCAL_ID, capsule(tinfo));
Jason Rhinelander5e14aa62017-08-17 11:38:05 -0400914 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200915 }
916
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +0900917 /// Helper function which tags all parents of a type using mult. inheritance
918 void mark_parents_nonsimple(PyTypeObject *value) {
Dean Moldovanc7ac16b2016-10-28 03:08:15 +0200919 auto t = reinterpret_borrow<tuple>(value->tp_bases);
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +0900920 for (handle h : t) {
921 auto tinfo2 = get_type_info((PyTypeObject *) h.ptr());
922 if (tinfo2)
923 tinfo2->simple_type = false;
924 mark_parents_nonsimple((PyTypeObject *) h.ptr());
925 }
926 }
927
Wenzel Jakob43398a82015-07-28 16:12:20 +0200928 void install_buffer_funcs(
929 buffer_info *(*get_buffer)(PyObject *, void *),
930 void *get_buffer_data) {
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200931 PyHeapTypeObject *type = (PyHeapTypeObject*) m_ptr;
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100932 auto tinfo = detail::get_type_info(&type->ht_type);
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100933
934 if (!type->ht_type.tp_as_buffer)
935 pybind11_fail(
936 "To be able to register buffer protocol support for the type '" +
937 std::string(tinfo->type->tp_name) +
938 "' the associated class<>(..) invocation must "
939 "include the pybind11::buffer_protocol() annotation!");
940
Wenzel Jakobd561cb02016-01-17 22:36:41 +0100941 tinfo->get_buffer = get_buffer;
942 tinfo->get_buffer_data = get_buffer_data;
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200943 }
944
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100945 void def_property_static_impl(const char *name,
946 handle fget, handle fset,
947 detail::function_record *rec_fget) {
Dean Moldovanc91f8bd2017-02-13 18:11:24 +0100948 const auto is_static = !(rec_fget->is_method && rec_fget->scope);
949 const auto has_doc = rec_fget->doc && pybind11::options::show_user_defined_docstrings();
950
Dean Moldovanc91f8bd2017-02-13 18:11:24 +0100951 auto property = handle((PyObject *) (is_static ? get_internals().static_property_type
952 : &PyProperty_Type));
953 attr(name) = property(fget.ptr() ? fget : none(),
954 fset.ptr() ? fset : none(),
955 /*deleter*/none(),
956 pybind11::str(has_doc ? rec_fget->doc : ""));
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +0100957 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200958};
Jason Rhinelander6b52c832016-09-06 12:27:00 -0400959
Dean Moldovan0d765f42017-03-21 01:15:20 +0100960/// Set the pointer to operator new if it exists. The cast is needed because it can be overloaded.
961template <typename T, typename = void_t<decltype(static_cast<void *(*)(size_t)>(T::operator new))>>
962void set_operator_new(type_record *r) { r->operator_new = &T::operator new; }
963
964template <typename> void set_operator_new(...) { }
965
Jason Rhinelandera03408c2017-07-23 00:32:58 -0400966template <typename T, typename SFINAE = void> struct has_operator_delete : std::false_type { };
967template <typename T> struct has_operator_delete<T, void_t<decltype(static_cast<void (*)(void *)>(T::operator delete))>>
968 : std::true_type { };
969template <typename T, typename SFINAE = void> struct has_operator_delete_size : std::false_type { };
970template <typename T> struct has_operator_delete_size<T, void_t<decltype(static_cast<void (*)(void *, size_t)>(T::operator delete))>>
971 : std::true_type { };
Dean Moldovan0d765f42017-03-21 01:15:20 +0100972/// Call class-specific delete if it exists or global otherwise. Can also be an overload set.
Jason Rhinelandera03408c2017-07-23 00:32:58 -0400973template <typename T, enable_if_t<has_operator_delete<T>::value, int> = 0>
974void call_operator_delete(T *p, size_t) { T::operator delete(p); }
975template <typename T, enable_if_t<!has_operator_delete<T>::value && has_operator_delete_size<T>::value, int> = 0>
976void call_operator_delete(T *p, size_t s) { T::operator delete(p, s); }
Dean Moldovan0d765f42017-03-21 01:15:20 +0100977
Jason Rhinelandera03408c2017-07-23 00:32:58 -0400978inline void call_operator_delete(void *p, size_t) { ::operator delete(p); }
Dean Moldovan0d765f42017-03-21 01:15:20 +0100979
Wenzel Jakob38bd7112015-07-05 20:05:44 +0200980NAMESPACE_END(detail)
981
Jason Rhinelander23bf8942017-05-16 11:07:28 -0400982/// Given a pointer to a member function, cast it to its `Derived` version.
983/// Forward everything else unchanged.
984template <typename /*Derived*/, typename F>
985auto method_adaptor(F &&f) -> decltype(std::forward<F>(f)) { return std::forward<F>(f); }
986
987template <typename Derived, typename Return, typename Class, typename... Args>
988auto method_adaptor(Return (Class::*pmf)(Args...)) -> Return (Derived::*)(Args...) { return pmf; }
989
990template <typename Derived, typename Return, typename Class, typename... Args>
991auto method_adaptor(Return (Class::*pmf)(Args...) const) -> Return (Derived::*)(Args...) const { return pmf; }
992
Jason Rhinelander5fffe202016-09-06 12:17:06 -0400993template <typename type_, typename... options>
Wenzel Jakob48548ea2016-01-17 22:36:44 +0100994class class_ : public detail::generic_type {
Jason Rhinelander5fffe202016-09-06 12:17:06 -0400995 template <typename T> using is_holder = detail::is_holder_type<type_, T>;
Jason Rhinelander23bf8942017-05-16 11:07:28 -0400996 template <typename T> using is_subtype = detail::is_strict_base_of<type_, T>;
997 template <typename T> using is_base = detail::is_strict_base_of<T, type_>;
Jason Rhinelanderfa5d05e2016-12-12 18:11:49 -0500998 // struct instead of using here to help MSVC:
999 template <typename T> struct is_valid_class_option :
1000 detail::any_of<is_holder<T>, is_subtype<T>, is_base<T>> {};
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001001
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001002public:
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001003 using type = type_;
Dean Moldovan82ece942017-03-29 11:55:18 +02001004 using type_alias = detail::exactly_one_t<is_subtype, void, options...>;
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001005 constexpr static bool has_alias = !std::is_void<type_alias>::value;
Dean Moldovan82ece942017-03-29 11:55:18 +02001006 using holder_type = detail::exactly_one_t<is_holder, std::unique_ptr<type>, options...>;
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001007
Jason Rhinelanderfa5d05e2016-12-12 18:11:49 -05001008 static_assert(detail::all_of<is_valid_class_option<options>...>::value,
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001009 "Unknown/invalid class_ template parameters provided");
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001010
Jason Rhinelander42e5ddc2017-06-12 21:48:36 -04001011 static_assert(!has_alias || std::is_polymorphic<type>::value,
1012 "Cannot use an alias class with a non-polymorphic type");
1013
Dean Moldovanc7ac16b2016-10-28 03:08:15 +02001014 PYBIND11_OBJECT(class_, generic_type, PyType_Check)
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001015
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001016 template <typename... Extra>
1017 class_(handle scope, const char *name, const Extra &... extra) {
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001018 using namespace detail;
1019
1020 // MI can only be specified via class_ template options, not constructor parameters
1021 static_assert(
1022 none_of<is_pyobject<Extra>...>::value || // no base class arguments, or:
1023 ( constexpr_sum(is_pyobject<Extra>::value...) == 1 && // Exactly one base
1024 constexpr_sum(is_base<options>::value...) == 0 && // no template option bases
1025 none_of<std::is_same<multiple_inheritance, Extra>...>::value), // no multiple_inheritance attr
1026 "Error: multiple inheritance bases must be specified via class_ template options");
1027
1028 type_record record;
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001029 record.scope = scope;
1030 record.name = name;
1031 record.type = &typeid(type);
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001032 record.type_size = sizeof(conditional_t<has_alias, type_alias, type>);
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001033 record.holder_size = sizeof(holder_type);
Jason Rhinelander353615f2017-07-25 00:53:23 -04001034 record.init_instance = init_instance;
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001035 record.dealloc = dealloc;
Pim Schellartcc88aae2017-01-31 10:52:11 -05001036 record.default_holder = std::is_same<holder_type, std::unique_ptr<type>>::value;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001037
Dean Moldovan0d765f42017-03-21 01:15:20 +01001038 set_operator_new<type>(&record);
1039
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001040 /* Register base classes specified via template arguments to class_, if any */
Jason Rhinelander926e2cf2017-03-25 22:41:06 -03001041 PYBIND11_EXPAND_SIDE_EFFECTS(add_base<options>(record));
Jason Rhinelander6b52c832016-09-06 12:27:00 -04001042
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001043 /* Process optional arguments, if any */
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001044 process_attributes<Extra...>::init(extra..., &record);
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001045
Jason Rhinelanderb9616262017-03-16 20:10:48 -03001046 generic_type::initialize(record);
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001047
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001048 if (has_alias) {
Jason Rhinelander7437c692017-07-28 22:03:44 -04001049 auto &instances = record.module_local ? registered_local_types_cpp() : get_internals().registered_types_cpp;
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001050 instances[std::type_index(typeid(type_alias))] = instances[std::type_index(typeid(type))];
1051 }
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001052 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001053
Wenzel Jakobc1fc27e2016-09-13 00:36:43 +09001054 template <typename Base, detail::enable_if_t<is_base<Base>::value, int> = 0>
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001055 static void add_base(detail::type_record &rec) {
Jason Rhinelander21966962017-06-21 13:38:10 -04001056 rec.add_base(typeid(Base), [](void *src) -> void * {
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001057 return static_cast<Base *>(reinterpret_cast<type *>(src));
1058 });
1059 }
1060
Wenzel Jakobc1fc27e2016-09-13 00:36:43 +09001061 template <typename Base, detail::enable_if_t<!is_base<Base>::value, int> = 0>
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001062 static void add_base(detail::type_record &) { }
1063
Wenzel Jakob71867832015-07-29 17:43:52 +02001064 template <typename Func, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001065 class_ &def(const char *name_, Func&& f, const Extra&... extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001066 cpp_function cf(method_adaptor<type>(std::forward<Func>(f)), name(name_), is_method(*this),
Dean Moldovan865e4302016-09-21 01:06:32 +02001067 sibling(getattr(*this, name_, none())), extra...);
Wenzel Jakob57082212015-09-04 23:42:12 +02001068 attr(cf.name()) = cf;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001069 return *this;
1070 }
1071
Wenzel Jakob71867832015-07-29 17:43:52 +02001072 template <typename Func, typename... Extra> class_ &
Jason Rhinelander139a0822017-03-12 17:59:07 -03001073 def_static(const char *name_, Func &&f, const Extra&... extra) {
1074 static_assert(!std::is_member_function_pointer<Func>::value,
1075 "def_static(...) called with a non-static member function pointer");
Dean Moldovan865e4302016-09-21 01:06:32 +02001076 cpp_function cf(std::forward<Func>(f), name(name_), scope(*this),
1077 sibling(getattr(*this, name_, none())), extra...);
Wenzel Jakob57082212015-09-04 23:42:12 +02001078 attr(cf.name()) = cf;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001079 return *this;
1080 }
1081
Wenzel Jakob71867832015-07-29 17:43:52 +02001082 template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001083 class_ &def(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001084 op.execute(*this, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001085 return *this;
1086 }
1087
Wenzel Jakob71867832015-07-29 17:43:52 +02001088 template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001089 class_ & def_cast(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001090 op.execute_cast(*this, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001091 return *this;
1092 }
1093
Wenzel Jakob71867832015-07-29 17:43:52 +02001094 template <typename... Args, typename... Extra>
Jason Rhinelanderc4e18002017-08-17 00:01:42 -04001095 class_ &def(const detail::initimpl::constructor<Args...> &init, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001096 init.execute(*this, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001097 return *this;
1098 }
1099
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001100 template <typename... Args, typename... Extra>
Jason Rhinelanderc4e18002017-08-17 00:01:42 -04001101 class_ &def(const detail::initimpl::alias_constructor<Args...> &init, const Extra&... extra) {
Jason Rhinelander5fffe202016-09-06 12:17:06 -04001102 init.execute(*this, extra...);
Wenzel Jakob86d825f2016-05-26 13:19:27 +02001103 return *this;
1104 }
1105
Jason Rhinelander464d9892017-06-12 21:52:48 -04001106 template <typename... Args, typename... Extra>
1107 class_ &def(detail::initimpl::factory<Args...> &&init, const Extra&... extra) {
1108 std::move(init).execute(*this, extra...);
1109 return *this;
1110 }
1111
Dean Moldovan1e5a7da2017-08-24 01:53:15 +02001112 template <typename... Args, typename... Extra>
1113 class_ &def(detail::initimpl::pickle_factory<Args...> &&pf, const Extra &...extra) {
1114 std::move(pf).execute(*this, extra...);
1115 return *this;
1116 }
1117
Wenzel Jakob71867832015-07-29 17:43:52 +02001118 template <typename Func> class_& def_buffer(Func &&func) {
Wenzel Jakob43398a82015-07-28 16:12:20 +02001119 struct capture { Func func; };
1120 capture *ptr = new capture { std::forward<Func>(func) };
1121 install_buffer_funcs([](PyObject *obj, void *ptr) -> buffer_info* {
Dean Moldovan5f07fac2017-01-03 11:52:05 +01001122 detail::make_caster<type> caster;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001123 if (!caster.load(obj, false))
1124 return nullptr;
Wenzel Jakob43398a82015-07-28 16:12:20 +02001125 return new buffer_info(((capture *) ptr)->func(caster));
1126 }, ptr);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001127 return *this;
1128 }
1129
Bruce Merryfe0cf8b2017-05-17 10:52:33 +02001130 template <typename Return, typename Class, typename... Args>
1131 class_ &def_buffer(Return (Class::*func)(Args...)) {
1132 return def_buffer([func] (type &obj) { return (obj.*func)(); });
1133 }
1134
1135 template <typename Return, typename Class, typename... Args>
1136 class_ &def_buffer(Return (Class::*func)(Args...) const) {
1137 return def_buffer([func] (const type &obj) { return (obj.*func)(); });
1138 }
1139
Wenzel Jakob71867832015-07-29 17:43:52 +02001140 template <typename C, typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001141 class_ &def_readwrite(const char *name, D C::*pm, const Extra&... extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001142 static_assert(std::is_base_of<C, type>::value, "def_readwrite() requires a class member (or base class member)");
1143 cpp_function fget([pm](const type &c) -> const D &{ return c.*pm; }, is_method(*this)),
1144 fset([pm](type &c, const D &value) { c.*pm = value; }, is_method(*this));
Wenzel Jakob0b489582016-03-25 16:13:10 +01001145 def_property(name, fget, fset, return_value_policy::reference_internal, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001146 return *this;
1147 }
1148
Wenzel Jakob71867832015-07-29 17:43:52 +02001149 template <typename C, typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001150 class_ &def_readonly(const char *name, const D C::*pm, const Extra& ...extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001151 static_assert(std::is_base_of<C, type>::value, "def_readonly() requires a class member (or base class member)");
1152 cpp_function fget([pm](const type &c) -> const D &{ return c.*pm; }, is_method(*this));
Wenzel Jakob0b489582016-03-25 16:13:10 +01001153 def_property_readonly(name, fget, return_value_policy::reference_internal, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001154 return *this;
1155 }
1156
Wenzel Jakob71867832015-07-29 17:43:52 +02001157 template <typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001158 class_ &def_readwrite_static(const char *name, D *pm, const Extra& ...extra) {
Wenzel Jakob0b489582016-03-25 16:13:10 +01001159 cpp_function fget([pm](object) -> const D &{ return *pm; }, scope(*this)),
1160 fset([pm](object, const D &value) { *pm = value; }, scope(*this));
1161 def_property_static(name, fget, fset, return_value_policy::reference, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001162 return *this;
1163 }
1164
Wenzel Jakob71867832015-07-29 17:43:52 +02001165 template <typename D, typename... Extra>
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001166 class_ &def_readonly_static(const char *name, const D *pm, const Extra& ...extra) {
Wenzel Jakob0b489582016-03-25 16:13:10 +01001167 cpp_function fget([pm](object) -> const D &{ return *pm; }, scope(*this));
1168 def_property_readonly_static(name, fget, return_value_policy::reference, extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001169 return *this;
1170 }
1171
Dean Moldovan03f627e2016-11-01 11:44:57 +01001172 /// Uses return_value_policy::reference_internal by default
1173 template <typename Getter, typename... Extra>
1174 class_ &def_property_readonly(const char *name, const Getter &fget, const Extra& ...extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001175 return def_property_readonly(name, cpp_function(method_adaptor<type>(fget)),
1176 return_value_policy::reference_internal, extra...);
Dean Moldovan03f627e2016-11-01 11:44:57 +01001177 }
1178
1179 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001180 template <typename... Extra>
1181 class_ &def_property_readonly(const char *name, const cpp_function &fget, const Extra& ...extra) {
Dean Moldovan03f627e2016-11-01 11:44:57 +01001182 return def_property(name, fget, cpp_function(), extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001183 }
1184
Dean Moldovan03f627e2016-11-01 11:44:57 +01001185 /// Uses return_value_policy::reference by default
1186 template <typename Getter, typename... Extra>
1187 class_ &def_property_readonly_static(const char *name, const Getter &fget, const Extra& ...extra) {
1188 return def_property_readonly_static(name, cpp_function(fget), return_value_policy::reference, extra...);
1189 }
1190
1191 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001192 template <typename... Extra>
1193 class_ &def_property_readonly_static(const char *name, const cpp_function &fget, const Extra& ...extra) {
Dean Moldovan03f627e2016-11-01 11:44:57 +01001194 return def_property_static(name, fget, cpp_function(), extra...);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001195 }
1196
Dean Moldovan03f627e2016-11-01 11:44:57 +01001197 /// Uses return_value_policy::reference_internal by default
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001198 template <typename Getter, typename Setter, typename... Extra>
1199 class_ &def_property(const char *name, const Getter &fget, const Setter &fset, const Extra& ...extra) {
1200 return def_property(name, fget, cpp_function(method_adaptor<type>(fset)), extra...);
1201 }
Dean Moldovan03f627e2016-11-01 11:44:57 +01001202 template <typename Getter, typename... Extra>
1203 class_ &def_property(const char *name, const Getter &fget, const cpp_function &fset, const Extra& ...extra) {
Jason Rhinelander23bf8942017-05-16 11:07:28 -04001204 return def_property(name, cpp_function(method_adaptor<type>(fget)), fset,
1205 return_value_policy::reference_internal, extra...);
Dean Moldovan03f627e2016-11-01 11:44:57 +01001206 }
1207
1208 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001209 template <typename... Extra>
1210 class_ &def_property(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
Wenzel Jakob0b489582016-03-25 16:13:10 +01001211 return def_property_static(name, fget, fset, is_method(*this), extra...);
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001212 }
1213
Dean Moldovan03f627e2016-11-01 11:44:57 +01001214 /// Uses return_value_policy::reference by default
1215 template <typename Getter, typename... Extra>
1216 class_ &def_property_static(const char *name, const Getter &fget, const cpp_function &fset, const Extra& ...extra) {
1217 return def_property_static(name, cpp_function(fget), fset, return_value_policy::reference, extra...);
1218 }
1219
1220 /// Uses cpp_function's return_value_policy by default
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001221 template <typename... Extra>
1222 class_ &def_property_static(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
1223 auto rec_fget = get_function_record(fget), rec_fset = get_function_record(fset);
Wenzel Jakob7c99ff22016-06-02 20:33:01 +02001224 char *doc_prev = rec_fget->doc; /* 'extra' field may include a property-specific documentation string */
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001225 detail::process_attributes<Extra...>::init(extra..., rec_fget);
Wenzel Jakob7c99ff22016-06-02 20:33:01 +02001226 if (rec_fget->doc && rec_fget->doc != doc_prev) {
1227 free(doc_prev);
1228 rec_fget->doc = strdup(rec_fget->doc);
1229 }
1230 if (rec_fset) {
1231 doc_prev = rec_fset->doc;
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001232 detail::process_attributes<Extra...>::init(extra..., rec_fset);
Wenzel Jakob7c99ff22016-06-02 20:33:01 +02001233 if (rec_fset->doc && rec_fset->doc != doc_prev) {
1234 free(doc_prev);
1235 rec_fset->doc = strdup(rec_fset->doc);
1236 }
1237 }
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001238 def_property_static_impl(name, fget, fset, rec_fget);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001239 return *this;
1240 }
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001241
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001242private:
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001243 /// Initialize holder object, variant 1: object derives from enable_shared_from_this
1244 template <typename T>
Jason Rhinelander353615f2017-07-25 00:53:23 -04001245 static void init_holder(detail::instance *inst, detail::value_and_holder &v_h,
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001246 const holder_type * /* unused */, const std::enable_shared_from_this<T> * /* dummy */) {
Wenzel Jakob6e213c92015-11-24 23:05:58 +01001247 try {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001248 auto sh = std::dynamic_pointer_cast<typename holder_type::element_type>(
1249 v_h.value_ptr<type>()->shared_from_this());
Jason Rhinelanderb8ac4382017-05-19 13:34:55 -04001250 if (sh) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001251 new (&v_h.holder<holder_type>()) holder_type(std::move(sh));
1252 v_h.set_holder_constructed();
Dean Moldovanab90ec62016-12-07 02:36:44 +01001253 }
Jason Rhinelanderb8ac4382017-05-19 13:34:55 -04001254 } catch (const std::bad_weak_ptr &) {}
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001255
1256 if (!v_h.holder_constructed() && inst->owned) {
1257 new (&v_h.holder<holder_type>()) holder_type(v_h.value_ptr<type>());
1258 v_h.set_holder_constructed();
Wenzel Jakob6e213c92015-11-24 23:05:58 +01001259 }
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001260 }
1261
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001262 static void init_holder_from_existing(const detail::value_and_holder &v_h,
1263 const holder_type *holder_ptr, std::true_type /*is_copy_constructible*/) {
1264 new (&v_h.holder<holder_type>()) holder_type(*reinterpret_cast<const holder_type *>(holder_ptr));
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001265 }
1266
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001267 static void init_holder_from_existing(const detail::value_and_holder &v_h,
1268 const holder_type *holder_ptr, std::false_type /*is_copy_constructible*/) {
1269 new (&v_h.holder<holder_type>()) holder_type(std::move(*const_cast<holder_type *>(holder_ptr)));
Dean Moldovanec009a72017-01-31 17:05:44 +01001270 }
1271
1272 /// Initialize holder object, variant 2: try to construct from existing holder object, if possible
Jason Rhinelander353615f2017-07-25 00:53:23 -04001273 static void init_holder(detail::instance *inst, detail::value_and_holder &v_h,
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001274 const holder_type *holder_ptr, const void * /* dummy -- not enable_shared_from_this<T>) */) {
Dean Moldovanec009a72017-01-31 17:05:44 +01001275 if (holder_ptr) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001276 init_holder_from_existing(v_h, holder_ptr, std::is_copy_constructible<holder_type>());
1277 v_h.set_holder_constructed();
Dean Moldovanec009a72017-01-31 17:05:44 +01001278 } else if (inst->owned || detail::always_construct_holder<holder_type>::value) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001279 new (&v_h.holder<holder_type>()) holder_type(v_h.value_ptr<type>());
1280 v_h.set_holder_constructed();
Jason Rhinelanderc07ec312016-11-06 13:12:48 -05001281 }
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001282 }
1283
Jason Rhinelander353615f2017-07-25 00:53:23 -04001284 /// Performs instance initialization including constructing a holder and registering the known
1285 /// instance. Should be called as soon as the `type` value_ptr is set for an instance. Takes an
1286 /// optional pointer to an existing holder to use; if not specified and the instance is
1287 /// `.owned`, a new holder will be constructed to manage the value pointer.
1288 static void init_instance(detail::instance *inst, const void *holder_ptr) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001289 auto v_h = inst->get_value_and_holder(detail::get_type_info(typeid(type)));
Jason Rhinelandercca20a72017-07-29 03:56:01 -04001290 if (!v_h.instance_registered()) {
1291 register_instance(inst, v_h.value_ptr(), v_h.type);
1292 v_h.set_instance_registered();
1293 }
Jason Rhinelander353615f2017-07-25 00:53:23 -04001294 init_holder(inst, v_h, (const holder_type *) holder_ptr, v_h.value_ptr<type>());
Wenzel Jakob6e213c92015-11-24 23:05:58 +01001295 }
1296
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001297 /// Deallocates an instance; via holder, if constructed; otherwise via operator delete.
Jason Rhinelander464d9892017-06-12 21:52:48 -04001298 static void dealloc(detail::value_and_holder &v_h) {
1299 if (v_h.holder_constructed()) {
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001300 v_h.holder<holder_type>().~holder_type();
Jason Rhinelander464d9892017-06-12 21:52:48 -04001301 v_h.set_holder_constructed(false);
1302 }
1303 else {
Jason Rhinelandera03408c2017-07-23 00:32:58 -04001304 detail::call_operator_delete(v_h.value_ptr<type>(), v_h.type->type_size);
Jason Rhinelander464d9892017-06-12 21:52:48 -04001305 }
1306 v_h.value_ptr() = nullptr;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001307 }
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001308
1309 static detail::function_record *get_function_record(handle h) {
1310 h = detail::get_function(h);
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001311 return h ? (detail::function_record *) reinterpret_borrow<capsule>(PyCFunction_GET_SELF(h.ptr()))
Dean Moldovanc7ac16b2016-10-28 03:08:15 +02001312 : nullptr;
Wenzel Jakob84ec78f2016-03-21 17:54:24 +01001313 }
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001314};
1315
Dean Moldovan68986792017-08-30 23:40:55 +02001316/// Binds an existing constructor taking arguments Args...
1317template <typename... Args> detail::initimpl::constructor<Args...> init() { return {}; }
1318/// Like `init<Args...>()`, but the instance is always constructed through the alias class (even
1319/// when not inheriting on the Python side).
1320template <typename... Args> detail::initimpl::alias_constructor<Args...> init_alias() { return {}; }
1321
1322/// Binds a factory function as a constructor
1323template <typename Func, typename Ret = detail::initimpl::factory<Func>>
1324Ret init(Func &&f) { return {std::forward<Func>(f)}; }
1325
1326/// Dual-argument factory function: the first function is called when no alias is needed, the second
1327/// when an alias is needed (i.e. due to python-side inheritance). Arguments must be identical.
1328template <typename CFunc, typename AFunc, typename Ret = detail::initimpl::factory<CFunc, AFunc>>
1329Ret init(CFunc &&c, AFunc &&a) {
1330 return {std::forward<CFunc>(c), std::forward<AFunc>(a)};
1331}
1332
1333/// Binds pickling functions `__getstate__` and `__setstate__` and ensures that the type
1334/// returned by `__getstate__` is the same as the argument accepted by `__setstate__`.
1335template <typename GetState, typename SetState>
1336detail::initimpl::pickle_factory<GetState, SetState> pickle(GetState &&g, SetState &&s) {
1337 return {std::forward<GetState>(g), std::forward<SetState>(s)};
Marcin Wojdyrfbab29c2017-09-04 18:37:16 +01001338}
Dean Moldovan68986792017-08-30 23:40:55 +02001339
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001340/// Binds C++ enumerations and enumeration classes to Python
1341template <typename Type> class enum_ : public class_<Type> {
1342public:
Wenzel Jakob8ac97152016-09-05 17:20:50 +09001343 using class_<Type>::def;
Matthieu Becaf936e12017-03-03 08:45:50 -08001344 using class_<Type>::def_property_readonly_static;
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001345 using Scalar = typename std::underlying_type<Type>::type;
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001346
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001347 template <typename... Extra>
1348 enum_(const handle &scope, const char *name, const Extra&... extra)
Matthieu Becaf936e12017-03-03 08:45:50 -08001349 : class_<Type>(scope, name, extra...), m_entries(), m_parent(scope) {
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001350
Dean Moldovan82ece942017-03-29 11:55:18 +02001351 constexpr bool is_arithmetic = detail::any_of<std::is_same<arithmetic, Extra>...>::value;
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001352
Matthieu Becaf936e12017-03-03 08:45:50 -08001353 auto m_entries_ptr = m_entries.inc_ref().ptr();
1354 def("__repr__", [name, m_entries_ptr](Type value) -> pybind11::str {
1355 for (const auto &kv : reinterpret_borrow<dict>(m_entries_ptr)) {
1356 if (pybind11::cast<Type>(kv.second) == value)
1357 return pybind11::str("{}.{}").format(name, kv.first);
1358 }
1359 return pybind11::str("{}.???").format(name);
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001360 });
Matthieu Becaf936e12017-03-03 08:45:50 -08001361 def_property_readonly_static("__members__", [m_entries_ptr](object /* self */) {
1362 dict m;
1363 for (const auto &kv : reinterpret_borrow<dict>(m_entries_ptr))
1364 m[kv.first] = kv.second;
1365 return m;
1366 }, return_value_policy::copy);
Dean Moldovan68986792017-08-30 23:40:55 +02001367 def(init([](Scalar i) { return static_cast<Type>(i); }));
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001368 def("__int__", [](Type value) { return (Scalar) value; });
Wenzel Jakobe6fd2cd2017-04-28 14:46:52 +02001369 #if PY_MAJOR_VERSION < 3
1370 def("__long__", [](Type value) { return (Scalar) value; });
1371 #endif
Wenzel Jakob8ac97152016-09-05 17:20:50 +09001372 def("__eq__", [](const Type &value, Type *value2) { return value2 && value == *value2; });
1373 def("__ne__", [](const Type &value, Type *value2) { return !value2 || value != *value2; });
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001374 if (is_arithmetic) {
1375 def("__lt__", [](const Type &value, Type *value2) { return value2 && value < *value2; });
1376 def("__gt__", [](const Type &value, Type *value2) { return value2 && value > *value2; });
1377 def("__le__", [](const Type &value, Type *value2) { return value2 && value <= *value2; });
1378 def("__ge__", [](const Type &value, Type *value2) { return value2 && value >= *value2; });
1379 }
1380 if (std::is_convertible<Type, Scalar>::value) {
Jason Rhinelanderd41a2732016-08-04 00:21:37 -04001381 // Don't provide comparison with the underlying type if the enum isn't convertible,
1382 // i.e. if Type is a scoped enum, mirroring the C++ behaviour. (NB: we explicitly
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001383 // convert Type to Scalar below anyway because this needs to compile).
1384 def("__eq__", [](const Type &value, Scalar value2) { return (Scalar) value == value2; });
1385 def("__ne__", [](const Type &value, Scalar value2) { return (Scalar) value != value2; });
1386 if (is_arithmetic) {
1387 def("__lt__", [](const Type &value, Scalar value2) { return (Scalar) value < value2; });
1388 def("__gt__", [](const Type &value, Scalar value2) { return (Scalar) value > value2; });
1389 def("__le__", [](const Type &value, Scalar value2) { return (Scalar) value <= value2; });
1390 def("__ge__", [](const Type &value, Scalar value2) { return (Scalar) value >= value2; });
1391 def("__invert__", [](const Type &value) { return ~((Scalar) value); });
1392 def("__and__", [](const Type &value, Scalar value2) { return (Scalar) value & value2; });
1393 def("__or__", [](const Type &value, Scalar value2) { return (Scalar) value | value2; });
1394 def("__xor__", [](const Type &value, Scalar value2) { return (Scalar) value ^ value2; });
1395 def("__rand__", [](const Type &value, Scalar value2) { return (Scalar) value & value2; });
1396 def("__ror__", [](const Type &value, Scalar value2) { return (Scalar) value | value2; });
1397 def("__rxor__", [](const Type &value, Scalar value2) { return (Scalar) value ^ value2; });
1398 def("__and__", [](const Type &value, const Type &value2) { return (Scalar) value & (Scalar) value2; });
1399 def("__or__", [](const Type &value, const Type &value2) { return (Scalar) value | (Scalar) value2; });
1400 def("__xor__", [](const Type &value, const Type &value2) { return (Scalar) value ^ (Scalar) value2; });
1401 }
Jason Rhinelanderd41a2732016-08-04 00:21:37 -04001402 }
Wenzel Jakob405f6d12016-11-17 23:24:47 +01001403 def("__hash__", [](const Type &value) { return (Scalar) value; });
Wenzel Jakobfe342412016-09-06 13:02:29 +09001404 // Pickling and unpickling -- needed for use with the 'multiprocessing' module
Dean Moldovan68986792017-08-30 23:40:55 +02001405 def(pickle([](const Type &value) { return pybind11::make_tuple((Scalar) value); },
1406 [](tuple t) { return static_cast<Type>(t[0].cast<Scalar>()); }));
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001407 }
1408
1409 /// Export enumeration entries into the parent scope
Matthieu Becaf936e12017-03-03 08:45:50 -08001410 enum_& export_values() {
1411 for (const auto &kv : m_entries)
1412 m_parent.attr(kv.first) = kv.second;
Wenzel Jakobe916d842016-11-04 16:51:14 +01001413 return *this;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001414 }
1415
1416 /// Add an enumeration entry
1417 enum_& value(char const* name, Type value) {
Matthieu Becaf936e12017-03-03 08:45:50 -08001418 auto v = pybind11::cast(value, return_value_policy::copy);
1419 this->attr(name) = v;
1420 m_entries[pybind11::str(name)] = v;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001421 return *this;
1422 }
Matthieu Becaf936e12017-03-03 08:45:50 -08001423
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001424private:
Matthieu Becaf936e12017-03-03 08:45:50 -08001425 dict m_entries;
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001426 handle m_parent;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001427};
1428
1429NAMESPACE_BEGIN(detail)
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001430
Jason Rhinelanderec62d972016-09-09 02:42:51 -04001431
Jason Rhinelanderf2ecd892016-08-10 12:08:04 -04001432inline void keep_alive_impl(handle nurse, handle patient) {
Wenzel Jakobb2c2c792016-01-17 22:36:40 +01001433 if (!nurse || !patient)
Wenzel Jakob678d7872016-01-17 22:36:41 +01001434 pybind11_fail("Could not activate keep_alive!");
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001435
Ivan Smirnov984c7622016-08-29 02:38:47 +01001436 if (patient.is_none() || nurse.is_none())
Glen Walkerf45bb582016-08-16 17:50:43 +12001437 return; /* Nothing to keep alive or nothing to be kept alive by */
Wenzel Jakob9b880ba2016-04-25 03:25:13 +02001438
Bruce Merry9d698f72017-06-24 14:58:42 +02001439 auto tinfo = all_type_info(Py_TYPE(nurse.ptr()));
1440 if (!tinfo.empty()) {
1441 /* It's a pybind-registered type, so we can store the patient in the
1442 * internal list. */
1443 add_patient(nurse.ptr(), patient.ptr());
1444 }
1445 else {
1446 /* Fall back to clever approach based on weak references taken from
1447 * Boost.Python. This is not used for pybind-registered types because
1448 * the objects can be destroyed out-of-order in a GC pass. */
1449 cpp_function disable_lifesupport(
1450 [patient](handle weakref) { patient.dec_ref(); weakref.dec_ref(); });
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001451
Bruce Merry9d698f72017-06-24 14:58:42 +02001452 weakref wr(nurse, disable_lifesupport);
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001453
Bruce Merry9d698f72017-06-24 14:58:42 +02001454 patient.inc_ref(); /* reference patient and leak the weak reference */
1455 (void) wr.release();
1456 }
Wenzel Jakob5f218b32016-01-17 22:36:39 +01001457}
1458
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -05001459PYBIND11_NOINLINE inline void keep_alive_impl(size_t Nurse, size_t Patient, function_call &call, handle ret) {
Jason Rhinelander2686da82017-01-21 23:42:14 -05001460 keep_alive_impl(
Jason Rhinelanderbfcf9522017-01-30 13:34:38 -05001461 Nurse == 0 ? ret : Nurse <= call.args.size() ? call.args[Nurse - 1] : handle(),
1462 Patient == 0 ? ret : Patient <= call.args.size() ? call.args[Patient - 1] : handle()
Jason Rhinelander2686da82017-01-21 23:42:14 -05001463 );
Jason Rhinelanderf2ecd892016-08-10 12:08:04 -04001464}
1465
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001466inline std::pair<decltype(internals::registered_types_py)::iterator, bool> all_type_info_get_cache(PyTypeObject *type) {
1467 auto res = get_internals().registered_types_py
Jason Rhinelander12be4cd2017-07-29 03:53:45 -04001468#ifdef __cpp_lib_unordered_map_try_emplace
Jason Rhinelandere45c2112017-02-22 21:36:09 -05001469 .try_emplace(type);
1470#else
1471 .emplace(type, std::vector<detail::type_info *>());
1472#endif
1473 if (res.second) {
1474 // New cache entry created; set up a weak reference to automatically remove it if the type
1475 // gets destroyed:
1476 weakref((PyObject *) type, cpp_function([type](handle wr) {
1477 get_internals().registered_types_py.erase(type);
1478 wr.dec_ref();
1479 })).release();
1480 }
1481
1482 return res;
1483}
1484
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001485template <typename Iterator, typename Sentinel, bool KeyIterator, return_value_policy Policy>
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001486struct iterator_state {
1487 Iterator it;
1488 Sentinel end;
Dean Moldovancaedf742017-06-09 16:49:04 +02001489 bool first_or_done;
Ivan Smirnovdaed1ab2016-06-17 22:29:39 +01001490};
Wenzel Jakobb2825952016-04-13 23:33:00 +02001491
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001492NAMESPACE_END(detail)
1493
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001494/// Makes a python iterator from a first and past-the-end C++ InputIterator.
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001495template <return_value_policy Policy = return_value_policy::reference_internal,
1496 typename Iterator,
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001497 typename Sentinel,
Wenzel Jakob5dd33d82016-05-30 11:28:21 +02001498 typename ValueType = decltype(*std::declval<Iterator>()),
1499 typename... Extra>
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001500iterator make_iterator(Iterator first, Sentinel last, Extra &&... extra) {
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001501 typedef detail::iterator_state<Iterator, Sentinel, false, Policy> state;
Wenzel Jakobb2825952016-04-13 23:33:00 +02001502
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001503 if (!detail::get_type_info(typeid(state), false)) {
Jason Rhinelander7437c692017-07-28 22:03:44 -04001504 class_<state>(handle(), "iterator", pybind11::module_local())
Wenzel Jakobb2825952016-04-13 23:33:00 +02001505 .def("__iter__", [](state &s) -> state& { return s; })
Wenzel Jakob5dd33d82016-05-30 11:28:21 +02001506 .def("__next__", [](state &s) -> ValueType {
Dean Moldovancaedf742017-06-09 16:49:04 +02001507 if (!s.first_or_done)
Ivan Smirnovdaed1ab2016-06-17 22:29:39 +01001508 ++s.it;
1509 else
Dean Moldovancaedf742017-06-09 16:49:04 +02001510 s.first_or_done = false;
1511 if (s.it == s.end) {
1512 s.first_or_done = true;
Wenzel Jakobb2825952016-04-13 23:33:00 +02001513 throw stop_iteration();
Dean Moldovancaedf742017-06-09 16:49:04 +02001514 }
Ivan Smirnovdaed1ab2016-06-17 22:29:39 +01001515 return *s.it;
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001516 }, std::forward<Extra>(extra)..., Policy);
Wenzel Jakobb2825952016-04-13 23:33:00 +02001517 }
1518
Dean Moldovancaedf742017-06-09 16:49:04 +02001519 return cast(state{first, last, true});
Wenzel Jakobb2825952016-04-13 23:33:00 +02001520}
Wenzel Jakob146397e2016-09-06 13:06:31 +09001521
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001522/// Makes an python iterator over the keys (`.first`) of a iterator over pairs from a
1523/// first and past-the-end InputIterator.
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001524template <return_value_policy Policy = return_value_policy::reference_internal,
1525 typename Iterator,
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001526 typename Sentinel,
Ivan Smirnovc5a1c8a2016-08-24 23:27:19 +01001527 typename KeyType = decltype((*std::declval<Iterator>()).first),
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001528 typename... Extra>
Ivan Smirnov2b308e02016-08-24 23:29:04 +01001529iterator make_key_iterator(Iterator first, Sentinel last, Extra &&... extra) {
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001530 typedef detail::iterator_state<Iterator, Sentinel, true, Policy> state;
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001531
Wenzel Jakob8e5dceb2016-09-11 20:00:40 +09001532 if (!detail::get_type_info(typeid(state), false)) {
Jason Rhinelander7437c692017-07-28 22:03:44 -04001533 class_<state>(handle(), "iterator", pybind11::module_local())
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001534 .def("__iter__", [](state &s) -> state& { return s; })
1535 .def("__next__", [](state &s) -> KeyType {
Dean Moldovancaedf742017-06-09 16:49:04 +02001536 if (!s.first_or_done)
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001537 ++s.it;
1538 else
Dean Moldovancaedf742017-06-09 16:49:04 +02001539 s.first_or_done = false;
1540 if (s.it == s.end) {
1541 s.first_or_done = true;
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001542 throw stop_iteration();
Dean Moldovancaedf742017-06-09 16:49:04 +02001543 }
Ivan Smirnovc5a1c8a2016-08-24 23:27:19 +01001544 return (*s.it).first;
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001545 }, std::forward<Extra>(extra)..., Policy);
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001546 }
1547
Dean Moldovancaedf742017-06-09 16:49:04 +02001548 return cast(state{first, last, true});
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001549}
Wenzel Jakobb2825952016-04-13 23:33:00 +02001550
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001551/// Makes an iterator over values of an stl container or other container supporting
1552/// `std::begin()`/`std::end()`
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001553template <return_value_policy Policy = return_value_policy::reference_internal,
1554 typename Type, typename... Extra> iterator make_iterator(Type &value, Extra&&... extra) {
1555 return make_iterator<Policy>(std::begin(value), std::end(value), extra...);
Wenzel Jakobbf0c7dc2016-04-18 10:52:12 +02001556}
1557
Jason Rhinelander3d591e82017-03-18 13:34:21 -03001558/// Makes an iterator over the keys (`.first`) of a stl map-like container supporting
1559/// `std::begin()`/`std::end()`
Wenzel Jakobb212f6c2016-09-10 16:00:50 +09001560template <return_value_policy Policy = return_value_policy::reference_internal,
1561 typename Type, typename... Extra> iterator make_key_iterator(Type &value, Extra&&... extra) {
1562 return make_key_iterator<Policy>(std::begin(value), std::end(value), extra...);
Jason Rhinelander5aa85be2016-08-11 21:22:05 -04001563}
1564
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001565template <typename InputType, typename OutputType> void implicitly_convertible() {
Wenzel Jakob8ed5b8a2017-08-28 16:34:06 +02001566 struct set_flag {
1567 bool &flag;
1568 set_flag(bool &flag) : flag(flag) { flag = true; }
1569 ~set_flag() { flag = false; }
1570 };
Wenzel Jakob2ac50442016-01-17 22:36:35 +01001571 auto implicit_caster = [](PyObject *obj, PyTypeObject *type) -> PyObject * {
Wenzel Jakob8ed5b8a2017-08-28 16:34:06 +02001572 static bool currently_used = false;
1573 if (currently_used) // implicit conversions are non-reentrant
1574 return nullptr;
1575 set_flag flag_helper(currently_used);
Dean Moldovan5f07fac2017-01-03 11:52:05 +01001576 if (!detail::make_caster<InputType>().load(obj, false))
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001577 return nullptr;
1578 tuple args(1);
1579 args[0] = obj;
1580 PyObject *result = PyObject_Call((PyObject *) type, args.ptr(), nullptr);
1581 if (result == nullptr)
1582 PyErr_Clear();
1583 return result;
1584 };
Ivan Smirnov8f3e0452016-10-23 15:43:03 +01001585
1586 if (auto tinfo = detail::get_type_info(typeid(OutputType)))
1587 tinfo->implicit_conversions.push_back(implicit_caster);
1588 else
Wenzel Jakob678d7872016-01-17 22:36:41 +01001589 pybind11_fail("implicitly_convertible: Unable to find type " + type_id<OutputType>());
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001590}
1591
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001592template <typename ExceptionTranslator>
1593void register_exception_translator(ExceptionTranslator&& translator) {
1594 detail::get_internals().registered_exception_translators.push_front(
1595 std::forward<ExceptionTranslator>(translator));
1596}
1597
Jason Rhinelander37b23832017-05-22 12:06:16 -04001598/**
1599 * Wrapper to generate a new Python exception type.
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001600 *
1601 * This should only be used with PyErr_SetString for now.
1602 * It is not (yet) possible to use as a py::base.
1603 * Template type argument is reserved for future use.
1604 */
1605template <typename type>
1606class exception : public object {
1607public:
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001608 exception(handle scope, const char *name, PyObject *base = PyExc_Exception) {
1609 std::string full_name = scope.attr("__name__").cast<std::string>() +
1610 std::string(".") + name;
Matthew Woehlkee15fa9f2017-02-08 17:43:08 -05001611 m_ptr = PyErr_NewException(const_cast<char *>(full_name.c_str()), base, NULL);
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001612 if (hasattr(scope, name))
1613 pybind11_fail("Error during initialization: multiple incompatible "
1614 "definitions with name \"" + std::string(name) + "\"");
1615 scope.attr(name) = *this;
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001616 }
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001617
1618 // Sets the current python exception to this exception object with the given message
1619 void operator()(const char *message) {
1620 PyErr_SetString(m_ptr, message);
1621 }
Pim Schellart5a7d17f2016-06-17 17:35:59 -04001622};
1623
Jason Rhinelander37b23832017-05-22 12:06:16 -04001624/**
1625 * Registers a Python exception in `m` of the given `name` and installs an exception translator to
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001626 * translate the C++ exception to the created Python exception using the exceptions what() method.
1627 * This is intended for simple exception translations; for more complex translation, register the
1628 * exception object and translator directly.
1629 */
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001630template <typename CppException>
1631exception<CppException> &register_exception(handle scope,
1632 const char *name,
1633 PyObject *base = PyExc_Exception) {
1634 static exception<CppException> ex(scope, name, base);
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001635 register_exception_translator([](std::exception_ptr p) {
1636 if (!p) return;
1637 try {
1638 std::rethrow_exception(p);
Wenzel Jakob281ccc62016-11-16 17:59:56 +01001639 } catch (const CppException &e) {
Jason Rhinelanderb3794f12016-09-16 02:04:15 -04001640 ex(e.what());
1641 }
1642 });
1643 return ex;
1644}
1645
Dean Moldovan67990d92016-08-29 18:03:34 +02001646NAMESPACE_BEGIN(detail)
1647PYBIND11_NOINLINE inline void print(tuple args, dict kwargs) {
1648 auto strings = tuple(args.size());
1649 for (size_t i = 0; i < args.size(); ++i) {
Dean Moldovane18bc022016-10-25 22:12:39 +02001650 strings[i] = str(args[i]);
Dean Moldovan67990d92016-08-29 18:03:34 +02001651 }
Dean Moldovan865e4302016-09-21 01:06:32 +02001652 auto sep = kwargs.contains("sep") ? kwargs["sep"] : cast(" ");
Dean Moldovan242b1462016-09-08 17:02:04 +02001653 auto line = sep.attr("join")(strings);
Dean Moldovan67990d92016-08-29 18:03:34 +02001654
Wenzel Jakobc49d6e52016-10-13 10:34:52 +02001655 object file;
1656 if (kwargs.contains("file")) {
1657 file = kwargs["file"].cast<object>();
1658 } else {
1659 try {
1660 file = module::import("sys").attr("stdout");
esquires67a68f12016-12-01 05:35:34 -05001661 } catch (const error_already_set &) {
Wenzel Jakobc49d6e52016-10-13 10:34:52 +02001662 /* If print() is called from code that is executed as
1663 part of garbage collection during interpreter shutdown,
1664 importing 'sys' can fail. Give up rather than crashing the
1665 interpreter in this case. */
1666 return;
1667 }
1668 }
1669
Dean Moldovan242b1462016-09-08 17:02:04 +02001670 auto write = file.attr("write");
Dean Moldovan67990d92016-08-29 18:03:34 +02001671 write(line);
Dean Moldovan865e4302016-09-21 01:06:32 +02001672 write(kwargs.contains("end") ? kwargs["end"] : cast("\n"));
Dean Moldovan67990d92016-08-29 18:03:34 +02001673
Wenzel Jakobc49d6e52016-10-13 10:34:52 +02001674 if (kwargs.contains("flush") && kwargs["flush"].cast<bool>())
Dean Moldovan242b1462016-09-08 17:02:04 +02001675 file.attr("flush")();
Dean Moldovan67990d92016-08-29 18:03:34 +02001676}
1677NAMESPACE_END(detail)
1678
1679template <return_value_policy policy = return_value_policy::automatic_reference, typename... Args>
1680void print(Args &&...args) {
1681 auto c = detail::collect_arguments<policy>(std::forward<Args>(args)...);
1682 detail::print(c.args(), c.kwargs());
1683}
1684
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001685#if defined(WITH_THREAD) && !defined(PYPY_VERSION)
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001686
1687/* The functions below essentially reproduce the PyGILState_* API using a RAII
1688 * pattern, but there are a few important differences:
1689 *
1690 * 1. When acquiring the GIL from an non-main thread during the finalization
1691 * phase, the GILState API blindly terminates the calling thread, which
1692 * is often not what is wanted. This API does not do this.
1693 *
1694 * 2. The gil_scoped_release function can optionally cut the relationship
1695 * of a PyThreadState and its associated thread, which allows moving it to
1696 * another thread (this is a fairly rare/advanced use case).
1697 *
1698 * 3. The reference count of an acquired thread state can be controlled. This
1699 * can be handy to prevent cases where callbacks issued from an external
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001700 * thread would otherwise constantly construct and destroy thread state data
1701 * structures.
Wenzel Jakob69e1a5c2016-05-26 14:29:31 +02001702 *
1703 * See the Python bindings of NanoGUI (http://github.com/wjakob/nanogui) for an
1704 * example which uses features 2 and 3 to migrate the Python thread of
1705 * execution to another thread (to run the event loop on the original thread,
1706 * in this case).
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001707 */
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001708
1709class gil_scoped_acquire {
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001710public:
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001711 PYBIND11_NOINLINE gil_scoped_acquire() {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001712 auto const &internals = detail::get_internals();
1713 tstate = (PyThreadState *) PyThread_get_key_value(internals.tstate);
1714
1715 if (!tstate) {
1716 tstate = PyThreadState_New(internals.istate);
1717 #if !defined(NDEBUG)
1718 if (!tstate)
1719 pybind11_fail("scoped_acquire: could not create thread state!");
1720 #endif
1721 tstate->gilstate_counter = 0;
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001722 #if PY_MAJOR_VERSION < 3
1723 PyThread_delete_key_value(internals.tstate);
1724 #endif
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001725 PyThread_set_key_value(internals.tstate, tstate);
1726 } else {
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001727 release = detail::get_thread_state_unchecked() != tstate;
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001728 }
1729
1730 if (release) {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001731 /* Work around an annoying assertion in PyThreadState_Swap */
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001732 #if defined(Py_DEBUG)
1733 PyInterpreterState *interp = tstate->interp;
1734 tstate->interp = nullptr;
1735 #endif
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001736 PyEval_AcquireThread(tstate);
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001737 #if defined(Py_DEBUG)
1738 tstate->interp = interp;
1739 #endif
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001740 }
1741
1742 inc_ref();
1743 }
1744
1745 void inc_ref() {
1746 ++tstate->gilstate_counter;
1747 }
1748
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001749 PYBIND11_NOINLINE void dec_ref() {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001750 --tstate->gilstate_counter;
1751 #if !defined(NDEBUG)
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001752 if (detail::get_thread_state_unchecked() != tstate)
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001753 pybind11_fail("scoped_acquire::dec_ref(): thread state must be current!");
1754 if (tstate->gilstate_counter < 0)
1755 pybind11_fail("scoped_acquire::dec_ref(): reference count underflow!");
1756 #endif
1757 if (tstate->gilstate_counter == 0) {
1758 #if !defined(NDEBUG)
1759 if (!release)
1760 pybind11_fail("scoped_acquire::dec_ref(): internal error!");
1761 #endif
1762 PyThreadState_Clear(tstate);
1763 PyThreadState_DeleteCurrent();
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001764 PyThread_delete_key_value(detail::get_internals().tstate);
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001765 release = false;
1766 }
1767 }
1768
Wenzel Jakobfbafdea2016-04-25 15:02:43 +02001769 PYBIND11_NOINLINE ~gil_scoped_acquire() {
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001770 dec_ref();
1771 if (release)
1772 PyEval_SaveThread();
1773 }
1774private:
1775 PyThreadState *tstate = nullptr;
1776 bool release = true;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001777};
1778
1779class gil_scoped_release {
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001780public:
Jason Rhinelander12d76602016-10-16 16:27:42 -04001781 explicit gil_scoped_release(bool disassoc = false) : disassoc(disassoc) {
Dean Moldovan2d6116b2017-06-20 23:50:51 +02001782 // `get_internals()` must be called here unconditionally in order to initialize
1783 // `internals.tstate` for subsequent `gil_scoped_acquire` calls. Otherwise, an
1784 // initialization race could occur as multiple threads try `gil_scoped_acquire`.
1785 const auto &internals = detail::get_internals();
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001786 tstate = PyEval_SaveThread();
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02001787 if (disassoc) {
Dean Moldovan2d6116b2017-06-20 23:50:51 +02001788 auto key = internals.tstate;
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02001789 #if PY_MAJOR_VERSION < 3
1790 PyThread_delete_key_value(key);
1791 #else
1792 PyThread_set_key_value(key, nullptr);
1793 #endif
1794 }
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001795 }
1796 ~gil_scoped_release() {
1797 if (!tstate)
1798 return;
1799 PyEval_RestoreThread(tstate);
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02001800 if (disassoc) {
Boris Schäling20ee9352016-05-28 12:26:18 +02001801 auto key = detail::get_internals().tstate;
Wenzel Jakob2f6662e2016-04-25 09:16:41 +02001802 #if PY_MAJOR_VERSION < 3
1803 PyThread_delete_key_value(key);
1804 #endif
1805 PyThread_set_key_value(key, tstate);
1806 }
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001807 }
1808private:
1809 PyThreadState *tstate;
1810 bool disassoc;
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001811};
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001812#elif defined(PYPY_VERSION)
1813class gil_scoped_acquire {
1814 PyGILState_STATE state;
1815public:
1816 gil_scoped_acquire() { state = PyGILState_Ensure(); }
1817 ~gil_scoped_acquire() { PyGILState_Release(state); }
1818};
1819
1820class gil_scoped_release {
1821 PyThreadState *state;
1822public:
1823 gil_scoped_release() { state = PyEval_SaveThread(); }
1824 ~gil_scoped_release() { PyEval_RestoreThread(state); }
1825};
Wenzel Jakob39e97e62016-04-25 03:26:15 +02001826#else
1827class gil_scoped_acquire { };
1828class gil_scoped_release { };
Felipe Lema2547ca42016-01-25 16:22:44 -03001829#endif
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001830
Wenzel Jakob8d396fc2016-11-24 23:11:02 +01001831error_already_set::~error_already_set() {
Jason Rhinelander1682b672017-07-20 23:14:33 -04001832 if (type) {
Wenzel Jakob8d396fc2016-11-24 23:11:02 +01001833 gil_scoped_acquire gil;
Jason Rhinelander1682b672017-07-20 23:14:33 -04001834 type.release().dec_ref();
1835 value.release().dec_ref();
1836 trace.release().dec_ref();
Wenzel Jakob8d396fc2016-11-24 23:11:02 +01001837 }
1838}
1839
Jason Rhinelander1b05ce52016-08-09 17:57:59 -04001840inline function get_type_overload(const void *this_ptr, const detail::type_info *this_type, const char *name) {
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001841 handle self = detail::get_object_handle(this_ptr, this_type);
1842 if (!self)
Wenzel Jakobac0fde92015-10-01 18:37:26 +02001843 return function();
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001844 handle type = self.get_type();
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001845 auto key = std::make_pair(type.ptr(), name);
1846
Wenzel Jakobf5c154a2016-04-11 18:13:08 +02001847 /* Cache functions that aren't overloaded in Python to avoid
1848 many costly Python dictionary lookups below */
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001849 auto &cache = detail::get_internals().inactive_overload_cache;
1850 if (cache.find(key) != cache.end())
1851 return function();
1852
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001853 function overload = getattr(self, name, function());
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001854 if (overload.is_cpp_function()) {
1855 cache.insert(key);
1856 return function();
1857 }
Wenzel Jakob27e8e102016-01-17 22:36:37 +01001858
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001859 /* Don't call dispatch code if invoked from overridden function.
1860 Unfortunately this doesn't work on PyPy. */
1861#if !defined(PYPY_VERSION)
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001862 PyFrameObject *frame = PyThreadState_Get()->frame;
Dean Moldovane18bc022016-10-25 22:12:39 +02001863 if (frame && (std::string) str(frame->f_code->co_name) == name &&
Wenzel Jakobf5c154a2016-04-11 18:13:08 +02001864 frame->f_code->co_argcount > 0) {
1865 PyFrame_FastToLocals(frame);
1866 PyObject *self_caller = PyDict_GetItem(
1867 frame->f_locals, PyTuple_GET_ITEM(frame->f_code->co_varnames, 0));
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001868 if (self_caller == self.ptr())
Wenzel Jakobf5c154a2016-04-11 18:13:08 +02001869 return function();
1870 }
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001871#else
1872 /* PyPy currently doesn't provide a detailed cpyext emulation of
1873 frame objects, so we have to emulate this using Python. This
1874 is going to be slow..*/
1875 dict d; d["self"] = self; d["name"] = pybind11::str(name);
1876 PyObject *result = PyRun_String(
1877 "import inspect\n"
1878 "frame = inspect.currentframe()\n"
1879 "if frame is not None:\n"
1880 " frame = frame.f_back\n"
1881 " if frame is not None and str(frame.f_code.co_name) == name and "
1882 "frame.f_code.co_argcount > 0:\n"
1883 " self_caller = frame.f_locals[frame.f_code.co_varnames[0]]\n"
1884 " if self_caller == self:\n"
1885 " self = None\n",
1886 Py_file_input, d.ptr(), d.ptr());
1887 if (result == nullptr)
1888 throw error_already_set();
Dean Moldovan36f0a152017-02-08 01:01:56 +01001889 if (d["self"].is_none())
Wenzel Jakob1d1f81b2016-12-16 15:00:46 +01001890 return function();
1891 Py_DECREF(result);
1892#endif
1893
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001894 return overload;
1895}
1896
Jason Rhinelander1b05ce52016-08-09 17:57:59 -04001897template <class T> function get_overload(const T *this_ptr, const char *name) {
Ivan Smirnov8f3e0452016-10-23 15:43:03 +01001898 auto tinfo = detail::get_type_info(typeid(T));
1899 return tinfo ? get_type_overload(this_ptr, tinfo, name) : function();
Jason Rhinelander1b05ce52016-08-09 17:57:59 -04001900}
1901
Jason Rhinelander20978262016-08-29 18:16:46 -04001902#define PYBIND11_OVERLOAD_INT(ret_type, cname, name, ...) { \
Wenzel Jakob8f4eb002015-10-15 18:13:33 +02001903 pybind11::gil_scoped_acquire gil; \
Jason Rhinelander20978262016-08-29 18:16:46 -04001904 pybind11::function overload = pybind11::get_overload(static_cast<const cname *>(this), name); \
Jason Rhinelander7dfb9322016-09-08 14:49:43 -04001905 if (overload) { \
Jason Rhinelander3e4fe6c2016-09-11 12:17:41 -04001906 auto o = overload(__VA_ARGS__); \
Jason Rhinelander7dfb9322016-09-08 14:49:43 -04001907 if (pybind11::detail::cast_is_temporary_value_reference<ret_type>::value) { \
Jason Rhinelander3e4fe6c2016-09-11 12:17:41 -04001908 static pybind11::detail::overload_caster_t<ret_type> caster; \
1909 return pybind11::detail::cast_ref<ret_type>(std::move(o), caster); \
Jason Rhinelander7dfb9322016-09-08 14:49:43 -04001910 } \
1911 else return pybind11::detail::cast_safe<ret_type>(std::move(o)); \
1912 } \
1913 }
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001914
Wenzel Jakob1e3be732016-05-24 23:42:05 +02001915#define PYBIND11_OVERLOAD_NAME(ret_type, cname, name, fn, ...) \
Jason Rhinelander20978262016-08-29 18:16:46 -04001916 PYBIND11_OVERLOAD_INT(ret_type, cname, name, __VA_ARGS__) \
Wenzel Jakob1e3be732016-05-24 23:42:05 +02001917 return cname::fn(__VA_ARGS__)
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001918
Wenzel Jakob1e3be732016-05-24 23:42:05 +02001919#define PYBIND11_OVERLOAD_PURE_NAME(ret_type, cname, name, fn, ...) \
Jason Rhinelander20978262016-08-29 18:16:46 -04001920 PYBIND11_OVERLOAD_INT(ret_type, cname, name, __VA_ARGS__) \
Wenzel Jakob1e3be732016-05-24 23:42:05 +02001921 pybind11::pybind11_fail("Tried to call pure virtual function \"" #cname "::" name "\"");
1922
1923#define PYBIND11_OVERLOAD(ret_type, cname, fn, ...) \
1924 PYBIND11_OVERLOAD_NAME(ret_type, cname, #fn, fn, __VA_ARGS__)
1925
1926#define PYBIND11_OVERLOAD_PURE(ret_type, cname, fn, ...) \
1927 PYBIND11_OVERLOAD_PURE_NAME(ret_type, cname, #fn, fn, __VA_ARGS__)
Wenzel Jakoba2f6fde2015-10-01 16:46:03 +02001928
Jason Rhinelandera859dd62017-08-10 12:03:29 -04001929NAMESPACE_END(PYBIND11_NAMESPACE)
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001930
1931#if defined(_MSC_VER)
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001932# pragma warning(pop)
Wenzel Jakob1ffce742016-08-25 01:43:33 +02001933#elif defined(__INTEL_COMPILER)
1934/* Leave ignored warnings on */
Wenzel Jakob6d252962016-05-01 20:47:49 +02001935#elif defined(__GNUG__) && !defined(__clang__)
Wenzel Jakob48548ea2016-01-17 22:36:44 +01001936# pragma GCC diagnostic pop
Wenzel Jakob38bd7112015-07-05 20:05:44 +02001937#endif