pybind11.h 49.6 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
15
16
17
18
19
#  pragma warning(push)
#  pragma warning(disable: 4127) // warning C4127: Conditional expression is constant
#  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
#  pragma warning(disable: 4100) // warning C4100: Unreferenced formal parameter
#  pragma warning(disable: 4512) // warning C4512: Assignment operator was implicitly defined as deleted
20
#elif defined(__ICC) || defined(__INTEL_COMPILER)
Ben Pritchard's avatar
Ben Pritchard committed
21
#  pragma warning(push)
22
#  pragma warning(disable:2196)  // warning #2196: routine is both "inline" and "noinline"
23
#elif defined(__GNUG__) && !defined(__clang__)
Wenzel Jakob's avatar
Wenzel Jakob committed
24
25
26
27
#  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
28
29
#  pragma GCC diagnostic ignored "-Wstrict-aliasing"
#  pragma GCC diagnostic ignored "-Wattributes"
Wenzel Jakob's avatar
Wenzel Jakob committed
30
31
#endif

Wenzel Jakob's avatar
Wenzel Jakob committed
32
#include "attr.h"
Wenzel Jakob's avatar
Wenzel Jakob committed
33

34
NAMESPACE_BEGIN(pybind11)
Wenzel Jakob's avatar
Wenzel Jakob committed
35

Wenzel Jakob's avatar
Wenzel Jakob committed
36
/// Wraps an arbitrary C++ function/method/lambda function/.. into a callable Python object
37
class cpp_function : public function {
Wenzel Jakob's avatar
Wenzel Jakob committed
38
public:
39
    cpp_function() { }
Wenzel Jakob's avatar
Wenzel Jakob committed
40

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

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

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

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

68
    /// Return the function name
Wenzel Jakob's avatar
Wenzel Jakob committed
69
    object name() const { return attr("__name__"); }
70

71
72
protected:
    /// Special internal constructor for functors, lambda functions, etc.
73
    template <typename Func, typename Return, typename... Args, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
74
    void initialize(Func &&f, Return (*)(Args...), const Extra&... extra) {
75
        struct capture { typename std::remove_reference<Func>::type f; };
Wenzel Jakob's avatar
Wenzel Jakob committed
76

77
        /* Store the function including any extra state it might have (e.g. a lambda capture object) */
Wenzel Jakob's avatar
Wenzel Jakob committed
78
        auto rec = new detail::function_record();
79

80
81
82
83
84
85
86
87
88
        /* Store the capture object directly in the function record if there is enough space */
        if (sizeof(capture) <= sizeof(rec->data)) {
            new ((capture *) &rec->data) capture { std::forward<Func>(f) };
            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]); };
        }
89

90
91
92
93
94
        /* 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
95

96
        /* Dispatch code which converts function arguments and performs the actual function call */
97
        rec->impl = [](detail::function_record *rec, handle args, handle kwargs, handle parent) -> handle {
98
            cast_in args_converter;
99
100

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

Wenzel Jakob's avatar
Wenzel Jakob committed
104
            /* Invoke call policy pre-call hook */
105
106
107
108
109
            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]);
110

111
            /* Perform the functioncall */
112
113
            handle result = cast_out::cast(args_converter.template call<Return>(cap->f),
                                           rec->policy, parent);
Wenzel Jakob's avatar
Wenzel Jakob committed
114
115

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

118
            return result;
Wenzel Jakob's avatar
Wenzel Jakob committed
119
120
        };

Wenzel Jakob's avatar
Wenzel Jakob committed
121
122
        /* Process any user-provided function attributes */
        detail::process_attributes<Extra...>::init(extra..., rec);
123
124

        /* Generate a readable signature describing the function's arguments and return value types */
Wenzel Jakob's avatar
Wenzel Jakob committed
125
        using detail::descr;
Sylvain Corlay's avatar
Sylvain Corlay committed
126
        PYBIND11_DESCR signature = cast_in::name() + detail::_(" -> ") + cast_out::name();
127
128

        /* Register the function with Python from generic (non-templated) code */
129
        initialize_generic(rec, signature.text(), signature.types(), sizeof...(Args));
130
131
132

        if (cast_in::has_args) rec->has_args = true;
        if (cast_in::has_kwargs) rec->has_kwargs = true;
133
134
    }

135
    /// Register a function call with Python (generic non-templated code goes here)
