pybind11.h 66.5 KB
Newer Older
Wenzel Jakob's avatar
Wenzel Jakob committed
1
/*
Wenzel Jakob's avatar
Wenzel Jakob committed
2
3
    pybind11/pybind11.h: Main header file of the C++11 python
    binding generator library
Wenzel Jakob's avatar
Wenzel Jakob committed
4

5
    Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
Wenzel Jakob's avatar
Wenzel Jakob committed
6
7
8
9
10

    All rights reserved. Use of this source code is governed by a
    BSD-style license that can be found in the LICENSE file.
*/

11
#pragma once
Wenzel Jakob's avatar
Wenzel Jakob committed
12
13

#if defined(_MSC_VER)
Wenzel Jakob's avatar
Wenzel Jakob committed
14
#  pragma warning(push)
15
#  pragma warning(disable: 4100) // warning C4100: Unreferenced formal parameter
Wenzel Jakob's avatar
Wenzel Jakob committed
16
#  pragma warning(disable: 4127) // warning C4127: Conditional expression is constant
17
#  pragma warning(disable: 4512) // warning C4512: Assignment operator was implicitly defined as deleted
Wenzel Jakob's avatar
Wenzel Jakob committed
18
19
#  pragma warning(disable: 4800) // warning C4800: 'int': forcing value to bool 'true' or 'false' (performance warning)
#  pragma warning(disable: 4996) // warning C4996: The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name
Wenzel Jakob's avatar
Wenzel Jakob committed
20
#  pragma warning(disable: 4702) // warning C4702: unreachable code
21
#  pragma warning(disable: 4522) // warning C4522: multiple assignment operators specified
22
#elif defined(__INTEL_COMPILER)
Ben Pritchard's avatar
Ben Pritchard committed
23
#  pragma warning(push)
24
25
26
#  pragma warning(disable: 186)   // pointless comparison of unsigned integer with zero
#  pragma warning(disable: 1334)  // the "template" keyword used for syntactic disambiguation may only be used within a template
#  pragma warning(disable: 2196)  // warning #2196: routine is both "inline" and "noinline"
27
#elif defined(__GNUG__) && !defined(__clang__)
Wenzel Jakob's avatar
Wenzel Jakob committed
28
29
30
31
#  pragma GCC diagnostic push
#  pragma GCC diagnostic ignored "-Wunused-but-set-parameter"
#  pragma GCC diagnostic ignored "-Wunused-but-set-variable"
#  pragma GCC diagnostic ignored "-Wmissing-field-initializers"
Wenzel Jakob's avatar
Wenzel Jakob committed
32
33
#  pragma GCC diagnostic ignored "-Wstrict-aliasing"
#  pragma GCC diagnostic ignored "-Wattributes"
Wenzel Jakob's avatar
Wenzel Jakob committed
34
35
#endif

Wenzel Jakob's avatar
Wenzel Jakob committed
36
#include "attr.h"
Wenzel Jakob's avatar
Wenzel Jakob committed
37

38
NAMESPACE_BEGIN(pybind11)
Wenzel Jakob's avatar
Wenzel Jakob committed
39