136
137
    void initialize_generic(detail::function_record *rec, const char *text,
                            const std::type_info *const *types, int args) {
Wenzel Jakob's avatar
Wenzel Jakob committed
138

139
        /* Create copies of all referenced C-style strings */
Wenzel Jakob's avatar
Wenzel Jakob committed
140
141
142
        rec->name = strdup(rec->name ? rec->name : "");
        if (rec->doc) rec->doc = strdup(rec->doc);
        for (auto &a: rec->args) {
143
144
145
146
147
            if (a.name)
                a.name = strdup(a.name);
            if (a.descr)
                a.descr = strdup(a.descr);
            else if (a.value)
148
                a.descr = strdup(((std::string) ((object) handle(a.value).attr("__repr__"))().str()).c_str());
149
        }
150
        auto const &registered_types = detail::get_internals().registered_types_cpp;
151
152
153
154
155
156
157
158
159
160

        /* 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 == '{') {
Wenzel Jakob's avatar
Wenzel Jakob committed
161
162
                if (type_depth == 1 && arg_index < rec->args.size()) {
                    signature += rec->args[arg_index].name;
163
164
165
166
167
                    signature += " : ";
                }
                ++type_depth;
            } else if (c == '}') {
                --type_depth;
Wenzel Jakob's avatar
Wenzel Jakob committed
168
169
                if (type_depth == 1 && arg_index < rec->args.size()) {
                    if (rec->args[arg_index].descr) {
170
                        signature += " = ";
Wenzel Jakob's avatar
Wenzel Jakob committed
171
                        signature += rec->args[arg_index].descr;
172
173
174
175
176
                    }
                    arg_index++;
                }
            } else if (c == '%') {
                const std::type_info *t = types[type_index++];
177
                if (!t)
178
                    pybind11_fail("Internal error while parsing type signature (1)");
179
                auto it = registered_types.find(std::type_index(*t));
180
                if (it != registered_types.end()) {
181
                    signature += ((const detail::type_info *) it->second)->type->tp_name;
182
183
184
185
186
187
188
189
190
                } else {
                    std::string tname(t->name());
                    detail::clean_type_id(tname);
                    signature += tname;
                }
            } else {
                signature += c;
            }
        }
191
        if (type_depth != 0 || types[type_index] != nullptr)
192
            pybind11_fail("Internal error while parsing type signature (2)");
193
194
195
196
197

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

199
#if PY_MAJOR_VERSION < 3
Wenzel Jakob's avatar
Wenzel Jakob committed
200
201
202
        if (strcmp(rec->name, "__next__") == 0) {
            std::free(rec->name);
            rec->name = strdup("next");
203
204
205
        } else if (strcmp(rec->name, "__bool__") == 0) {
            std::free(rec->name);
            rec->name = strdup("__nonzero__");
206
        }
207
208
#endif

Wenzel Jakob's avatar
Wenzel Jakob committed
209
        if (!rec->args.empty() && (int) rec->args.size() != args)
210
            pybind11_fail(
Wenzel Jakob's avatar
Wenzel Jakob committed
211
212
                "cpp_function(): function \"" + std::string(rec->name) + "\" takes " +
                std::to_string(args) + " arguments, but " + std::to_string(rec->args.size()) +
213
                " pybind11::arg entries were specified!");
214

Wenzel Jakob's avatar
Wenzel Jakob committed
215
216
        rec->signature = strdup(signature.c_str());
        rec->args.shrink_to_fit();
217
        rec->is_constructor = !strcmp(rec->name, "__init__") || !strcmp(rec->name, "__setstate__");
218
219
        rec->has_args = false;
        rec->has_kwargs = false;
220
        rec->nargs = (uint16_t) args;
221
222

#if PY_MAJOR_VERSION < 3
Wenzel Jakob's avatar
Wenzel Jakob committed
223
224
        if (rec->sibling && PyMethod_Check(rec->sibling.ptr()))
            rec->sibling = PyMethod_GET_FUNCTION(rec->sibling.ptr());
225
#endif
226

Wenzel Jakob's avatar
Wenzel Jakob committed
227
228
229
230
        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;
231
232
            /* 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
233
234
            if (chain->class_ != rec->class_)
                chain = nullptr;
235
236
        }

Wenzel Jakob's avatar
Wenzel Jakob committed
237
        if (!chain) {
238
            /* No existing overload was found, create a new function object */
Wenzel Jakob's avatar
Wenzel Jakob committed
239
240
241
242
243
            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;
244

Wenzel Jakob's avatar
Wenzel Jakob committed
245
246
            capsule rec_capsule(rec, [](PyObject *o) {
                destruct((detail::function_record *) PyCapsule_GetPointer(o, nullptr));
247
            });
248
249
250
251
252
253
254
255
256

            object scope_module;
            if (rec->scope) {
                scope_module = (object) rec->scope.attr("__module__");
                if (!scope_module)
                    scope_module = (object) rec->scope.attr("__name__");
            }

            m_ptr = PyCFunction_NewEx(rec->def, rec_capsule.ptr(), scope_module.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
257
            if (!m_ptr)
258
                pybind11_fail("cpp_function::cpp_function(): Could not allocate function object");
Wenzel Jakob's avatar
Wenzel Jakob committed
259
        } else {
260
            /* Append at the end of the overload chain */
Wenzel Jakob's avatar
Wenzel Jakob committed
261
            m_ptr = rec->sibling.ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
262
            inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
263
264
265
266
            chain_start = chain;
            while (chain->next)
                chain = chain->next;
            chain->next = rec;
Wenzel Jakob's avatar
Wenzel Jakob committed
267
        }
268

Wenzel Jakob's avatar
Wenzel Jakob committed
269
        std::string signatures;
270
        int index = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
271
        /* Create a nice pydoc rec including all signatures and
272
           docstrings of the functions in the overload chain */
273
274
275
276
277
278
279
        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
280
281
        for (auto it = chain_start; it != nullptr; it = it->next) {
            if (chain)
282
                signatures += std::to_string(++index) + ". ";
283
            signatures += rec->name;
284
285
286
287
            signatures += it->signature;
            signatures += "\n";
            if (it->doc && strlen(it->doc) > 0) {
                signatures += "\n";
288
                signatures += it->doc;
289
290
                signatures += "\n";
            }
291
            if (it->next)
Wenzel Jakob's avatar
Wenzel Jakob committed
292
293
                signatures += "\n";
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
294
295

        /* Install docstring */
Wenzel Jakob's avatar
Wenzel Jakob committed
296
297
        PyCFunctionObject *func = (PyCFunctionObject *) m_ptr;
        if (func->m_ml->ml_doc)
298
            std::free((char *) func->m_ml->ml_doc);
Wenzel Jakob's avatar
Wenzel Jakob committed
299
        func->m_ml->ml_doc = strdup(signatures.c_str());
Wenzel Jakob's avatar
Wenzel Jakob committed
300
301
302

        if (rec->class_) {
            m_ptr = PYBIND11_INSTANCE_METHOD_NEW(m_ptr, rec->class_.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
303
            if (!m_ptr)
304
                pybind11_fail("cpp_function::cpp_function(): Could not allocate instance method object");
Wenzel Jakob's avatar
Wenzel Jakob committed
305
306
307
            Py_DECREF(func);
        }
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
308
309
310
311
312
313

    /// 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)
314
                rec->free_data(rec);
Wenzel Jakob's avatar
Wenzel Jakob committed
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
            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 */
339
340
        size_t nargs = PyTuple_GET_SIZE(args),
               nkwargs = kwargs ? PyDict_Size(kwargs) : 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
341

342
        handle parent = nargs > 0 ? PyTuple_GET_ITEM(args, 0) : nullptr,
Wenzel Jakob's avatar
Wenzel Jakob committed
343
344
345
346
               result = PYBIND11_TRY_NEXT_OVERLOAD;
        try {
            for (; it != nullptr; it = it->next) {
                tuple args_(args, true);
347
                size_t kwargs_consumed = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
348
349
350
351
352
353
354
355

                /* 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)
                 */
356
357
358
359
360
                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
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
                        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 {
383
                            kwargs_consumed = (size_t) -1; /* definite failure */
Wenzel Jakob's avatar
Wenzel Jakob committed
384
385
386
387
                            break;
                        }
                    }
                }
388
389

                try {
390
391
392
                    if ((kwargs_consumed == nkwargs || it->has_kwargs) &&
                        (nargs_ == it->nargs || it->has_args))
                        result = it->impl(it, args_, kwargs, parent);
Wenzel Jakob's avatar
Wenzel Jakob committed
393
                } catch (cast_error &) {
394
395
                    result = PYBIND11_TRY_NEXT_OVERLOAD;
                }
Wenzel Jakob's avatar
Wenzel Jakob committed
396
397
398
399
400
401

                if (result.ptr() != PYBIND11_TRY_NEXT_OVERLOAD)
                    break;
            }
        } catch (const error_already_set &)      {                                                 return nullptr;
        } catch (const index_error &e)           { PyErr_SetString(PyExc_IndexError,    e.what()); return nullptr;
402
        } catch (const value_error &e)           { PyErr_SetString(PyExc_ValueError,    e.what()); return nullptr;
Wenzel Jakob's avatar
Wenzel Jakob committed
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
        } catch (const stop_iteration &e)        { PyErr_SetString(PyExc_StopIteration, e.what()); return nullptr;
        } catch (const std::bad_alloc &e)        { PyErr_SetString(PyExc_MemoryError,   e.what()); return nullptr;
        } catch (const std::domain_error &e)     { PyErr_SetString(PyExc_ValueError,    e.what()); return nullptr;
        } catch (const std::invalid_argument &e) { PyErr_SetString(PyExc_ValueError,    e.what()); return nullptr;
        } catch (const std::length_error &e)     { PyErr_SetString(PyExc_ValueError,    e.what()); return nullptr;
        } catch (const std::out_of_range &e)     { PyErr_SetString(PyExc_IndexError,    e.what()); return nullptr;
        } catch (const std::range_error &e)      { PyErr_SetString(PyExc_ValueError,    e.what()); return nullptr;
        } catch (const std::exception &e)        { PyErr_SetString(PyExc_RuntimeError,  e.what()); return nullptr;
        } catch (...) {
            PyErr_SetString(PyExc_RuntimeError, "Caught an unknown exception!");
            return nullptr;
        }

        if (result.ptr() == PYBIND11_TRY_NEXT_OVERLOAD) {
            std::string msg = "Incompatible function arguments. The "
                              "following argument types are supported:\n";
            int ctr = 0;
            for (detail::function_record *it2 = overloads; it2 != nullptr; it2 = it2->next) {
                msg += "    "+ std::to_string(++ctr) + ". ";
                msg += it2->signature;
                msg += "\n";
            }
425
426
427
428
429
430
431
432
            msg += "    Invoked with: ";
            tuple args_(args, true);
            for( std::size_t ti = 0; ti != args_.size(); ++ti)
            {
                msg += static_cast<std::string>(static_cast<object>(args_[ti]).str());
                if ((ti + 1) != args_.size() )
                    msg += ", ";
            }
Wenzel Jakob's avatar
Wenzel Jakob committed
433
434
435
436
437
438
439
440
441
442
            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) {
443
                /* When a constructor ran successfully, the corresponding
Wenzel Jakob's avatar
Wenzel Jakob committed
444
                   holder type (e.g. std::unique_ptr) must still be initialized. */
445
                PyObject *inst = PyTuple_GET_ITEM(args, 0);
Wenzel Jakob's avatar
Wenzel Jakob committed
446
447
448
449
450
451
                auto tinfo = detail::get_type_info(Py_TYPE(inst));
                tinfo->init_holder(inst, nullptr);
            }
            return result.ptr();
        }
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
452
453
};

454
/// Wrapper for Python extension modules
Wenzel Jakob's avatar
Wenzel Jakob committed
455
456
class module : public object {
public:
457
    PYBIND11_OBJECT_DEFAULT(module, object, PyModule_Check)
Wenzel Jakob's avatar
Wenzel Jakob committed
458
459

    module(const char *name, const char *doc = nullptr) {
460
#if PY_MAJOR_VERSION >= 3
Wenzel Jakob's avatar
Wenzel Jakob committed
461
462
463
464
465
466
467
        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);
468
469
470
#else
        m_ptr = Py_InitModule3(name, nullptr, doc);
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
471
        if (m_ptr == nullptr)
472
            pybind11_fail("Internal error in module::module()");
Wenzel Jakob's avatar
Wenzel Jakob committed
473
474
475
        inc_ref();
    }

476
    template <typename Func, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
477
    module &def(const char *name_, Func &&f, const Extra& ... extra) {
478
        cpp_function func(std::forward<Func>(f), name(name_),
479
                          sibling((handle) attr(name_)), scope(*this), extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
480
481
        /* PyModule_AddObject steals a reference to 'func' */
        PyModule_AddObject(ptr(), name_, func.inc_ref().ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
482
483
484
        return *this;
    }

485
    module def_submodule(const char *name, const char *doc = nullptr) {
Wenzel Jakob's avatar
Wenzel Jakob committed
486
487
488
        std::string full_name = std::string(PyModule_GetName(m_ptr))
            + std::string(".") + std::string(name);
        module result(PyImport_AddModule(full_name.c_str()), true);
489
        if (doc)
490
            result.attr("__doc__") = pybind11::str(doc);
Wenzel Jakob's avatar
Wenzel Jakob committed
491
492
493
        attr(name) = result;
        return result;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
494
495

    static module import(const char *name) {
496
497
        PyObject *obj = PyImport_ImportModule(name);
        if (!obj)
498
            pybind11_fail("Module \"" + std::string(name) + "\" not found!");
499
        return module(obj, false);
Wenzel Jakob's avatar
Wenzel Jakob committed
500
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
501
502
503
};

NAMESPACE_BEGIN(detail)
Wenzel Jakob's avatar
Wenzel Jakob committed
504
/// Generic support for creating new Python heap types
505
class generic_type : public object {
Wenzel Jakob's avatar
Wenzel Jakob committed
506
    template <typename type, typename holder_type> friend class class_;
Wenzel Jakob's avatar
Wenzel Jakob committed
507
public:
508
    PYBIND11_OBJECT_DEFAULT(generic_type, object, PyType_Check)
Wenzel Jakob's avatar
Wenzel Jakob committed
509
510
511
512
513
514
515
516
517
518
519
520
521
protected:
    void initialize(type_record *rec) {
        if (rec->base_type) {
            if (rec->base_handle)
                pybind11_fail("generic_type: specified base type multiple times!");
            rec->base_handle = detail::get_type_handle(*(rec->base_type));
            if (!rec->base_handle) {
                std::string tname(rec->base_type->name());
                detail::clean_type_id(tname);
                pybind11_fail("generic_type: type \"" + std::string(rec->name) +
                              "\" referenced unknown base type \"" + tname + "\"");
            }
        }
522
523

        object type_holder(PyType_Type.tp_alloc(&PyType_Type, 0), false);
Wenzel Jakob's avatar
Wenzel Jakob committed
524
        object name(PYBIND11_FROM_STRING(rec->name), false);
525
526
527
        auto type = (PyHeapTypeObject*) type_holder.ptr();

        if (!type_holder || !name)
528
            pybind11_fail("generic_type: unable to create type object!");
529
530
531
532
533

        /* Register supplemental type information in C++ dict */
        auto &internals = get_internals();
        detail::type_info *tinfo = new detail::type_info();
        tinfo->type = (PyTypeObject *) type;
Wenzel Jakob's avatar
Wenzel Jakob committed
534
535
        tinfo->type_size = rec->type_size;
        tinfo->init_holder = rec->init_holder;
536
        internals.registered_types_cpp[std::type_index(*(rec->type))] = tinfo;
537
538
        internals.registered_types_py[type] = tinfo;

539
540
541
542
543
544
        object scope_module;
        if (rec->scope) {
            scope_module = (object) rec->scope.attr("__module__");
            if (!scope_module)
                scope_module = (object) rec->scope.attr("__name__");
        }
545

Wenzel Jakob's avatar
Wenzel Jakob committed
546
547
        std::string full_name = (scope_module ? ((std::string) scope_module.str() + "." + rec->name)
                                              : std::string(rec->name));
548
549
        /* Basic type attributes */
        type->ht_type.tp_name = strdup(full_name.c_str());
Wenzel Jakob's avatar
Wenzel Jakob committed
550
551
552
        type->ht_type.tp_basicsize = rec->instance_size;
        type->ht_type.tp_base = (PyTypeObject *) rec->base_handle.ptr();
        rec->base_handle.inc_ref();
553
554
555

#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3
        /* Qualified names for Python >= 3.3 */
556
557
558
        object scope_qualname;
        if (rec->scope)
            scope_qualname = (object) rec->scope.attr("__qualname__");
559
560
561
562
563
564
565
        if (scope_qualname) {
            type->ht_qualname = PyUnicode_FromFormat(
                "%U.%U", scope_qualname.ptr(), name.ptr());
        } else {
            type->ht_qualname = name.ptr();
            name.inc_ref();
        }
566
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
567
        type->ht_name = name.release().ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
568

569
570
571
572
        /* 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
573

574
        /* Supported elementary operations */
Wenzel Jakob's avatar
Wenzel Jakob committed
575
576
        type->ht_type.tp_init = (initproc) init;
        type->ht_type.tp_new = (newfunc) new_instance;
Wenzel Jakob's avatar
Wenzel Jakob committed
577
        type->ht_type.tp_dealloc = rec->dealloc;
578
579

        /* Support weak references (needed for the keep_alive feature) */
580
        type->ht_type.tp_weaklistoffset = offsetof(instance_essentials<void>, weakrefs);
581
582
583

        /* Flags */
        type->ht_type.tp_flags |= Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HEAPTYPE;
584
585
586
#if PY_MAJOR_VERSION < 3
        type->ht_type.tp_flags |= Py_TPFLAGS_CHECKTYPES;
#endif
587
        type->ht_type.tp_flags &= ~Py_TPFLAGS_HAVE_GC;
588

Wenzel Jakob's avatar
Wenzel Jakob committed
589
        if (rec->doc) {
590
591
            /* Allocate memory for docstring (using PyObject_MALLOC, since
               Python will free this later on) */
Wenzel Jakob's avatar
Wenzel Jakob committed
592
            size_t size = strlen(rec->doc) + 1;
593
            type->ht_type.tp_doc = (char *) PyObject_MALLOC(size);
Wenzel Jakob's avatar
Wenzel Jakob committed
594
            memcpy((void *) type->ht_type.tp_doc, rec->doc, size);
Wenzel Jakob's avatar
Wenzel Jakob committed
595
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
596
597

        if (PyType_Ready(&type->ht_type) < 0)
598
            pybind11_fail("generic_type: PyType_Ready failed!");
599
600

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

602
        if (scope_module) // Needed by pydoc
Wenzel Jakob's avatar
Wenzel Jakob committed
603
            attr("__module__") = scope_module;
Wenzel Jakob's avatar
Wenzel Jakob committed
604

605
        /* Register type with the parent scope */
606
607
        if (rec->scope)
            rec->scope.attr(handle(type->ht_name)) = *this;
Wenzel Jakob's avatar
Wenzel Jakob committed
608

609
        type_holder.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
610
611
    }

612
    /// Allocate a metaclass on demand (for static properties)
Wenzel Jakob's avatar
Wenzel Jakob committed
613
614
    handle metaclass() {
        auto &ht_type = ((PyHeapTypeObject *) m_ptr)->ht_type;
615
        auto &ob_type = PYBIND11_OB_TYPE(ht_type);
616

Wenzel Jakob's avatar
Wenzel Jakob committed
617
        if (ob_type == &PyType_Type) {
618
619
620
621
            std::string name_ = std::string(ht_type.tp_name) + "__Meta";
            object type_holder(PyType_Type.tp_alloc(&PyType_Type, 0), false);
            object name(PYBIND11_FROM_STRING(name_.c_str()), false);
            if (!type_holder || !name)
622
                pybind11_fail("generic_type::metaclass(): unable to create type object!");
623
624

            auto type = (PyHeapTypeObject*) type_holder.ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
625
626
627
628
629
630
            type->ht_name = name.release().ptr();
#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3
            /* Qualified names for Python >= 3.3 */
            type->ht_qualname = PyUnicode_FromFormat(
                "%U__Meta", ((object) attr("__qualname__")).ptr());
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
631
            type->ht_type.tp_name = strdup(name_.c_str());
Wenzel Jakob's avatar
Wenzel Jakob committed
632
            type->ht_type.tp_base = ob_type;
633
634
635
            type->ht_type.tp_flags |= (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE) &
                                      ~Py_TPFLAGS_HAVE_GC;

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

Wenzel Jakob's avatar
Wenzel Jakob committed
639
            ob_type = (PyTypeObject *) type_holder.release().ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
640
641
642
643
644
645
646
647
648
649
650
        }
        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 *) {
651
652
653
        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
654
655
656
657
658
659
660
661
662
663
664
665
666
667
        self->owned = true;
        self->parent = nullptr;
        self->constructed = false;
        detail::get_internals().registered_instances[self->value] = (PyObject *) self;
        return (PyObject *) self;
    }

    static void dealloc(instance<void> *self) {
        if (self->value) {
            bool dont_cache = self->parent && ((instance<void> *) self->parent)->value == self->value;
            if (!dont_cache) { // avoid an issue with internal references matching their parent's address
                auto &registered_instances = detail::get_internals().registered_instances;
                auto it = registered_instances.find(self->value);
                if (it == registered_instances.end())
668
                    pybind11_fail("generic_type::dealloc(): Tried to deallocate unregistered instance!");
Wenzel Jakob's avatar
Wenzel Jakob committed
669
670
671
                registered_instances.erase(it);
            }
            Py_XDECREF(self->parent);
672
673
            if (self->weakrefs)
                PyObject_ClearWeakRefs((PyObject *) self);
Wenzel Jakob's avatar
Wenzel Jakob committed
674
675
676
677
        }
        Py_TYPE(self)->tp_free((PyObject*) self);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
678
679
680
    void install_buffer_funcs(
            buffer_info *(*get_buffer)(PyObject *, void *),
            void *get_buffer_data) {
Wenzel Jakob's avatar
Wenzel Jakob committed
681
682
        PyHeapTypeObject *type = (PyHeapTypeObject*) m_ptr;
        type->ht_type.tp_as_buffer = &type->as_buffer;
683
684
685
#if PY_MAJOR_VERSION < 3
        type->ht_type.tp_flags |= Py_TPFLAGS_HAVE_NEWBUFFER;
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
686
687
        type->as_buffer.bf_getbuffer = getbuffer;
        type->as_buffer.bf_releasebuffer = releasebuffer;
688
689
690
        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
691
692
693
    }

    static int getbuffer(PyObject *obj, Py_buffer *view, int flags) {
694
695
696
        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
697
698
699
            return -1;
        }
        memset(view, 0, sizeof(Py_buffer));
700
        buffer_info *info = tinfo->get_buffer(obj, tinfo->get_buffer_data);
Wenzel Jakob's avatar
Wenzel Jakob committed
701
702
703
704
705
706
707
708
709
710
711
712
        view->obj = obj;
        view->ndim = 1;
        view->internal = info;
        view->buf = info->ptr;
        view->itemsize = info->itemsize;
        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) {
            view->ndim = info->ndim;
713
714
            view->strides = (ssize_t *) &info->strides[0];
            view->shape = (ssize_t *) &info->shape[0];
Wenzel Jakob's avatar
Wenzel Jakob committed
715
716
717
718
719
720
721
722
723
        }
        Py_INCREF(view->obj);
        return 0;
    }

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

Wenzel Jakob's avatar
Wenzel Jakob committed
724
725
template <typename type, typename holder_type = std::unique_ptr<type>>
class class_ : public detail::generic_type {
Wenzel Jakob's avatar
Wenzel Jakob committed
726
727
728
public:
    typedef detail::instance<type, holder_type> instance_type;

729
    PYBIND11_OBJECT(class_, detail::generic_type, PyType_Check)
Wenzel Jakob's avatar
Wenzel Jakob committed
730

Wenzel Jakob's avatar
Wenzel Jakob committed
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
    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);
        record.type_size = sizeof(type);
        record.instance_size = sizeof(instance_type);
        record.init_holder = init_holder;
        record.dealloc = dealloc;

        /* Process optional arguments, if any */
        detail::process_attributes<Extra...>::init(extra..., &record);

        detail::generic_type::initialize(&record);
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
747

748
    template <typename Func, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
749
    class_ &def(const char *name_, Func&& f, const Extra&... extra) {
750
        cpp_function cf(std::forward<Func>(f), name(name_),
Wenzel Jakob's avatar
Wenzel Jakob committed
751
752
                        sibling(attr(name_)), is_method(*this),
                        extra...);
753
        attr(cf.name()) = cf;
Wenzel Jakob's avatar
Wenzel Jakob committed
754
755
756
        return *this;
    }

757
    template <typename Func, typename... Extra> class_ &
Wenzel Jakob's avatar
Wenzel Jakob committed
758
    def_static(const char *name_, Func f, const Extra&... extra) {
759
        cpp_function cf(std::forward<Func>(f), name(name_),
760
                        sibling(attr(name_)), scope(*this), extra...);
761
        attr(cf.name()) = cf;
Wenzel Jakob's avatar
Wenzel Jakob committed
762
763
764
        return *this;
    }

765
    template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
766
    class_ &def(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
Wenzel Jakob's avatar
Wenzel Jakob committed
767
        op.template execute<type>(*this, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
768
769
770
        return *this;
    }

771
    template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
772
    class_ & def_cast(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
Wenzel Jakob's avatar
Wenzel Jakob committed
773
        op.template execute_cast<type>(*this, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
774
775
776
        return *this;
    }

777
    template <typename... Args, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
778
    class_ &def(const detail::init<Args...> &init, const Extra&... extra) {
Wenzel Jakob's avatar
Wenzel Jakob committed
779
        init.template execute<type>(*this, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
780
781
782
        return *this;
    }

783
    template <typename Func> class_& def_buffer(Func &&func) {
Wenzel Jakob's avatar
Wenzel Jakob committed
784
785
786
        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
787
788
789
            detail::type_caster<type> caster;
            if (!caster.load(obj, false))
                return nullptr;
Wenzel Jakob's avatar
Wenzel Jakob committed
790
791
            return new buffer_info(((capture *) ptr)->func(caster));
        }, ptr);
Wenzel Jakob's avatar
Wenzel Jakob committed
792
793
794
        return *this;
    }

795
    template <typename C, typename D, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
796
    class_ &def_readwrite(const char *name, D C::*pm, const Extra&... extra) {
797
798
799
        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
800
801
802
        return *this;
    }

803
    template <typename C, typename D, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
804
    class_ &def_readonly(const char *name, const D C::*pm, const Extra& ...extra) {
805
806
        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
807
808
809
        return *this;
    }

810
    template <typename D, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
811
    class_ &def_readwrite_static(const char *name, D *pm, const Extra& ...extra) {
812
813
814
        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
815
816
817
        return *this;
    }

818
    template <typename D, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
819
    class_ &def_readonly_static(const char *name, const D *pm, const Extra& ...extra) {
820
821
        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
822
823
824
        return *this;
    }

825
826
827
    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
828
829
830
        return *this;
    }

831
832
833
    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
834
835
836
        return *this;
    }

837
838
    template <typename... Extra>
    class_ &def_property(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
839
        return def_property_static(name, fget, fset, is_method(*this), extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
840
841
    }

842
843
844
845
846
847
848
    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);
        detail::process_attributes<Extra...>::init(extra..., rec_fget);
        if (rec_fset)
            detail::process_attributes<Extra...>::init(extra..., rec_fset);
        pybind11::str doc_obj = pybind11::str(rec_fget->doc ? rec_fget->doc : "");
Wenzel Jakob's avatar
Wenzel Jakob committed
849
        object property(
Wenzel Jakob's avatar
Wenzel Jakob committed
850
851
            PyObject_CallFunctionObjArgs((PyObject *) &PyProperty_Type, fget.ptr() ? fget.ptr() : Py_None,
                                         fset.ptr() ? fset.ptr() : Py_None, Py_None, doc_obj.ptr(), nullptr), false);
852
853
854
855
        if (rec_fget->class_)
            attr(name) = property;
        else
            metaclass().attr(name) = property;
Wenzel Jakob's avatar
Wenzel Jakob committed
856
857
        return *this;
    }
858
859

    template <typename target> class_ alias() {
860
        auto &instances = pybind11::detail::get_internals().registered_types_cpp;
861
        instances[std::type_index(typeid(target))] = instances[std::type_index(typeid(type))];
862
863
        return *this;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
864
private:
865
866
867
    /// 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 */) {
868
        try {
869
            new (&inst->holder) holder_type(std::static_pointer_cast<type>(inst->value->shared_from_this()));
870
871
872
        } catch (const std::bad_weak_ptr &) {
            new (&inst->holder) holder_type(inst->value);
        }
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
    }

    /// Initialize holder object, variant 2: try to construct from existing holder object, if possible
    template <typename T = holder_type,
              typename std::enable_if<std::is_copy_constructible<T>::value, int>::type = 0>
    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,
              typename std::enable_if<!std::is_copy_constructible<T>::value, int>::type = 0>
    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);
896
897
898
        inst->constructed = true;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
899
900
901
902
903
904
905
906
    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);
        }