Wenzel Jakob's avatar
Wenzel Jakob committed
40
/// Wraps an arbitrary C++ function/method/lambda function/.. into a callable Python object
41
class cpp_function : public function {
Wenzel Jakob's avatar
Wenzel Jakob committed
42
public:
43
    cpp_function() { }
Wenzel Jakob's avatar
Wenzel Jakob committed
44

45
    /// Construct a cpp_function from a vanilla function pointer
46
    template <typename Return, typename... Args, typename... Extra>
47
    explicit cpp_function(Return (*f)(Args...), const Extra&... extra) {
48
        initialize(f, f, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
49
50
    }

51
    /// Construct a cpp_function from a lambda function (possibly with internal state)
52
    template <typename Func, typename... Extra> explicit cpp_function(Func &&f, const Extra&... extra) {
53
        initialize(std::forward<Func>(f),
Wenzel Jakob's avatar
Wenzel Jakob committed
54
                   (typename detail::remove_class<decltype(
Wenzel Jakob's avatar
Wenzel Jakob committed
55
                       &std::remove_reference<Func>::type::operator())>::type *) nullptr, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
56
57
    }

58
59
    /// Construct a cpp_function from a class method (non-const)
    template <typename Return, typename Class, typename... Arg, typename... Extra>
60
            explicit cpp_function(Return (Class::*f)(Arg...), const Extra&... extra) {
61
        initialize([f](Class *c, Arg... args) -> Return { return (c->*f)(args...); },
Wenzel Jakob's avatar
Wenzel Jakob committed
62
                   (Return (*) (Class *, Arg...)) nullptr, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
63
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
64

65
66
    /// Construct a cpp_function from a class method (const)
    template <typename Return, typename Class, typename... Arg, typename... Extra>
67
            explicit cpp_function(Return (Class::*f)(Arg...) const, const Extra&... extra) {
68
        initialize([f](const Class *c, Arg... args) -> Return { return (c->*f)(args...); },
Wenzel Jakob's avatar
Wenzel Jakob committed
69
                   (Return (*)(const Class *, Arg ...)) nullptr, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
70
71
    }

72
    /// Return the function name
Wenzel Jakob's avatar
Wenzel Jakob committed
73
    object name() const { return attr("__name__"); }
74

75
protected:
76
77
78
79
80
    /// Space optimization: don't inline this frequently instantiated fragment
    PYBIND11_NOINLINE detail::function_record *make_function_record() {
        return new detail::function_record();
    }

81
    /// Special internal constructor for functors, lambda functions, etc.
82
    template <typename Func, typename Return, typename... Args, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
83
    void initialize(Func &&f, Return (*)(Args...), const Extra&... extra) {
84
85
86
        static_assert(detail::expected_num_args<Extra...>(sizeof...(Args)),
                      "The number of named arguments does not match the function signature");

87
        struct capture { typename std::remove_reference<Func>::type f; };
Wenzel Jakob's avatar
Wenzel Jakob committed
88

89
        /* Store the function including any extra state it might have (e.g. a lambda capture object) */
90
        auto rec = make_function_record();
91

92
93
        /* Store the capture object directly in the function record if there is enough space */
        if (sizeof(capture) <= sizeof(rec->data)) {
94
95
96
            /* Without these pragmas, GCC warns that there might not be
               enough space to use the placement new operator. However, the
               'if' statement above ensures that this is the case. */
97
#if defined(__GNUG__) && !defined(__clang__) && __GNUC__ >= 6
98
99
100
#  pragma GCC diagnostic push
#  pragma GCC diagnostic ignored "-Wplacement-new"
#endif
101
            new ((capture *) &rec->data) capture { std::forward<Func>(f) };
102
#if defined(__GNUG__) && !defined(__clang__) && __GNUC__ >= 6
103
104
#  pragma GCC diagnostic pop
#endif
105
106
107
108
109
110
            if (!std::is_trivially_destructible<Func>::value)
                rec->free_data = [](detail::function_record *r) { ((capture *) &r->data)->~capture(); };
        } else {
            rec->data[0] = new capture { std::forward<Func>(f) };
            rec->free_data = [](detail::function_record *r) { delete ((capture *) r->data[0]); };
        }
111

112
113
114
115
116
        /* Type casters for the function arguments and return value */
        typedef detail::type_caster<typename std::tuple<Args...>> cast_in;
        typedef detail::type_caster<typename std::conditional<
            std::is_void<Return>::value, detail::void_type,
            typename detail::intrinsic_type<Return>::type>::type> cast_out;
Wenzel Jakob's avatar
Wenzel Jakob committed
117

118
        /* Dispatch code which converts function arguments and performs the actual function call */
119
        rec->impl = [](detail::function_record *rec, handle args, handle kwargs, handle parent) -> handle {
120
            cast_in args_converter;
121
122

            /* Try to cast the function arguments into the C++ domain */
123
            if (!args_converter.load_args(args, kwargs, true))
124
125
                return PYBIND11_TRY_NEXT_OVERLOAD;

Wenzel Jakob's avatar
Wenzel Jakob committed
126
            /* Invoke call policy pre-call hook */
127
128
129
130
131
            detail::process_attributes<Extra...>::precall(args);

            /* Get a pointer to the capture object */
            capture *cap = (capture *) (sizeof(capture) <= sizeof(rec->data)
                                        ? &rec->data : rec->data[0]);
132

133
            /* Perform the function call */
134
135
            handle result = cast_out::cast(args_converter.template call<Return>(cap->f),
                                           rec->policy, parent);
Wenzel Jakob's avatar
Wenzel Jakob committed
136
137

            /* Invoke call policy post-call hook */
138
            detail::process_attributes<Extra...>::postcall(args, result);
139

140
            return result;
Wenzel Jakob's avatar
Wenzel Jakob committed
141
142
        };

Wenzel Jakob's avatar
Wenzel Jakob committed
143
144
        /* Process any user-provided function attributes */
        detail::process_attributes<Extra...>::init(extra..., rec);
145
146

        /* Generate a readable signature describing the function's arguments and return value types */
147
148
        using detail::descr; using detail::_;
        PYBIND11_DESCR signature = _("(") + cast_in::element_names() + _(") -> ") + cast_out::name();
149
150

        /* Register the function with Python from generic (non-templated) code */
151
        initialize_generic(rec, signature.text(), signature.types(), sizeof...(Args));
152
153
154

        if (cast_in::has_args) rec->has_args = true;
        if (cast_in::has_kwargs) rec->has_kwargs = true;
155
156
157
158
159
160
161
162
163
164

        /* Stash some additional information used by an important optimization in 'functional.h' */
        using FunctionType = Return (*)(Args...);
        constexpr bool is_function_ptr =
            std::is_convertible<Func, FunctionType>::value &&
            sizeof(capture) == sizeof(void *);
        if (is_function_ptr) {
            rec->is_stateless = true;
            rec->data[1] = (void *) &typeid(FunctionType);
        }
165
166
    }

167
    /// Register a function call with Python (generic non-templated code goes here)
168
    void initialize_generic(detail::function_record *rec, const char *text,
169
                            const std::type_info *const *types, size_t args) {
Wenzel Jakob's avatar
Wenzel Jakob committed
170

171
        /* Create copies of all referenced C-style strings */
Wenzel Jakob's avatar
Wenzel Jakob committed
172
173
174
        rec->name = strdup(rec->name ? rec->name : "");
        if (rec->doc) rec->doc = strdup(rec->doc);
        for (auto &a: rec->args) {
175
176
177
178
179
            if (a.name)
                a.name = strdup(a.name);
            if (a.descr)
                a.descr = strdup(a.descr);
            else if (a.value)
180
                a.descr = strdup(a.value.attr("__repr__")().cast<std::string>().c_str());
181
        }
182

183
        auto const &registered_types = detail::get_internals().registered_types_cpp;
184
185
186
187
188
189
190
191
192
193

        /* Generate a proper function signature */
        std::string signature;
        size_t type_depth = 0, char_index = 0, type_index = 0, arg_index = 0;
        while (true) {
            char c = text[char_index++];
            if (c == '\0')
                break;

            if (c == '{') {
194
                // Write arg name for everything except *args, **kwargs and return type.
195
                if (type_depth == 0 && text[char_index] != '*' && arg_index < args) {
196
197
198
199
200
201
202
203
                    if (!rec->args.empty()) {
                        signature += rec->args[arg_index].name;
                    } else if (arg_index == 0 && rec->class_) {
                        signature += "self";
                    } else {
                        signature += "arg" + std::to_string(arg_index - (rec->class_ ? 1 : 0));
                    }
                    signature += ": ";
204
205
206
207
                }
                ++type_depth;
            } else if (c == '}') {
                --type_depth;
208
                if (type_depth == 0) {
209
210
                    if (arg_index < rec->args.size() && rec->args[arg_index].descr) {
                        signature += "=";
Wenzel Jakob's avatar
Wenzel Jakob committed
211
                        signature += rec->args[arg_index].descr;
212
213
214
215
216
                    }
                    arg_index++;
                }
            } else if (c == '%') {
                const std::type_info *t = types[type_index++];
217
                if (!t)
218
                    pybind11_fail("Internal error while parsing type signature (1)");
219
                auto it = registered_types.find(std::type_index(*t));
220
                if (it != registered_types.end()) {
221
                    signature += ((const detail::type_info *) it->second)->type->tp_name;
222
223
224
225
226
227
228
229
230
                } else {
                    std::string tname(t->name());
                    detail::clean_type_id(tname);
                    signature += tname;
                }
            } else {
                signature += c;
            }
        }
231
        if (type_depth != 0 || types[type_index] != nullptr)
232
            pybind11_fail("Internal error while parsing type signature (2)");
233
234
235
236
237

        #if !defined(PYBIND11_CPP14)
            delete[] types;
            delete[] text;
        #endif
238

239
#if PY_MAJOR_VERSION < 3
Wenzel Jakob's avatar
Wenzel Jakob committed
240
241
242
        if (strcmp(rec->name, "__next__") == 0) {
            std::free(rec->name);
            rec->name = strdup("next");
243
244
245
        } else if (strcmp(rec->name, "__bool__") == 0) {
            std::free(rec->name);
            rec->name = strdup("__nonzero__");
246
        }
247
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
248
249
        rec->signature = strdup(signature.c_str());
        rec->args.shrink_to_fit();
250
        rec->is_constructor = !strcmp(rec->name, "__init__") || !strcmp(rec->name, "__setstate__");
251
        rec->nargs = (uint16_t) args;
252
253

#if PY_MAJOR_VERSION < 3
Wenzel Jakob's avatar
Wenzel Jakob committed
254
255
        if (rec->sibling && PyMethod_Check(rec->sibling.ptr()))
            rec->sibling = PyMethod_GET_FUNCTION(rec->sibling.ptr());
256
#endif
257

Wenzel Jakob's avatar
Wenzel Jakob committed
258
259
260
261
        detail::function_record *chain = nullptr, *chain_start = rec;
        if (rec->sibling && PyCFunction_Check(rec->sibling.ptr())) {
            capsule rec_capsule(PyCFunction_GetSelf(rec->sibling.ptr()), true);
            chain = (detail::function_record *) rec_capsule;
262
263
            /* Never append a method to an overload chain of a parent class;
               instead, hide the parent's overloads in this case */
Wenzel Jakob's avatar
Wenzel Jakob committed
264
265
            if (chain->class_ != rec->class_)
                chain = nullptr;
266
267
        }

Wenzel Jakob's avatar
Wenzel Jakob committed
268
        if (!chain) {
269
            /* No existing overload was found, create a new function object */
Wenzel Jakob's avatar
Wenzel Jakob committed
270
271
272
273
274
            rec->def = new PyMethodDef();
            memset(rec->def, 0, sizeof(PyMethodDef));
            rec->def->ml_name = rec->name;
            rec->def->ml_meth = reinterpret_cast<PyCFunction>(*dispatcher);
            rec->def->ml_flags = METH_VARARGS | METH_KEYWORDS;
275

Wenzel Jakob's avatar
Wenzel Jakob committed
276
277
            capsule rec_capsule(rec, [](PyObject *o) {
                destruct((detail::function_record *) PyCapsule_GetPointer(o, nullptr));
278
            });
279
280
281

            object scope_module;
            if (rec->scope) {
282
283
284
285
286
                if (hasattr(rec->scope, "__module__")) {
                    scope_module = rec->scope.attr("__module__");
                } else if (hasattr(rec->scope, "__name__")) {
                    scope_module = rec->scope.attr("__name__");
                }
287
288
289
            }

            m_ptr = PyCFunction_NewEx(rec->def, rec_capsule.ptr(), scope_module.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
290
            if (!m_ptr)
291
                pybind11_fail("cpp_function::cpp_function(): Could not allocate function object");
Wenzel Jakob's avatar
Wenzel Jakob committed
292
        } else {
293
            /* Append at the end of the overload chain */
Wenzel Jakob's avatar
Wenzel Jakob committed
294
            m_ptr = rec->sibling.ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
295
            inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
296
297
298
299
            chain_start = chain;
            while (chain->next)
                chain = chain->next;
            chain->next = rec;
Wenzel Jakob's avatar
Wenzel Jakob committed
300
        }
301

Wenzel Jakob's avatar
Wenzel Jakob committed
302
        std::string signatures;
303
        int index = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
304
        /* Create a nice pydoc rec including all signatures and
305
           docstrings of the functions in the overload chain */
306
307
308
309
310
311
312
        if (chain) {
            // First a generic signature
            signatures += rec->name;
            signatures += "(*args, **kwargs)\n";
            signatures += "Overloaded function.\n\n";
        }
        // Then specific overload signatures
Wenzel Jakob's avatar
Wenzel Jakob committed
313
314
        for (auto it = chain_start; it != nullptr; it = it->next) {
            if (chain)
315
                signatures += std::to_string(++index) + ". ";
316
            signatures += rec->name;
317
318
319
320
            signatures += it->signature;
            signatures += "\n";
            if (it->doc && strlen(it->doc) > 0) {
                signatures += "\n";
321
                signatures += it->doc;
322
323
                signatures += "\n";
            }
324
            if (it->next)
Wenzel Jakob's avatar
Wenzel Jakob committed
325
326
                signatures += "\n";
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
327
328

        /* Install docstring */
Wenzel Jakob's avatar
Wenzel Jakob committed
329
330
        PyCFunctionObject *func = (PyCFunctionObject *) m_ptr;
        if (func->m_ml->ml_doc)
331
            std::free((char *) func->m_ml->ml_doc);
Wenzel Jakob's avatar
Wenzel Jakob committed
332
        func->m_ml->ml_doc = strdup(signatures.c_str());
Wenzel Jakob's avatar
Wenzel Jakob committed
333
334
335

        if (rec->class_) {
            m_ptr = PYBIND11_INSTANCE_METHOD_NEW(m_ptr, rec->class_.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
336
            if (!m_ptr)
337
                pybind11_fail("cpp_function::cpp_function(): Could not allocate instance method object");
Wenzel Jakob's avatar
Wenzel Jakob committed
338
339
340
            Py_DECREF(func);
        }
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
341
342
343
344
345
346

    /// When a cpp_function is GCed, release any memory allocated by pybind11
    static void destruct(detail::function_record *rec) {
        while (rec) {
            detail::function_record *next = rec->next;
            if (rec->free_data)
347
                rec->free_data(rec);
Wenzel Jakob's avatar
Wenzel Jakob committed
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
            std::free((char *) rec->name);
            std::free((char *) rec->doc);
            std::free((char *) rec->signature);
            for (auto &arg: rec->args) {
                std::free((char *) arg.name);
                std::free((char *) arg.descr);
                arg.value.dec_ref();
            }
            if (rec->def) {
                std::free((char *) rec->def->ml_doc);
                delete rec->def;
            }
            delete rec;
            rec = next;
        }
    }

    /// Main dispatch logic for calls to functions bound using pybind11
    static PyObject *dispatcher(PyObject *self, PyObject *args, PyObject *kwargs) {
        /* Iterator over the list of potentially admissible overloads */
        detail::function_record *overloads = (detail::function_record *) PyCapsule_GetPointer(self, nullptr),
                                *it = overloads;

        /* Need to know how many arguments + keyword arguments there are to pick the right overload */
372
373
        size_t nargs = (size_t) PyTuple_GET_SIZE(args),
               nkwargs = kwargs ? (size_t) PyDict_Size(kwargs) : 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
374

375
        handle parent = nargs > 0 ? PyTuple_GET_ITEM(args, 0) : nullptr,
Wenzel Jakob's avatar
Wenzel Jakob committed
376
377
378
379
               result = PYBIND11_TRY_NEXT_OVERLOAD;
        try {
            for (; it != nullptr; it = it->next) {
                tuple args_(args, true);
380
                size_t kwargs_consumed = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
381
382
383
384
385
386
387
388

                /* For each overload:
                   1. If the required list of arguments is longer than the
                      actually provided amount, create a copy of the argument
                      list and fill in any available keyword/default arguments.
                   2. Ensure that all keyword arguments were "consumed"
                   3. Call the function call dispatcher (function_record::impl)
                 */
389
390
391
392
393
                size_t nargs_ = nargs;
                if (nargs < it->args.size()) {
                    nargs_ = it->args.size();
                    args_ = tuple(nargs_);
                    for (size_t i = 0; i < nargs; ++i) {
Wenzel Jakob's avatar
Wenzel Jakob committed
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
                        handle item = PyTuple_GET_ITEM(args, i);
                        PyTuple_SET_ITEM(args_.ptr(), i, item.inc_ref().ptr());
                    }

                    int arg_ctr = 0;
                    for (auto const &it2 : it->args) {
                        int index = arg_ctr++;
                        if (PyTuple_GET_ITEM(args_.ptr(), index))
                            continue;

                        handle value;
                        if (kwargs)
                            value = PyDict_GetItemString(kwargs, it2.name);

                        if (value)
                            kwargs_consumed++;
                        else if (it2.value)
                            value = it2.value;

                        if (value) {
                            PyTuple_SET_ITEM(args_.ptr(), index, value.inc_ref().ptr());
                        } else {
416
                            kwargs_consumed = (size_t) -1; /* definite failure */
Wenzel Jakob's avatar
Wenzel Jakob committed
417
418
419
420
                            break;
                        }
                    }
                }
421
422

                try {
423
424
425
                    if ((kwargs_consumed == nkwargs || it->has_kwargs) &&
                        (nargs_ == it->nargs || it->has_args))
                        result = it->impl(it, args_, kwargs, parent);
426
                } catch (reference_cast_error &) {
427
428
                    result = PYBIND11_TRY_NEXT_OVERLOAD;
                }
Wenzel Jakob's avatar
Wenzel Jakob committed
429
430
431
432

                if (result.ptr() != PYBIND11_TRY_NEXT_OVERLOAD)
                    break;
            }
433
434
        } catch (error_already_set &e) {
            e.restore();
435
            return nullptr;
Wenzel Jakob's avatar
Wenzel Jakob committed
436
        } catch (...) {
437
438
439
            /* When an exception is caught, give each registered exception
               translator a chance to translate it to a Python exception
               in reverse order of registration.
440

441
               A translator may choose to do one of the following:
442

443
444
445
446
447
                - catch the exception and call PyErr_SetString or PyErr_SetObject
                  to set a standard (or custom) Python exception, or
                - do nothing and let the exception fall through to the next translator, or
                - delegate translation to the next translator by throwing a new type of exception. */

448
            auto last_exception = std::current_exception();
449
450
451
452
453
454
455
456
457
458
459
            auto &registered_exception_translators = pybind11::detail::get_internals().registered_exception_translators;
            for (auto& translator : registered_exception_translators) {
                try {
                    translator(last_exception);
                } catch (...) {
                    last_exception = std::current_exception();
                    continue;
                }
                return nullptr;
            }
            PyErr_SetString(PyExc_SystemError, "Exception escaped from default exception translator!");
Wenzel Jakob's avatar
Wenzel Jakob committed
460
461
462
463
            return nullptr;
        }

        if (result.ptr() == PYBIND11_TRY_NEXT_OVERLOAD) {
464
465
466
            if (overloads->is_operator)
                return handle(Py_NotImplemented).inc_ref().ptr();

467
468
469
470
            std::string msg = std::string(overloads->name) + "(): incompatible " +
                std::string(overloads->is_constructor ? "constructor" : "function") +
                " arguments. The following argument types are supported:\n";

Wenzel Jakob's avatar
Wenzel Jakob committed
471
472
473
            int ctr = 0;
            for (detail::function_record *it2 = overloads; it2 != nullptr; it2 = it2->next) {
                msg += "    "+ std::to_string(++ctr) + ". ";
474
475
476

                bool wrote_sig = false;
                if (overloads->is_constructor) {
477
                    // For a constructor, rewrite `(self: Object, arg0, ...) -> NoneType` as `Object(arg0, ...)`
478
                    std::string sig = it2->signature;
479
                    size_t start = sig.find('(') + 7; // skip "(self: "
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
                    if (start < sig.size()) {
                        // End at the , for the next argument
                        size_t end = sig.find(", "), next = end + 2;
                        size_t ret = sig.rfind(" -> ");
                        // Or the ), if there is no comma:
                        if (end >= sig.size()) next = end = sig.find(')');
                        if (start < end && next < sig.size()) {
                            msg.append(sig, start, end - start);
                            msg += '(';
                            msg.append(sig, next, ret - next);
                            wrote_sig = true;
                        }
                    }
                }
                if (!wrote_sig) msg += it2->signature;

Wenzel Jakob's avatar
Wenzel Jakob committed
496
497
                msg += "\n";
            }
498
            msg += "\nInvoked with: ";
499
            tuple args_(args, true);
500
            for (size_t ti = overloads->is_constructor ? 1 : 0; ti < args_.size(); ++ti) {
501
502
503
504
                msg += static_cast<std::string>(static_cast<object>(args_[ti]).str());
                if ((ti + 1) != args_.size() )
                    msg += ", ";
            }
Wenzel Jakob's avatar
Wenzel Jakob committed
505
506
507
508
509
510
511
512
513
514
            PyErr_SetString(PyExc_TypeError, msg.c_str());
            return nullptr;
        } else if (!result) {
            std::string msg = "Unable to convert function return value to a "
                              "Python type! The signature was\n\t";
            msg += it->signature;
            PyErr_SetString(PyExc_TypeError, msg.c_str());
            return nullptr;
        } else {
            if (overloads->is_constructor) {
515
                /* When a constructor ran successfully, the corresponding
Wenzel Jakob's avatar
Wenzel Jakob committed
516
                   holder type (e.g. std::unique_ptr) must still be initialized. */
517
                PyObject *inst = PyTuple_GET_ITEM(args, 0);
Wenzel Jakob's avatar
Wenzel Jakob committed
518
519
520
521
522
523
                auto tinfo = detail::get_type_info(Py_TYPE(inst));
                tinfo->init_holder(inst, nullptr);
            }
            return result.ptr();
        }
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
524
525
};

526
/// Wrapper for Python extension modules
Wenzel Jakob's avatar
Wenzel Jakob committed
527
528
class module : public object {
public:
529
    PYBIND11_OBJECT_DEFAULT(module, object, PyModule_Check)
Wenzel Jakob's avatar
Wenzel Jakob committed
530

531
    explicit module(const char *name, const char *doc = nullptr) {
532
#if PY_MAJOR_VERSION >= 3
Wenzel Jakob's avatar
Wenzel Jakob committed
533
534
535
536
537
538
539
        PyModuleDef *def = new PyModuleDef();
        memset(def, 0, sizeof(PyModuleDef));
        def->m_name = name;
        def->m_doc = doc;
        def->m_size = -1;
        Py_INCREF(def);
        m_ptr = PyModule_Create(def);
540
541
542
#else
        m_ptr = Py_InitModule3(name, nullptr, doc);
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
543
        if (m_ptr == nullptr)
544
            pybind11_fail("Internal error in module::module()");
Wenzel Jakob's avatar
Wenzel Jakob committed
545
546
547
        inc_ref();
    }

548
    template <typename Func, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
549
    module &def(const char *name_, Func &&f, const Extra& ... extra) {
550
551
        cpp_function func(std::forward<Func>(f), name(name_), scope(*this),
                          sibling(getattr(*this, name_, none())), extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
552
553
        /* PyModule_AddObject steals a reference to 'func' */
        PyModule_AddObject(ptr(), name_, func.inc_ref().ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
554
555
556
        return *this;
    }

557
    module def_submodule(const char *name, const char *doc = nullptr) {
Wenzel Jakob's avatar
Wenzel Jakob committed
558
559
560
        std::string full_name = std::string(PyModule_GetName(m_ptr))
            + std::string(".") + std::string(name);
        module result(PyImport_AddModule(full_name.c_str()), true);
561
        if (doc)
562
            result.attr("__doc__") = pybind11::str(doc);
Wenzel Jakob's avatar
Wenzel Jakob committed
563
564
565
        attr(name) = result;
        return result;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
566
567

    static module import(const char *name) {
568
569
        PyObject *obj = PyImport_ImportModule(name);
        if (!obj)
570
            throw import_error("Module \"" + std::string(name) + "\" not found!");
571
        return module(obj, false);
Wenzel Jakob's avatar
Wenzel Jakob committed
572
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
573
574
575
};

NAMESPACE_BEGIN(detail)
Dean Moldovan's avatar
Dean Moldovan committed
576
extern "C" inline PyObject *get_dict(PyObject *op, void *) {
577
578
579
    PyObject *&dict = *_PyObject_GetDictPtr(op);
    if (!dict) {
        dict = PyDict_New();
Dean Moldovan's avatar
Dean Moldovan committed
580
    }
581
582
    Py_XINCREF(dict);
    return dict;
Dean Moldovan's avatar
Dean Moldovan committed
583
584
}

585
586
extern "C" inline int set_dict(PyObject *op, PyObject *new_dict, void *) {
    if (!PyDict_Check(new_dict)) {
Dean Moldovan's avatar
Dean Moldovan committed
587
        PyErr_Format(PyExc_TypeError, "__dict__ must be set to a dictionary, not a '%.200s'",
588
                     Py_TYPE(new_dict)->tp_name);
Dean Moldovan's avatar
Dean Moldovan committed
589
590
        return -1;
    }
591
592
593
594
    PyObject *&dict = *_PyObject_GetDictPtr(op);
    Py_INCREF(new_dict);
    Py_CLEAR(dict);
    dict = new_dict;
Dean Moldovan's avatar
Dean Moldovan committed
595
596
597
598
599
600
601
602
    return 0;
}

static PyGetSetDef generic_getset[] = {
    {const_cast<char*>("__dict__"), get_dict, set_dict, nullptr, nullptr},
    {nullptr, nullptr, nullptr, nullptr, nullptr}
};

Wenzel Jakob's avatar
Wenzel Jakob committed
603
/// Generic support for creating new Python heap types
604
class generic_type : public object {
605
    template <typename...> friend class class_;
Wenzel Jakob's avatar
Wenzel Jakob committed
606
public:
607
    PYBIND11_OBJECT_DEFAULT(generic_type, object, PyType_Check)
Wenzel Jakob's avatar
Wenzel Jakob committed
608
609
protected:
    void initialize(type_record *rec) {
610
611
612
613
614
615
616
617
        auto &internals = get_internals();
        auto tindex = std::type_index(*(rec->type));

        if (internals.registered_types_cpp.find(tindex) !=
            internals.registered_types_cpp.end())
            pybind11_fail("generic_type: type \"" + std::string(rec->name) +
                          "\" is already registered!");

Wenzel Jakob's avatar
Wenzel Jakob committed
618
        object name(PYBIND11_FROM_STRING(rec->name), false);
619
620
        object scope_module;
        if (rec->scope) {
621
622
623
624
625
            if (hasattr(rec->scope, "__module__")) {
                scope_module = rec->scope.attr("__module__");
            } else if (hasattr(rec->scope, "__name__")) {
                scope_module = rec->scope.attr("__name__");
            }
626
627
628
629
630
        }

#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3
        /* Qualified names for Python >= 3.3 */
        object scope_qualname;
631
632
        if (rec->scope && hasattr(rec->scope, "__qualname__"))
            scope_qualname = rec->scope.attr("__qualname__");
633
634
635
636
637
638
639
640
        object ht_qualname;
        if (scope_qualname) {
            ht_qualname = object(PyUnicode_FromFormat(
                "%U.%U", scope_qualname.ptr(), name.ptr()), false);
        } else {
            ht_qualname = name;
        }
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
641
642
643
644
645
646

        size_t num_bases = rec->bases.size();
        tuple bases(num_bases);
        for (size_t i = 0; i < num_bases; ++i)
            bases[i] = rec->bases[i];

647
648
649
650
651
652
653
654
655
656
657
658
        std::string full_name = (scope_module ? ((std::string) scope_module.str() + "." + rec->name)
                                              : std::string(rec->name));

        char *tp_doc = nullptr;
        if (rec->doc) {
            /* Allocate memory for docstring (using PyObject_MALLOC, since
               Python will free this later on) */
            size_t size = strlen(rec->doc) + 1;
            tp_doc = (char *) PyObject_MALLOC(size);
            memcpy((void *) tp_doc, rec->doc, size);
        }

Wenzel Jakob's avatar
Wenzel Jakob committed
659
660
661
662
663
        /* Danger zone: from now (and until PyType_Ready), make sure to
           issue no Python C API calls which could potentially invoke the
           garbage collector (the GC will call type_traverse(), which will in
           turn find the newly constructed type in an invalid state) */

664
        object type_holder(PyType_Type.tp_alloc(&PyType_Type, 0), false);
665
666
667
        auto type = (PyHeapTypeObject*) type_holder.ptr();

        if (!type_holder || !name)
668
            pybind11_fail(std::string(rec->name) + ": Unable to create type object!");
669
670
671
672

        /* Register supplemental type information in C++ dict */
        detail::type_info *tinfo = new detail::type_info();
        tinfo->type = (PyTypeObject *) type;
Wenzel Jakob's avatar
Wenzel Jakob committed
673
674
        tinfo->type_size = rec->type_size;
        tinfo->init_holder = rec->init_holder;
675
        internals.registered_types_cpp[tindex] = tinfo;
676
677
678
679
        internals.registered_types_py[type] = tinfo;

        /* Basic type attributes */
        type->ht_type.tp_name = strdup(full_name.c_str());
680
        type->ht_type.tp_basicsize = (ssize_t) rec->instance_size;
Wenzel Jakob's avatar
Wenzel Jakob committed
681
682
683
684
685
686

        if (num_bases > 0) {
            type->ht_type.tp_base = (PyTypeObject *) ((object) bases[0]).inc_ref().ptr();
            type->ht_type.tp_bases = bases.release().ptr();
            rec->multiple_inheritance |= num_bases > 1;
        }
687

688
689
        type->ht_name = name.release().ptr();

690
#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3
691
        type->ht_qualname = ht_qualname.release().ptr();
692
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
693

694
695
696
697
        /* Supported protocols */
        type->ht_type.tp_as_number = &type->as_number;
        type->ht_type.tp_as_sequence = &type->as_sequence;
        type->ht_type.tp_as_mapping = &type->as_mapping;
Wenzel Jakob's avatar
Wenzel Jakob committed
698

699
        /* Supported elementary operations */
Wenzel Jakob's avatar
Wenzel Jakob committed
700
701
        type->ht_type.tp_init = (initproc) init;
        type->ht_type.tp_new = (newfunc) new_instance;
Wenzel Jakob's avatar
Wenzel Jakob committed
702
        type->ht_type.tp_dealloc = rec->dealloc;
703
704

        /* Support weak references (needed for the keep_alive feature) */
705
        type->ht_type.tp_weaklistoffset = offsetof(instance_essentials<void>, weakrefs);
706
707
708

        /* Flags */
        type->ht_type.tp_flags |= Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HEAPTYPE;
709
710
711
#if PY_MAJOR_VERSION < 3
        type->ht_type.tp_flags |= Py_TPFLAGS_CHECKTYPES;
#endif
712
        type->ht_type.tp_flags &= ~Py_TPFLAGS_HAVE_GC;
713

Dean Moldovan's avatar
Dean Moldovan committed
714
715
716
        /* Support dynamic attributes */
        if (rec->dynamic_attr) {
            type->ht_type.tp_flags |= Py_TPFLAGS_HAVE_GC;
717
718
            type->ht_type.tp_dictoffset = type->ht_type.tp_basicsize; // place the dict at the end
            type->ht_type.tp_basicsize += sizeof(PyObject *); // and allocate enough space for it
Dean Moldovan's avatar
Dean Moldovan committed
719
720
721
722
723
            type->ht_type.tp_getset = generic_getset;
            type->ht_type.tp_traverse = traverse;
            type->ht_type.tp_clear = clear;
        }

724
        type->ht_type.tp_doc = tp_doc;
Wenzel Jakob's avatar
Wenzel Jakob committed
725
726

        if (PyType_Ready(&type->ht_type) < 0)
727
728
            pybind11_fail(std::string(rec->name) + ": PyType_Ready failed (" +
                          detail::error_string() + ")!");
729
730

        m_ptr = type_holder.ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
731

732
        if (scope_module) // Needed by pydoc
Wenzel Jakob's avatar
Wenzel Jakob committed
733
            attr("__module__") = scope_module;
Wenzel Jakob's avatar
Wenzel Jakob committed
734

735
        /* Register type with the parent scope */
736
737
        if (rec->scope)
            rec->scope.attr(handle(type->ht_name)) = *this;
Wenzel Jakob's avatar
Wenzel Jakob committed
738

Wenzel Jakob's avatar
Wenzel Jakob committed
739
740
741
        if (rec->multiple_inheritance)
            mark_parents_nonsimple(&type->ht_type);

742
        type_holder.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
743
744
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
745
746
747
748
749
750
751
752
753
754
755
    /// Helper function which tags all parents of a type using mult. inheritance
    void mark_parents_nonsimple(PyTypeObject *value) {
        tuple t(value->tp_bases, true);
        for (handle h : t) {
            auto tinfo2 = get_type_info((PyTypeObject *) h.ptr());
            if (tinfo2)
                tinfo2->simple_type = false;
            mark_parents_nonsimple((PyTypeObject *) h.ptr());
        }
    }

756
    /// Allocate a metaclass on demand (for static properties)
Wenzel Jakob's avatar
Wenzel Jakob committed
757
758
    handle metaclass() {
        auto &ht_type = ((PyHeapTypeObject *) m_ptr)->ht_type;
759
        auto &ob_type = PYBIND11_OB_TYPE(ht_type);
760

Wenzel Jakob's avatar
Wenzel Jakob committed
761
        if (ob_type == &PyType_Type) {
762
            std::string name_ = std::string(ht_type.tp_name) + "__Meta";
763
#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3
764
            object ht_qualname(PyUnicode_FromFormat("%U__Meta", attr("__qualname__").ptr()), false);
765
#endif
766
            object name(PYBIND11_FROM_STRING(name_.c_str()), false);
767
            object type_holder(PyType_Type.tp_alloc(&PyType_Type, 0), false);
768
            if (!type_holder || !name)
769
                pybind11_fail("generic_type::metaclass(): unable to create type object!");
770
771

            auto type = (PyHeapTypeObject*) type_holder.ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
772
            type->ht_name = name.release().ptr();
773

Wenzel Jakob's avatar
Wenzel Jakob committed
774
775
#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3
            /* Qualified names for Python >= 3.3 */
776
            type->ht_qualname = ht_qualname.release().ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
777
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
778
            type->ht_type.tp_name = strdup(name_.c_str());
Wenzel Jakob's avatar
Wenzel Jakob committed
779
            type->ht_type.tp_base = ob_type;
780
781
782
            type->ht_type.tp_flags |= (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE) &
                                      ~Py_TPFLAGS_HAVE_GC;

Wenzel Jakob's avatar
Wenzel Jakob committed
783
            if (PyType_Ready(&type->ht_type) < 0)
784
                pybind11_fail("generic_type::metaclass(): PyType_Ready failed!");
785

Wenzel Jakob's avatar
Wenzel Jakob committed
786
            ob_type = (PyTypeObject *) type_holder.release().ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
787
788
789
790
791
792
793
794
795
796
797
        }
        return handle((PyObject *) ob_type);
    }

    static int init(void *self, PyObject *, PyObject *) {
        std::string msg = std::string(Py_TYPE(self)->tp_name) + ": No constructor defined!";
        PyErr_SetString(PyExc_TypeError, msg.c_str());
        return -1;
    }

    static PyObject *new_instance(PyTypeObject *type, PyObject *, PyObject *) {
798
799
800
        instance<void> *self = (instance<void> *) PyType_GenericAlloc((PyTypeObject *) type, 0);
        auto tinfo = detail::get_type_info(type);
        self->value = ::operator new(tinfo->type_size);
Wenzel Jakob's avatar
Wenzel Jakob committed
801
802
        self->owned = true;
        self->constructed = false;
803
        detail::get_internals().registered_instances.emplace(self->value, (PyObject *) self);
Wenzel Jakob's avatar
Wenzel Jakob committed
804
805
806
807
808
        return (PyObject *) self;
    }

    static void dealloc(instance<void> *self) {
        if (self->value) {
809
810
811
812
813
814
815
816
817
818
            auto instance_type = Py_TYPE(self);
            auto &registered_instances = detail::get_internals().registered_instances;
            auto range = registered_instances.equal_range(self->value);
            bool found = false;
            for (auto it = range.first; it != range.second; ++it) {
                if (instance_type == Py_TYPE(it->second)) {
                    registered_instances.erase(it);
                    found = true;
                    break;
                }
Wenzel Jakob's avatar
Wenzel Jakob committed
819
            }
820
821
822
            if (!found)
                pybind11_fail("generic_type::dealloc(): Tried to deallocate unregistered instance!");

823
824
            if (self->weakrefs)
                PyObject_ClearWeakRefs((PyObject *) self);
Dean Moldovan's avatar
Dean Moldovan committed
825

826
827
828
829
            PyObject **dict_ptr = _PyObject_GetDictPtr((PyObject *) self);
            if (dict_ptr) {
                Py_CLEAR(*dict_ptr);
            }
Wenzel Jakob's avatar
Wenzel Jakob committed
830
831
832
833
        }
        Py_TYPE(self)->tp_free((PyObject*) self);
    }

Dean Moldovan's avatar
Dean Moldovan committed
834
    static int traverse(PyObject *op, visitproc visit, void *arg) {
835
836
        PyObject *&dict = *_PyObject_GetDictPtr(op);
        Py_VISIT(dict);
Dean Moldovan's avatar
Dean Moldovan committed
837
838
839
840
        return 0;
    }

    static int clear(PyObject *op) {
841
842
        PyObject *&dict = *_PyObject_GetDictPtr(op);
        Py_CLEAR(dict);
Dean Moldovan's avatar
Dean Moldovan committed
843
844
845
        return 0;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
846
847
848
    void install_buffer_funcs(
            buffer_info *(*get_buffer)(PyObject *, void *),
            void *get_buffer_data) {
Wenzel Jakob's avatar
Wenzel Jakob committed
849
850
        PyHeapTypeObject *type = (PyHeapTypeObject*) m_ptr;
        type->ht_type.tp_as_buffer = &type->as_buffer;
851
852
853
#if PY_MAJOR_VERSION < 3
        type->ht_type.tp_flags |= Py_TPFLAGS_HAVE_NEWBUFFER;
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
854
855
        type->as_buffer.bf_getbuffer = getbuffer;
        type->as_buffer.bf_releasebuffer = releasebuffer;
856
857
858
        auto tinfo = detail::get_type_info(&type->ht_type);
        tinfo->get_buffer = get_buffer;
        tinfo->get_buffer_data = get_buffer_data;
Wenzel Jakob's avatar
Wenzel Jakob committed
859
860
861
    }

    static int getbuffer(PyObject *obj, Py_buffer *view, int flags) {
862
863
864
        auto tinfo = detail::get_type_info(Py_TYPE(obj));
        if (view == nullptr || obj == nullptr || !tinfo || !tinfo->get_buffer) {
            PyErr_SetString(PyExc_BufferError, "generic_type::getbuffer(): Internal error");
Wenzel Jakob's avatar
Wenzel Jakob committed
865
866
867
            return -1;
        }
        memset(view, 0, sizeof(Py_buffer));
868
        buffer_info *info = tinfo->get_buffer(obj, tinfo->get_buffer_data);
Wenzel Jakob's avatar
Wenzel Jakob committed
869
870
871
872
        view->obj = obj;
        view->ndim = 1;
        view->internal = info;
        view->buf = info->ptr;
873
        view->itemsize = (ssize_t) info->itemsize;
Wenzel Jakob's avatar
Wenzel Jakob committed
874
875
876
877
878
879
        view->len = view->itemsize;
        for (auto s : info->shape)
            view->len *= s;
        if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
            view->format = const_cast<char *>(info->format.c_str());
        if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES) {
880
            view->ndim = (int) info->ndim;
881
882
            view->strides = (ssize_t *) &info->strides[0];
            view->shape = (ssize_t *) &info->shape[0];
Wenzel Jakob's avatar
Wenzel Jakob committed
883
884
885
886
887
888
889
        }
        Py_INCREF(view->obj);
        return 0;
    }

    static void releasebuffer(PyObject *, Py_buffer *view) { delete (buffer_info *) view->internal; }
};
890

Wenzel Jakob's avatar
Wenzel Jakob committed
891
892
NAMESPACE_END(detail)

893
template <typename type_, typename... options>
Wenzel Jakob's avatar
Wenzel Jakob committed
894
class class_ : public detail::generic_type {
895
896
    template <typename T> using is_holder = detail::is_holder_type<type_, T>;
    template <typename T> using is_subtype = detail::bool_constant<std::is_base_of<type_, T>::value && !std::is_same<T, type_>::value>;
Wenzel Jakob's avatar
Wenzel Jakob committed
897
    template <typename T> using is_base = detail::bool_constant<std::is_base_of<T, type_>::value && !std::is_same<T, type_>::value>;
898
899
900
    template <typename T> using is_valid_class_option =
        detail::bool_constant<
            is_holder<T>::value ||
901
            is_subtype<T>::value ||
Wenzel Jakob's avatar
Wenzel Jakob committed
902
            is_base<T>::value
903
904
        >;

Wenzel Jakob's avatar
Wenzel Jakob committed
905
public:
906
    using type = type_;
907
    using type_alias = detail::first_of_t<is_subtype, void, options...>;
908
    constexpr static bool has_alias = !std::is_void<type_alias>::value;
909
    using holder_type = detail::first_of_t<is_holder, std::unique_ptr<type>, options...>;
910
911
912
913
    using instance_type = detail::instance<type, holder_type>;

    static_assert(detail::all_of_t<is_valid_class_option, options...>::value,
            "Unknown/invalid class_ template parameters provided");
Wenzel Jakob's avatar
Wenzel Jakob committed
914

915
    PYBIND11_OBJECT(class_, detail::generic_type, PyType_Check)
Wenzel Jakob's avatar
Wenzel Jakob committed
916

Wenzel Jakob's avatar
Wenzel Jakob committed
917
918
919
920
921
922
    template <typename... Extra>
    class_(handle scope, const char *name, const Extra &... extra) {
        detail::type_record record;
        record.scope = scope;
        record.name = name;
        record.type = &typeid(type);
923
        record.type_size = sizeof(detail::conditional_t<has_alias, type_alias, type>);
Wenzel Jakob's avatar
Wenzel Jakob committed
924
925
926
927
        record.instance_size = sizeof(instance_type);
        record.init_holder = init_holder;
        record.dealloc = dealloc;

Wenzel Jakob's avatar
Wenzel Jakob committed
928
        /* Register base classes specified via template arguments to class_, if any */
929
        bool unused[] = { (add_base<options>(record), false)..., false };
Wenzel Jakob's avatar
Wenzel Jakob committed
930
        (void) unused;
931

Wenzel Jakob's avatar
Wenzel Jakob committed
932
933
934
935
        /* Process optional arguments, if any */
        detail::process_attributes<Extra...>::init(extra..., &record);

        detail::generic_type::initialize(&record);
936

937
        if (has_alias) {
938
939
940
            auto &instances = pybind11::detail::get_internals().registered_types_cpp;
            instances[std::type_index(typeid(type_alias))] = instances[std::type_index(typeid(type))];
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
941
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
942

943
    template <typename Base, detail::enable_if_t<is_base<Base>::value, int> = 0>
Wenzel Jakob's avatar
Wenzel Jakob committed
944
945
946
947
948
949
    static void add_base(detail::type_record &rec) {
        rec.add_base(&typeid(Base), [](void *src) -> void * {
            return static_cast<Base *>(reinterpret_cast<type *>(src));
        });
    }

950
    template <typename Base, detail::enable_if_t<!is_base<Base>::value, int> = 0>
Wenzel Jakob's avatar
Wenzel Jakob committed
951
952
    static void add_base(detail::type_record &) { }

953
    template <typename Func, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
954
    class_ &def(const char *name_, Func&& f, const Extra&... extra) {
955
956
        cpp_function cf(std::forward<Func>(f), name(name_), is_method(*this),
                        sibling(getattr(*this, name_, none())), extra...);
957
        attr(cf.name()) = cf;
Wenzel Jakob's avatar
Wenzel Jakob committed
958
959
960
        return *this;
    }

961
    template <typename Func, typename... Extra> class_ &
Wenzel Jakob's avatar
Wenzel Jakob committed
962
    def_static(const char *name_, Func f, const Extra&... extra) {
963
964
        cpp_function cf(std::forward<Func>(f), name(name_), scope(*this),
                        sibling(getattr(*this, name_, none())), extra...);
965
        attr(cf.name()) = cf;
Wenzel Jakob's avatar
Wenzel Jakob committed
966
967
968
        return *this;
    }

969
    template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
970
    class_ &def(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
971
        op.execute(*this, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
972
973
974
        return *this;
    }

975
    template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
976
    class_ & def_cast(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
977
        op.execute_cast(*this, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
978
979
980
        return *this;
    }

981
    template <typename... Args, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
982
    class_ &def(const detail::init<Args...> &init, const Extra&... extra) {
983
        init.execute(*this, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
984
985
986
        return *this;
    }

987
988
    template <typename... Args, typename... Extra>
    class_ &def(const detail::init_alias<Args...> &init, const Extra&... extra) {
989
        init.execute(*this, extra...);
990
991
992
        return *this;
    }

993
    template <typename Func> class_& def_buffer(Func &&func) {
Wenzel Jakob's avatar
Wenzel Jakob committed
994
995
996
        struct capture { Func func; };
        capture *ptr = new capture { std::forward<Func>(func) };
        install_buffer_funcs([](PyObject *obj, void *ptr) -> buffer_info* {
Wenzel Jakob's avatar
Wenzel Jakob committed
997
998
999
            detail::type_caster<type> caster;
            if (!caster.load(obj, false))
                return nullptr;
Wenzel Jakob's avatar
Wenzel Jakob committed
1000
1001
            return new buffer_info(((capture *) ptr)->func(caster));
        }, ptr);
Wenzel Jakob's avatar
Wenzel Jakob committed
1002
1003
1004
        return *this;
    }

1005
    template <typename C, typename D, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
1006
    class_ &def_readwrite(const char *name, D C::*pm, const Extra&... extra) {
1007
1008
1009
        cpp_function fget([pm](const C &c) -> const D &{ return c.*pm; }, is_method(*this)),
                     fset([pm](C &c, const D &value) { c.*pm = value; }, is_method(*this));
        def_property(name, fget, fset, return_value_policy::reference_internal, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
1010
1011
1012
        return *this;
    }

1013
    template <typename C, typename D, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
1014
    class_ &def_readonly(const char *name, const D C::*pm, const Extra& ...extra) {
1015
1016
        cpp_function fget([pm](const C &c) -> const D &{ return c.*pm; }, is_method(*this));
        def_property_readonly(name, fget, return_value_policy::reference_internal, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
1017
1018
1019
        return *this;
    }

1020
    template <typename D, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
1021
    class_ &def_readwrite_static(const char *name, D *pm, const Extra& ...extra) {
1022
1023
1024
        cpp_function fget([pm](object) -> const D &{ return *pm; }, scope(*this)),
                     fset([pm](object, const D &value) { *pm = value; }, scope(*this));
        def_property_static(name, fget, fset, return_value_policy::reference, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
1025
1026
1027
        return *this;
    }

1028
    template <typename D, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
1029
    class_ &def_readonly_static(const char *name, const D *pm, const Extra& ...extra) {
1030
1031
        cpp_function fget([pm](object) -> const D &{ return *pm; }, scope(*this));
        def_property_readonly_static(name, fget, return_value_policy::reference, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
1032
1033
1034
        return *this;
    }

1035
1036
1037
    template <typename... Extra>
    class_ &def_property_readonly(const char *name, const cpp_function &fget, const Extra& ...extra) {
        def_property(name, fget, cpp_function(), extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
1038
1039
1040
        return *this;
    }

1041
1042
1043
    template <typename... Extra>
    class_ &def_property_readonly_static(const char *name, const cpp_function &fget, const Extra& ...extra) {
        def_property_static(name, fget, cpp_function(), extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
1044
1045
1046
        return *this;
    }

1047
1048
    template <typename... Extra>
    class_ &def_property(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
1049
        return def_property_static(name, fget, fset, is_method(*this), extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
1050
1051
    }

1052
1053
1054
    template <typename... Extra>
    class_ &def_property_static(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
        auto rec_fget = get_function_record(fget), rec_fset = get_function_record(fset);
1055
        char *doc_prev = rec_fget->doc; /* 'extra' field may include a property-specific documentation string */
1056
        detail::process_attributes<Extra...>::init(extra..., rec_fget);
1057
1058
1059
1060
1061
1062
        if (rec_fget->doc && rec_fget->doc != doc_prev) {
            free(doc_prev);
            rec_fget->doc = strdup(rec_fget->doc);
        }
        if (rec_fset) {
            doc_prev = rec_fset->doc;
1063
            detail::process_attributes<Extra...>::init(extra..., rec_fset);
1064
1065
1066
1067
1068
            if (rec_fset->doc && rec_fset->doc != doc_prev) {
                free(doc_prev);
                rec_fset->doc = strdup(rec_fset->doc);
            }
        }
1069
        pybind11::str doc_obj = pybind11::str(rec_fget->doc ? rec_fget->doc : "");
Wenzel Jakob's avatar
Wenzel Jakob committed
1070
        object property(
Wenzel Jakob's avatar
Wenzel Jakob committed
1071
1072
            PyObject_CallFunctionObjArgs((PyObject *) &PyProperty_Type, fget.ptr() ? fget.ptr() : Py_None,
                                         fset.ptr() ? fset.ptr() : Py_None, Py_None, doc_obj.ptr(), nullptr), false);
1073
1074
1075
1076
        if (rec_fget->class_)
            attr(name) = property;
        else
            metaclass().attr(name) = property;
Wenzel Jakob's avatar
Wenzel Jakob committed
1077
1078
        return *this;
    }
1079

Wenzel Jakob's avatar
Wenzel Jakob committed
1080
private:
1081
1082
1083
    /// Initialize holder object, variant 1: object derives from enable_shared_from_this
    template <typename T>
    static void init_holder_helper(instance_type *inst, const holder_type * /* unused */, const std::enable_shared_from_this<T> * /* dummy */) {
1084
        try {
1085
            new (&inst->holder) holder_type(std::static_pointer_cast<typename holder_type::element_type>(inst->value->shared_from_this()));
1086
1087
1088
        } catch (const std::bad_weak_ptr &) {
            new (&inst->holder) holder_type(inst->value);
        }
1089
1090
1091
1092
    }

    /// Initialize holder object, variant 2: try to construct from existing holder object, if possible
    template <typename T = holder_type,
1093
              detail::enable_if_t<std::is_copy_constructible<T>::value, int> = 0>
1094
1095
1096
1097
1098
1099
1100
1101
1102
    static void init_holder_helper(instance_type *inst, const holder_type *holder_ptr, const void * /* dummy */) {
        if (holder_ptr)
            new (&inst->holder) holder_type(*holder_ptr);
        else
            new (&inst->holder) holder_type(inst->value);
    }

    /// Initialize holder object, variant 3: holder is not copy constructible (e.g. unique_ptr), always initialize from raw pointer
    template <typename T = holder_type,
1103
              detail::enable_if_t<!std::is_copy_constructible<T>::value, int> = 0>
1104
1105
1106
1107
1108
1109
1110
1111
    static void init_holder_helper(instance_type *inst, const holder_type * /* unused */, const void * /* dummy */) {
        new (&inst->holder) holder_type(inst->value);
    }

    /// Initialize holder object of an instance, possibly given a pointer to an existing holder
    static void init_holder(PyObject *inst_, const void *holder_ptr) {
        auto inst = (instance_type *) inst_;
        init_holder_helper(inst, (const holder_type *) holder_ptr, inst->value);
1112
1113
1114
        inst->constructed = true;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
1115
1116
1117
1118
1119
1120
1121
1122
    static void dealloc(PyObject *inst_) {
        instance_type *inst = (instance_type *) inst_;
        if (inst->owned) {
            if (inst->constructed)
                inst->holder.~holder_type();
            else
                ::operator delete(inst->value);
        }
1123
        generic_type::dealloc((detail::instance<void> *) inst);
Wenzel Jakob's avatar
Wenzel Jakob committed
1124
    }
1125
1126
1127
1128
1129
1130

    static detail::function_record *get_function_record(handle h) {
        h = detail::get_function(h);
        return h ? (detail::function_record *) capsule(
               PyCFunction_GetSelf(h.ptr()), true) : nullptr;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
1131
1132
1133
1134
1135
};

/// Binds C++ enumerations and enumeration classes to Python
template <typename Type> class enum_ : public class_<Type> {
public:
1136
    using class_<Type>::def;
1137
    using UnderlyingType = typename std::underlying_type<Type>::type;
Wenzel Jakob's avatar
Wenzel Jakob committed
1138
1139
1140
    template <typename... Extra>
    enum_(const handle &scope, const char *name, const Extra&... extra)
      : class_<Type>(scope, name, extra...), m_parent(scope) {
1141
        auto entries = new std::unordered_map<UnderlyingType, const char *>();
1142
        def("__repr__", [name, entries](Type value) -> std::string {
1143
            auto it = entries->find((UnderlyingType) value);
Wenzel Jakob's avatar
Wenzel Jakob committed
1144
1145
1146
1147
            return std::string(name) + "." +
                ((it == entries->end()) ? std::string("???")
                                        : std::string(it->second));
        });
1148
1149
1150
1151
1152
        def("__init__", [](Type& value, UnderlyingType i) { value = (Type)i; });
        def("__init__", [](Type& value, UnderlyingType i) { new (&value) Type((Type) i); });
        def("__int__", [](Type value) { return (UnderlyingType) value; });
        def("__eq__", [](const Type &value, Type *value2) { return value2 && value == *value2; });
        def("__ne__", [](const Type &value, Type *value2) { return !value2 || value != *value2; });
1153
1154
1155
1156
        if (std::is_convertible<Type, UnderlyingType>::value) {
            // Don't provide comparison with the underlying type if the enum isn't convertible,
            // i.e. if Type is a scoped enum, mirroring the C++ behaviour.  (NB: we explicitly
            // convert Type to UnderlyingType below anyway because this needs to compile).
1157
1158
            def("__eq__", [](const Type &value, UnderlyingType value2) { return (UnderlyingType) value == value2; });
            def("__ne__", [](const Type &value, UnderlyingType value2) { return (UnderlyingType) value != value2; });
1159
        }
1160
        def("__hash__", [](const Type &value) { return (UnderlyingType) value; });
Wenzel Jakob's avatar
Wenzel Jakob committed
1161
        // Pickling and unpickling -- needed for use with the 'multiprocessing' module
1162
1163
        def("__getstate__", [](const Type &value) { return pybind11::make_tuple((UnderlyingType) value); });
        def("__setstate__", [](Type &p, tuple t) { new (&p) Type((Type) t[0].cast<UnderlyingType>()); });
Wenzel Jakob's avatar
Wenzel Jakob committed
1164
1165
1166
1167
1168
1169
1170
        m_entries = entries;
    }

    /// Export enumeration entries into the parent scope
    void export_values() {
        PyObject *dict = ((PyTypeObject *) this->m_ptr)->tp_dict;
        PyObject *key, *value;
1171
        ssize_t pos = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
1172
1173
1174
1175
1176
1177
1178
        while (PyDict_Next(dict, &pos, &key, &value))
            if (PyObject_IsInstance(value, this->m_ptr))
                m_parent.attr(key) = value;
    }

    /// Add an enumeration entry
    enum_& value(char const* name, Type value) {
1179
        this->attr(name) = pybind11::cast(value, return_value_policy::copy);
1180
        (*m_entries)[(UnderlyingType) value] = name;
Wenzel Jakob's avatar
Wenzel Jakob committed
1181
1182
1183
        return *this;
    }
private:
1184
    std::unordered_map<UnderlyingType, const char *> *m_entries;
Wenzel Jakob's avatar
Wenzel Jakob committed
1185
    handle m_parent;
Wenzel Jakob's avatar
Wenzel Jakob committed
1186
1187
1188
};

NAMESPACE_BEGIN(detail)
1189
template <typename... Args> struct init {
1190
1191
    template <typename Class, typename... Extra, enable_if_t<!Class::has_alias, int> = 0>
    static void execute(Class &cl, const Extra&... extra) {
1192
        using Base = typename Class::type;
Wenzel Jakob's avatar
Wenzel Jakob committed
1193
        /// Function which calls a specific C++ in-place constructor
1194
        cl.def("__init__", [](Base *self_, Args... args) { new (self_) Base(args...); }, extra...);
1195
1196
    }

1197
    template <typename Class, typename... Extra,
1198
1199
1200
              enable_if_t<Class::has_alias &&
                          std::is_constructible<typename Class::type, Args...>::value, int> = 0>
    static void execute(Class &cl, const Extra&... extra) {
1201
1202
1203
1204
        using Base = typename Class::type;
        using Alias = typename Class::type_alias;
        handle cl_type = cl;
        cl.def("__init__", [cl_type](handle self_, Args... args) {
1205
1206
                if (self_.get_type() == cl_type)
                    new (self_.cast<Base *>()) Base(args...);
1207
                else
1208
                    new (self_.cast<Alias *>()) Alias(args...);
1209
1210
1211
            }, extra...);
    }

1212
    template <typename Class, typename... Extra,
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
              enable_if_t<Class::has_alias &&
                          !std::is_constructible<typename Class::type, Args...>::value, int> = 0>
    static void execute(Class &cl, const Extra&... extra) {
        init_alias<Args...>::execute(cl, extra...);
    }
};
template <typename... Args> struct init_alias {
    template <typename Class, typename... Extra,
              enable_if_t<Class::has_alias && std::is_constructible<typename Class::type_alias, Args...>::value, int> = 0>
    static void execute(Class &cl, const Extra&... extra) {
1223
1224
        using Alias = typename Class::type_alias;
        cl.def("__init__", [](Alias *self_, Args... args) { new (self_) Alias(args...); }, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
1225
1226
    }
};
1227

1228

1229
inline void keep_alive_impl(handle nurse, handle patient) {
1230
    /* Clever approach based on weak references taken from Boost.Python */
1231
    if (!nurse || !patient)
1232
        pybind11_fail("Could not activate keep_alive!");
1233

1234
    if (patient.is_none() || nurse.is_none())
1235
        return; /* Nothing to keep alive or nothing to be kept alive by */
1236

1237
    cpp_function disable_lifesupport(
1238
        [patient](handle weakref) { patient.dec_ref(); weakref.dec_ref(); });
1239

1240
    weakref wr(nurse, disable_lifesupport);
1241

1242
1243
    patient.inc_ref(); /* reference patient and leak the weak reference */
    (void) wr.release();
1244
1245
}

1246
1247
1248
1249
1250
1251
1252
PYBIND11_NOINLINE inline void keep_alive_impl(int Nurse, int Patient, handle args, handle ret) {
    handle nurse  (Nurse   > 0 ? PyTuple_GetItem(args.ptr(), Nurse   - 1) : ret.ptr());
    handle patient(Patient > 0 ? PyTuple_GetItem(args.ptr(), Patient - 1) : ret.ptr());

    keep_alive_impl(nurse, patient);
}

1253
template <typename Iterator, typename Sentinel, bool KeyIterator, return_value_policy Policy>
1254
1255
1256
struct iterator_state {
    Iterator it;
    Sentinel end;
1257
1258
    bool first;
};
1259

Wenzel Jakob's avatar
Wenzel Jakob committed
1260
1261
NAMESPACE_END(detail)

1262
template <typename... Args> detail::init<Args...> init() { return detail::init<Args...>(); }
1263
template <typename... Args> detail::init_alias<Args...> init_alias() { return detail::init_alias<Args...>(); }
Wenzel Jakob's avatar
Wenzel Jakob committed
1264

1265
1266
template <return_value_policy Policy = return_value_policy::reference_internal,
          typename Iterator,
1267
          typename Sentinel,
1268
1269
          typename ValueType = decltype(*std::declval<Iterator>()),
          typename... Extra>
1270
iterator make_iterator(Iterator first, Sentinel last, Extra &&... extra) {
1271
    typedef detail::iterator_state<Iterator, Sentinel, false, Policy> state;
1272

Wenzel Jakob's avatar
Wenzel Jakob committed
1273
    if (!detail::get_type_info(typeid(state), false)) {
1274
        class_<state>(handle(), "iterator")
1275
            .def("__iter__", [](state &s) -> state& { return s; })
1276
            .def("__next__", [](state &s) -> ValueType {
1277
1278
1279
1280
                if (!s.first)
                    ++s.it;
                else
                    s.first = false;
1281
1282
                if (s.it == s.end)
                    throw stop_iteration();
1283
                return *s.it;
1284
            }, std::forward<Extra>(extra)..., Policy);
1285
1286
    }

1287
    return (iterator) cast(state { first, last, true });
1288
}
1289

1290
1291
template <return_value_policy Policy = return_value_policy::reference_internal,
          typename Iterator,
1292
          typename Sentinel,
1293
          typename KeyType = decltype((*std::declval<Iterator>()).first),
1294
          typename... Extra>
1295
iterator make_key_iterator(Iterator first, Sentinel last, Extra &&... extra) {
1296
    typedef detail::iterator_state<Iterator, Sentinel, true, Policy> state;
1297

Wenzel Jakob's avatar
Wenzel Jakob committed
1298
    if (!detail::get_type_info(typeid(state), false)) {
1299
        class_<state>(handle(), "iterator")
1300
1301
1302
1303
1304
1305
1306
1307
            .def("__iter__", [](state &s) -> state& { return s; })
            .def("__next__", [](state &s) -> KeyType {
                if (!s.first)
                    ++s.it;
                else
                    s.first = false;
                if (s.it == s.end)
                    throw stop_iteration();
1308
                return (*s.it).first;
1309
            }, std::forward<Extra>(extra)..., Policy);
1310
1311
1312
1313
    }

    return (iterator) cast(state { first, last, true });
}
1314

1315
1316
1317
template <return_value_policy Policy = return_value_policy::reference_internal,
          typename Type, typename... Extra> iterator make_iterator(Type &value, Extra&&... extra) {
    return make_iterator<Policy>(std::begin(value), std::end(value), extra...);
1318
1319
}

1320
1321
1322
template <return_value_policy Policy = return_value_policy::reference_internal,
          typename Type, typename... Extra> iterator make_key_iterator(Type &value, Extra&&... extra) {
    return make_key_iterator<Policy>(std::begin(value), std::end(value), extra...);
1323
1324
}

Wenzel Jakob's avatar
Wenzel Jakob committed
1325
template <typename InputType, typename OutputType> void implicitly_convertible() {
1326
    auto implicit_caster = [](PyObject *obj, PyTypeObject *type) -> PyObject * {
Wenzel Jakob's avatar
Wenzel Jakob committed
1327
1328
1329
1330
1331
1332
1333
1334
1335
        if (!detail::type_caster<InputType>().load(obj, false))
            return nullptr;
        tuple args(1);
        args[0] = obj;
        PyObject *result = PyObject_Call((PyObject *) type, args.ptr(), nullptr);
        if (result == nullptr)
            PyErr_Clear();
        return result;
    };
1336
1337
    auto &registered_types = detail::get_internals().registered_types_cpp;
    auto it = registered_types.find(std::type_index(typeid(OutputType)));
Wenzel Jakob's avatar
Wenzel Jakob committed
1338
    if (it == registered_types.end())
1339
        pybind11_fail("implicitly_convertible: Unable to find type " + type_id<OutputType>());
1340
    ((detail::type_info *) it->second)->implicit_conversions.push_back(implicit_caster);
Wenzel Jakob's avatar
Wenzel Jakob committed
1341
1342
}

1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
template <typename ExceptionTranslator>
void register_exception_translator(ExceptionTranslator&& translator) {
    detail::get_internals().registered_exception_translators.push_front(
        std::forward<ExceptionTranslator>(translator));
}

/* Wrapper to generate a new Python exception type.
 *
 * This should only be used with PyErr_SetString for now.
 * It is not (yet) possible to use as a py::base.
 * Template type argument is reserved for future use.
 */
template <typename type>
class exception : public object {
public:
1358
    exception(module &m, const std::string &name, PyObject* base=PyExc_Exception) {
1359
1360
1361
1362
1363
1364
1365
        std::string full_name = std::string(PyModule_GetName(m.ptr()))
                + std::string(".") + name;
        char* exception_name = const_cast<char*>(full_name.c_str());
        m_ptr = PyErr_NewException(exception_name, base, NULL);
        inc_ref(); // PyModule_AddObject() steals a reference
        PyModule_AddObject(m.ptr(), name.c_str(), m_ptr);
    }
1366
1367
1368
1369
1370

    // Sets the current python exception to this exception object with the given message
    void operator()(const char *message) {
        PyErr_SetString(m_ptr, message);
    }
1371
1372
};

1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
/** Registers a Python exception in `m` of the given `name` and installs an exception translator to
 * translate the C++ exception to the created Python exception using the exceptions what() method.
 * This is intended for simple exception translations; for more complex translation, register the
 * exception object and translator directly.
 */
template <typename CppException> exception<CppException>& register_exception(module &m, const std::string &name, PyObject* base = PyExc_Exception) {
    static exception<CppException> ex(m, name, base);
    register_exception_translator([](std::exception_ptr p) {
        if (!p) return;
        try {
            std::rethrow_exception(p);
        }
        catch (const CppException &e) {
            ex(e.what());
        }
    });
    return ex;
}

Dean Moldovan's avatar
Dean Moldovan committed
1392
1393
1394
1395
NAMESPACE_BEGIN(detail)
PYBIND11_NOINLINE inline void print(tuple args, dict kwargs) {
    auto strings = tuple(args.size());
    for (size_t i = 0; i < args.size(); ++i) {
1396
        strings[i] = args[i].str();
Dean Moldovan's avatar
Dean Moldovan committed
1397
    }
1398
    auto sep = kwargs.contains("sep") ? kwargs["sep"] : cast(" ");
1399
    auto line = sep.attr("join")(strings);
Dean Moldovan's avatar
Dean Moldovan committed
1400

1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
    object file;
    if (kwargs.contains("file")) {
        file = kwargs["file"].cast<object>();
    } else {
        try {
            file = module::import("sys").attr("stdout");
        } catch (const import_error &) {
            /* If print() is called from code that is executed as
               part of garbage collection during interpreter shutdown,
               importing 'sys' can fail. Give up rather than crashing the
               interpreter in this case. */
            return;
        }
    }

1416
    auto write = file.attr("write");
Dean Moldovan's avatar
Dean Moldovan committed
1417
    write(line);
1418
    write(kwargs.contains("end") ? kwargs["end"] : cast("\n"));
Dean Moldovan's avatar
Dean Moldovan committed
1419

1420
    if (kwargs.contains("flush") && kwargs["flush"].cast<bool>())
1421
        file.attr("flush")();
Dean Moldovan's avatar
Dean Moldovan committed
1422
1423
1424
1425
1426
1427
1428
1429
1430
}
NAMESPACE_END(detail)

template <return_value_policy policy = return_value_policy::automatic_reference, typename... Args>
void print(Args &&...args) {
    auto c = detail::collect_arguments<policy>(std::forward<Args>(args)...);
    detail::print(c.args(), c.kwargs());
}

1431
#if defined(WITH_THREAD)
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445

/* The functions below essentially reproduce the PyGILState_* API using a RAII
 * pattern, but there are a few important differences:
 *
 * 1. When acquiring the GIL from an non-main thread during the finalization
 *    phase, the GILState API blindly terminates the calling thread, which
 *    is often not what is wanted. This API does not do this.
 *
 * 2. The gil_scoped_release function can optionally cut the relationship
 *    of a PyThreadState and its associated thread, which allows moving it to
 *    another thread (this is a fairly rare/advanced use case).
 *
 * 3. The reference count of an acquired thread state can be controlled. This
 *    can be handy to prevent cases where callbacks issued from an external
1446
1447
 *    thread would otherwise constantly construct and destroy thread state data
 *    structures.
1448
1449
1450
1451
1452
 *
 * See the Python bindings of NanoGUI (http://github.com/wjakob/nanogui) for an
 * example which uses features 2 and 3 to migrate the Python thread of
 * execution to another thread (to run the event loop on the original thread,
 * in this case).
1453
 */
Wenzel Jakob's avatar
Wenzel Jakob committed
1454
1455
1456

class gil_scoped_acquire {
public:
1457
    PYBIND11_NOINLINE gil_scoped_acquire() {
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
        auto const &internals = detail::get_internals();
        tstate = (PyThreadState *) PyThread_get_key_value(internals.tstate);

        if (!tstate) {
            tstate = PyThreadState_New(internals.istate);
            #if !defined(NDEBUG)
                if (!tstate)
                    pybind11_fail("scoped_acquire: could not create thread state!");
            #endif
            tstate->gilstate_counter = 0;
1468
1469
1470
            #if PY_MAJOR_VERSION < 3
                PyThread_delete_key_value(internals.tstate);
            #endif
1471
1472
            PyThread_set_key_value(internals.tstate, tstate);
        } else {
1473
            release = detail::get_thread_state_unchecked() != tstate;
1474
1475
1476
1477
        }

        if (release) {
            /* Work around an annoying assertion in PyThreadState_Swap */
1478
1479
1480
1481
            #if defined(Py_DEBUG)
                PyInterpreterState *interp = tstate->interp;
                tstate->interp = nullptr;
            #endif
1482
            PyEval_AcquireThread(tstate);
1483
1484
1485
            #if defined(Py_DEBUG)
                tstate->interp = interp;
            #endif
1486
1487
1488
1489
1490
1491
1492
1493
1494
        }

        inc_ref();
    }

    void inc_ref() {
        ++tstate->gilstate_counter;
    }

1495
    PYBIND11_NOINLINE void dec_ref() {
1496
1497
        --tstate->gilstate_counter;
        #if !defined(NDEBUG)
1498
            if (detail::get_thread_state_unchecked() != tstate)
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
                pybind11_fail("scoped_acquire::dec_ref(): thread state must be current!");
            if (tstate->gilstate_counter < 0)
                pybind11_fail("scoped_acquire::dec_ref(): reference count underflow!");
        #endif
        if (tstate->gilstate_counter == 0) {
            #if !defined(NDEBUG)
                if (!release)
                    pybind11_fail("scoped_acquire::dec_ref(): internal error!");
            #endif
            PyThreadState_Clear(tstate);
            PyThreadState_DeleteCurrent();
1510
            PyThread_delete_key_value(detail::get_internals().tstate);
1511
1512
1513
1514
            release = false;
        }
    }

1515
    PYBIND11_NOINLINE ~gil_scoped_acquire() {
1516
1517
1518
1519
1520
1521
1522
        dec_ref();
        if (release)
           PyEval_SaveThread();
    }
private:
    PyThreadState *tstate = nullptr;
    bool release = true;
Wenzel Jakob's avatar
Wenzel Jakob committed
1523
1524
1525
1526
};

class gil_scoped_release {
public:
1527
    explicit gil_scoped_release(bool disassoc = false) : disassoc(disassoc) {
1528
        tstate = PyEval_SaveThread();
1529
        if (disassoc) {
1530
            auto key = detail::get_internals().tstate;
1531
1532
1533
1534
1535
1536
            #if PY_MAJOR_VERSION < 3
                PyThread_delete_key_value(key);
            #else
                PyThread_set_key_value(key, nullptr);
            #endif
        }
1537
1538
1539
1540
1541
    }
    ~gil_scoped_release() {
        if (!tstate)
            return;
        PyEval_RestoreThread(tstate);
1542
        if (disassoc) {
1543
            auto key = detail::get_internals().tstate;
1544
1545
1546
1547
1548
            #if PY_MAJOR_VERSION < 3
                PyThread_delete_key_value(key);
            #endif
            PyThread_set_key_value(key, tstate);
        }
1549
1550
1551
1552
    }
private:
    PyThreadState *tstate;
    bool disassoc;
Wenzel Jakob's avatar
Wenzel Jakob committed
1553
};
1554
1555
1556
#else
class gil_scoped_acquire { };
class gil_scoped_release { };
1557
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
1558

1559
1560
inline function get_type_overload(const void *this_ptr, const detail::type_info *this_type, const char *name)  {
    handle py_object = detail::get_object_handle(this_ptr, this_type);
1561
1562
    if (!py_object)
        return function();
1563
1564
1565
    handle type = py_object.get_type();
    auto key = std::make_pair(type.ptr(), name);

1566
1567
    /* Cache functions that aren't overloaded in Python to avoid
       many costly Python dictionary lookups below */
1568
1569
1570
1571
    auto &cache = detail::get_internals().inactive_overload_cache;
    if (cache.find(key) != cache.end())
        return function();

1572
    function overload = getattr(py_object, name, function());
1573
1574
1575
1576
    if (overload.is_cpp_function()) {
        cache.insert(key);
        return function();
    }
1577

1578
    /* Don't call dispatch code if invoked from overridden function */
1579
    PyFrameObject *frame = PyThreadState_Get()->frame;
1580
    if (frame && (std::string) pybind11::handle(frame->f_code->co_name).str() == name &&
1581
1582
1583
1584
1585
1586
1587
        frame->f_code->co_argcount > 0) {
        PyFrame_FastToLocals(frame);
        PyObject *self_caller = PyDict_GetItem(
            frame->f_locals, PyTuple_GET_ITEM(frame->f_code->co_varnames, 0));
        if (self_caller == py_object.ptr())
            return function();
    }
1588
1589
1590
    return overload;
}

1591
1592
1593
1594
1595
1596
1597
1598
template <class T> function get_overload(const T *this_ptr, const char *name) {
    auto &cpp_types = detail::get_internals().registered_types_cpp;
    auto it = cpp_types.find(typeid(T));
    if (it == cpp_types.end())
        return function();
    return get_type_overload(this_ptr, (const detail::type_info *) it->second, name);
}

1599
#define PYBIND11_OVERLOAD_INT(ret_type, cname, name, ...) { \
1600
        pybind11::gil_scoped_acquire gil; \
1601
        pybind11::function overload = pybind11::get_overload(static_cast<const cname *>(this), name); \
1602
        if (overload) { \
1603
            auto o = overload(__VA_ARGS__); \
1604
            if (pybind11::detail::cast_is_temporary_value_reference<ret_type>::value) { \
1605
1606
                static pybind11::detail::overload_caster_t<ret_type> caster; \
                return pybind11::detail::cast_ref<ret_type>(std::move(o), caster); \
1607
1608
1609
1610
            } \
            else return pybind11::detail::cast_safe<ret_type>(std::move(o)); \
        } \
    }
1611

1612
#define PYBIND11_OVERLOAD_NAME(ret_type, cname, name, fn, ...) \
1613
    PYBIND11_OVERLOAD_INT(ret_type, cname, name, __VA_ARGS__) \
1614
    return cname::fn(__VA_ARGS__)
1615

1616
#define PYBIND11_OVERLOAD_PURE_NAME(ret_type, cname, name, fn, ...) \
1617
    PYBIND11_OVERLOAD_INT(ret_type, cname, name, __VA_ARGS__) \
1618
1619
1620
1621
1622
1623
1624
    pybind11::pybind11_fail("Tried to call pure virtual function \"" #cname "::" name "\"");

#define PYBIND11_OVERLOAD(ret_type, cname, fn, ...) \
    PYBIND11_OVERLOAD_NAME(ret_type, cname, #fn, fn, __VA_ARGS__)

#define PYBIND11_OVERLOAD_PURE(ret_type, cname, fn, ...) \
    PYBIND11_OVERLOAD_PURE_NAME(ret_type, cname, #fn, fn, __VA_ARGS__)
1625

1626
NAMESPACE_END(pybind11)
Wenzel Jakob's avatar
Wenzel Jakob committed
1627
1628

#if defined(_MSC_VER)
Wenzel Jakob's avatar
Wenzel Jakob committed
1629
#  pragma warning(pop)
1630
1631
#elif defined(__INTEL_COMPILER)
/* Leave ignored warnings on */
1632
#elif defined(__GNUG__) && !defined(__clang__)
Wenzel Jakob's avatar
Wenzel Jakob committed
1633
#  pragma GCC diagnostic pop
Wenzel Jakob's avatar
Wenzel Jakob committed
1634
#endif