907
        generic_type::dealloc((detail::instance<void> *) inst);
Wenzel Jakob's avatar
Wenzel Jakob committed
908
    }
909
910
911
912
913
914

    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
915
916
917
918
919
};

/// Binds C++ enumerations and enumeration classes to Python
template <typename Type> class enum_ : public class_<Type> {
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
920
921
922
    template <typename... Extra>
    enum_(const handle &scope, const char *name, const Extra&... extra)
      : class_<Type>(scope, name, extra...), m_parent(scope) {
Wenzel Jakob's avatar
Wenzel Jakob committed
923
        auto entries = new std::unordered_map<int, const char *>();
924
        this->def("__repr__", [name, entries](Type value) -> std::string {
Wenzel Jakob's avatar
Wenzel Jakob committed
925
            auto it = entries->find((int) value);
Wenzel Jakob's avatar
Wenzel Jakob committed
926
927
928
929
            return std::string(name) + "." +
                ((it == entries->end()) ? std::string("???")
                                        : std::string(it->second));
        });
930
931
        this->def("__init__", [](Type& value, int i) { value = (Type)i; });
        this->def("__init__", [](Type& value, int i) { new (&value) Type((Type) i); });
932
        this->def("__int__", [](Type value) { return (int) value; });
933
934
        this->def("__eq__", [](const Type &value, Type *value2) { return value2 && value == *value2; });
        this->def("__ne__", [](const Type &value, Type *value2) { return !value2 || value != *value2; });
935
        this->def("__hash__", [](const Type &value) { return (int) value; });
Wenzel Jakob's avatar
Wenzel Jakob committed
936
937
938
939
940
941
942
        m_entries = entries;
    }

    /// Export enumeration entries into the parent scope
    void export_values() {
        PyObject *dict = ((PyTypeObject *) this->m_ptr)->tp_dict;
        PyObject *key, *value;
943
        ssize_t pos = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
944
945
946
947
948
949
950
        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) {
951
        this->attr(name) = pybind11::cast(value, return_value_policy::copy);
Wenzel Jakob's avatar
Wenzel Jakob committed
952
953
954
955
956
        (*m_entries)[(int) value] = name;
        return *this;
    }
private:
    std::unordered_map<int, const char *> *m_entries;
Wenzel Jakob's avatar
Wenzel Jakob committed
957
    handle m_parent;
Wenzel Jakob's avatar
Wenzel Jakob committed
958
959
960
};

NAMESPACE_BEGIN(detail)
961
template <typename... Args> struct init {
Wenzel Jakob's avatar
Wenzel Jakob committed
962
    template <typename Base, typename Holder, typename... Extra> void execute(pybind11::class_<Base, Holder> &class_, const Extra&... extra) const {
Wenzel Jakob's avatar
Wenzel Jakob committed
963
        /// Function which calls a specific C++ in-place constructor
Wenzel Jakob's avatar
Wenzel Jakob committed
964
        class_.def("__init__", [](Base *instance, Args... args) { new (instance) Base(args...); }, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
965
966
    }
};
967

Wenzel Jakob's avatar
Wenzel Jakob committed
968
PYBIND11_NOINLINE inline void keep_alive_impl(int Nurse, int Patient, handle args, handle ret) {
969
    /* Clever approach based on weak references taken from Boost.Python */
Wenzel Jakob's avatar
Wenzel Jakob committed
970
971
    handle nurse  (Nurse   > 0 ? PyTuple_GetItem(args.ptr(), Nurse   - 1) : ret.ptr());
    handle patient(Patient > 0 ? PyTuple_GetItem(args.ptr(), Patient - 1) : ret.ptr());
972

973
    if (!nurse || !patient)
974
        pybind11_fail("Could not activate keep_alive!");
975

976
977
978
    if (patient.ptr() == Py_None)
        return; /* Nothing to keep alive */

979
    cpp_function disable_lifesupport(
980
        [patient](handle weakref) { patient.dec_ref(); weakref.dec_ref(); });
981

982
    weakref wr(nurse, disable_lifesupport);
983

984
985
    patient.inc_ref(); /* reference patient and leak the weak reference */
    (void) wr.release();
986
987
}

988
989
template <typename Iterator> struct iterator_state { Iterator it, end; };

Wenzel Jakob's avatar
Wenzel Jakob committed
990
991
NAMESPACE_END(detail)

992
template <typename... Args> detail::init<Args...> init() { return detail::init<Args...>(); }
Wenzel Jakob's avatar
Wenzel Jakob committed
993

994
995
996
997
998
999
template <typename Iterator, typename... Extra> iterator make_iterator(Iterator first, Iterator last, Extra&&... extra) {
    typedef detail::iterator_state<Iterator> state;

    if (!detail::get_type_info(typeid(state))) {
        class_<state>(handle(), "")
            .def("__iter__", [](state &s) -> state& { return s; })
1000
            .def("__next__", [](state &s) -> decltype(*std::declval<Iterator>()) {
1001
1002
1003
1004
1005
1006
1007
1008
1009
                if (s.it == s.end)
                    throw stop_iteration();
                return *s.it++;
            }, return_value_policy::reference_internal, std::forward<Extra>(extra)...);
    }

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

1010
1011
1012
1013
template <typename Type, typename... Extra> iterator make_iterator(Type &value, Extra&&... extra) {
    return make_iterator(std::begin(value), std::end(value), extra...);
}

Wenzel Jakob's avatar
Wenzel Jakob committed
1014
template <typename InputType, typename OutputType> void implicitly_convertible() {
1015
    auto implicit_caster = [](PyObject *obj, PyTypeObject *type) -> PyObject * {
Wenzel Jakob's avatar
Wenzel Jakob committed
1016
1017
1018
1019
1020
1021
1022
1023
1024
        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;
    };
1025
1026
    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
1027
    if (it == registered_types.end())
1028
        pybind11_fail("implicitly_convertible: Unable to find type " + type_id<OutputType>());
1029
    ((detail::type_info *) it->second)->implicit_conversions.push_back(implicit_caster);
Wenzel Jakob's avatar
Wenzel Jakob committed
1030
1031
}

1032
#if defined(WITH_THREAD)
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046

/* 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
1047
1048
1049
 *    thread would otherwise constantly construct and destroy thread state data
 *    structures.
 */
Wenzel Jakob's avatar
Wenzel Jakob committed
1050
1051
1052

class gil_scoped_acquire {
public:
1053
    PYBIND11_NOINLINE gil_scoped_acquire() {
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
        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;
1064
1065
1066
            #if PY_MAJOR_VERSION < 3
                PyThread_delete_key_value(internals.tstate);
            #endif
1067
1068
            PyThread_set_key_value(internals.tstate, tstate);
        } else {
1069
            release = detail::get_thread_state_unchecked() != tstate;
1070
1071
1072
1073
        }

        if (release) {
            /* Work around an annoying assertion in PyThreadState_Swap */
1074
1075
1076
1077
            #if defined(Py_DEBUG)
                PyInterpreterState *interp = tstate->interp;
                tstate->interp = nullptr;
            #endif
1078
            PyEval_AcquireThread(tstate);
1079
1080
1081
            #if defined(Py_DEBUG)
                tstate->interp = interp;
            #endif
1082
1083
1084
1085
1086
1087
1088
1089
1090
        }

        inc_ref();
    }

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

1091
    PYBIND11_NOINLINE void dec_ref() {
1092
1093
        --tstate->gilstate_counter;
        #if !defined(NDEBUG)
1094
            if (detail::get_thread_state_unchecked() != tstate)
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
                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();
1106
            PyThread_delete_key_value(detail::get_internals().tstate);
1107
1108
1109
1110
            release = false;
        }
    }

1111
    PYBIND11_NOINLINE ~gil_scoped_acquire() {
1112
1113
1114
1115
1116
1117
1118
        dec_ref();
        if (release)
           PyEval_SaveThread();
    }
private:
    PyThreadState *tstate = nullptr;
    bool release = true;
Wenzel Jakob's avatar
Wenzel Jakob committed
1119
1120
1121
1122
};

class gil_scoped_release {
public:
1123
1124
    gil_scoped_release(bool disassoc = false) : disassoc(disassoc) {
        tstate = PyEval_SaveThread();
1125
1126
1127
1128
1129
1130
1131
1132
        if (disassoc) {
            int key = detail::get_internals().tstate;
            #if PY_MAJOR_VERSION < 3
                PyThread_delete_key_value(key);
            #else
                PyThread_set_key_value(key, nullptr);
            #endif
        }
1133
1134
1135
1136
1137
    }
    ~gil_scoped_release() {
        if (!tstate)
            return;
        PyEval_RestoreThread(tstate);
1138
1139
1140
1141
1142
1143
1144
        if (disassoc) {
            int key = detail::get_internals().tstate;
            #if PY_MAJOR_VERSION < 3
                PyThread_delete_key_value(key);
            #endif
            PyThread_set_key_value(key, tstate);
        }
1145
1146
1147
1148
    }
private:
    PyThreadState *tstate;
    bool disassoc;
Wenzel Jakob's avatar
Wenzel Jakob committed
1149
};
1150
1151
1152
#else
class gil_scoped_acquire { };
class gil_scoped_release { };
1153
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
1154

1155
1156
inline function get_overload(const void *this_ptr, const char *name)  {
    handle py_object = detail::get_object_handle(this_ptr);
1157
1158
    if (!py_object)
        return function();
1159
1160
1161
    handle type = py_object.get_type();
    auto key = std::make_pair(type.ptr(), name);

1162
1163
    /* Cache functions that aren't overloaded in Python to avoid
       many costly Python dictionary lookups below */
1164
1165
1166
1167
1168
1169
1170
1171
1172
    auto &cache = detail::get_internals().inactive_overload_cache;
    if (cache.find(key) != cache.end())
        return function();

    function overload = (function) py_object.attr(name);
    if (overload.is_cpp_function()) {
        cache.insert(key);
        return function();
    }
1173

1174
    /* Don't call dispatch code if invoked from overridden function */
1175
    PyFrameObject *frame = PyThreadState_Get()->frame;
1176
    if (frame && (std::string) pybind11::handle(frame->f_code->co_name).str() == name &&
1177
1178
1179
1180
1181
1182
1183
        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();
    }
1184
1185
1186
    return overload;
}

1187
#define PYBIND11_OVERLOAD_INT(ret_type, class_name, name, ...) { \
1188
1189
        pybind11::gil_scoped_acquire gil; \
        pybind11::function overload = pybind11::get_overload(this, #name); \
1190
        if (overload) \
1191
            return overload(__VA_ARGS__).template cast<ret_type>();  }
1192

1193
1194
#define PYBIND11_OVERLOAD(ret_type, class_name, name, ...) \
    PYBIND11_OVERLOAD_INT(ret_type, class_name, name, __VA_ARGS__) \
1195
1196
    return class_name::name(__VA_ARGS__)

1197
1198
#define PYBIND11_OVERLOAD_PURE(ret_type, class_name, name, ...) \
    PYBIND11_OVERLOAD_INT(ret_type, class_name, name, __VA_ARGS__) \
1199
    pybind11::pybind11_fail("Tried to call pure virtual function \"" #name "\"");
1200

1201
NAMESPACE_END(pybind11)
Wenzel Jakob's avatar
Wenzel Jakob committed
1202
1203

#if defined(_MSC_VER)
Wenzel Jakob's avatar
Wenzel Jakob committed
1204
#  pragma warning(pop)
Ben Pritchard's avatar
Ben Pritchard committed
1205
1206
#elif defined(__ICC) || defined(__INTEL_COMPILER)
#  pragma warning(pop)
1207
#elif defined(__GNUG__) && !defined(__clang__)
Wenzel Jakob's avatar
Wenzel Jakob committed
1208
#  pragma GCC diagnostic pop
Wenzel Jakob's avatar
Wenzel Jakob committed
1209
#endif