pybind11.h 49.2 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
#endif

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

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

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

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

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

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

            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
254
            if (!m_ptr)
255
                pybind11_fail("cpp_function::cpp_function(): Could not allocate function object");
Wenzel Jakob's avatar
Wenzel Jakob committed
256
        } else {
257
            /* Append at the end of the overload chain */
Wenzel Jakob's avatar
Wenzel Jakob committed
258
            m_ptr = rec->sibling.ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
259
            inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
260
261
262
263
            chain_start = chain;
            while (chain->next)
                chain = chain->next;
            chain->next = rec;
Wenzel Jakob's avatar
Wenzel Jakob committed
264
        }
265

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

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

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

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

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

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

                try {
387
388
389
                    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
390
                } catch (cast_error &) {
391
392
                    result = PYBIND11_TRY_NEXT_OVERLOAD;
                }
Wenzel Jakob's avatar
Wenzel Jakob committed
393
394
395
396
397
398

                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;
399
        } catch (const value_error &e)           { PyErr_SetString(PyExc_ValueError,    e.what()); return nullptr;
Wenzel Jakob's avatar
Wenzel Jakob committed
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
        } 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";
            }
            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) {
432
                /* When a constructor ran successfully, the corresponding
Wenzel Jakob's avatar
Wenzel Jakob committed
433
                   holder type (e.g. std::unique_ptr) must still be initialized. */
434
                PyObject *inst = PyTuple_GET_ITEM(args, 0);
Wenzel Jakob's avatar
Wenzel Jakob committed
435
436
437
438
439
440
                auto tinfo = detail::get_type_info(Py_TYPE(inst));
                tinfo->init_holder(inst, nullptr);
            }
            return result.ptr();
        }
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
441
442
};

443
/// Wrapper for Python extension modules
Wenzel Jakob's avatar
Wenzel Jakob committed
444
445
class module : public object {
public:
446
    PYBIND11_OBJECT_DEFAULT(module, object, PyModule_Check)
Wenzel Jakob's avatar
Wenzel Jakob committed
447
448

    module(const char *name, const char *doc = nullptr) {
449
#if PY_MAJOR_VERSION >= 3
Wenzel Jakob's avatar
Wenzel Jakob committed
450
451
452
453
454
455
456
        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);
457
458
459
#else
        m_ptr = Py_InitModule3(name, nullptr, doc);
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
460
        if (m_ptr == nullptr)
461
            pybind11_fail("Internal error in module::module()");
Wenzel Jakob's avatar
Wenzel Jakob committed
462
463
464
        inc_ref();
    }

465
    template <typename Func, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
466
    module &def(const char *name_, Func &&f, const Extra& ... extra) {
467
        cpp_function func(std::forward<Func>(f), name(name_),
468
                          sibling((handle) attr(name_)), scope(*this), extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
469
470
        /* PyModule_AddObject steals a reference to 'func' */
        PyModule_AddObject(ptr(), name_, func.inc_ref().ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
471
472
473
        return *this;
    }

474
    module def_submodule(const char *name, const char *doc = nullptr) {
Wenzel Jakob's avatar
Wenzel Jakob committed
475
476
477
        std::string full_name = std::string(PyModule_GetName(m_ptr))
            + std::string(".") + std::string(name);
        module result(PyImport_AddModule(full_name.c_str()), true);
478
        if (doc)
479
            result.attr("__doc__") = pybind11::str(doc);
Wenzel Jakob's avatar
Wenzel Jakob committed
480
481
482
        attr(name) = result;
        return result;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
483
484

    static module import(const char *name) {
485
486
        PyObject *obj = PyImport_ImportModule(name);
        if (!obj)
487
            pybind11_fail("Module \"" + std::string(name) + "\" not found!");
488
        return module(obj, false);
Wenzel Jakob's avatar
Wenzel Jakob committed
489
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
490
491
492
};

NAMESPACE_BEGIN(detail)
Wenzel Jakob's avatar
Wenzel Jakob committed
493
/// Generic support for creating new Python heap types
494
class generic_type : public object {
Wenzel Jakob's avatar
Wenzel Jakob committed
495
    template <typename type, typename holder_type> friend class class_;
Wenzel Jakob's avatar
Wenzel Jakob committed
496
public:
497
    PYBIND11_OBJECT_DEFAULT(generic_type, object, PyType_Check)
Wenzel Jakob's avatar
Wenzel Jakob committed
498
499
500
501
502
503
504
505
506
507
508
509
510
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 + "\"");
            }
        }
511
512

        object type_holder(PyType_Type.tp_alloc(&PyType_Type, 0), false);
Wenzel Jakob's avatar
Wenzel Jakob committed
513
        object name(PYBIND11_FROM_STRING(rec->name), false);
514
515
516
        auto type = (PyHeapTypeObject*) type_holder.ptr();

        if (!type_holder || !name)
517
            pybind11_fail("generic_type: unable to create type object!");
518
519
520
521
522

        /* 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
523
524
        tinfo->type_size = rec->type_size;
        tinfo->init_holder = rec->init_holder;
525
        internals.registered_types_cpp[std::type_index(*(rec->type))] = tinfo;
526
527
        internals.registered_types_py[type] = tinfo;

528
529
530
531
532
533
        object scope_module;
        if (rec->scope) {
            scope_module = (object) rec->scope.attr("__module__");
            if (!scope_module)
                scope_module = (object) rec->scope.attr("__name__");
        }
534

Wenzel Jakob's avatar
Wenzel Jakob committed
535
536
        std::string full_name = (scope_module ? ((std::string) scope_module.str() + "." + rec->name)
                                              : std::string(rec->name));
537
538
        /* Basic type attributes */
        type->ht_type.tp_name = strdup(full_name.c_str());
Wenzel Jakob's avatar
Wenzel Jakob committed
539
540
541
        type->ht_type.tp_basicsize = rec->instance_size;
        type->ht_type.tp_base = (PyTypeObject *) rec->base_handle.ptr();
        rec->base_handle.inc_ref();
542
543
544

#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3
        /* Qualified names for Python >= 3.3 */
545
546
547
        object scope_qualname;
        if (rec->scope)
            scope_qualname = (object) rec->scope.attr("__qualname__");
548
549
550
551
552
553
554
        if (scope_qualname) {
            type->ht_qualname = PyUnicode_FromFormat(
                "%U.%U", scope_qualname.ptr(), name.ptr());
        } else {
            type->ht_qualname = name.ptr();
            name.inc_ref();
        }
555
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
556
        type->ht_name = name.release().ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
557

558
559
560
561
        /* 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
562

563
        /* Supported elementary operations */
Wenzel Jakob's avatar
Wenzel Jakob committed
564
565
        type->ht_type.tp_init = (initproc) init;
        type->ht_type.tp_new = (newfunc) new_instance;
Wenzel Jakob's avatar
Wenzel Jakob committed
566
        type->ht_type.tp_dealloc = rec->dealloc;
567
568

        /* Support weak references (needed for the keep_alive feature) */
569
        type->ht_type.tp_weaklistoffset = offsetof(instance_essentials<void>, weakrefs);
570
571
572

        /* Flags */
        type->ht_type.tp_flags |= Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HEAPTYPE;
573
574
575
#if PY_MAJOR_VERSION < 3
        type->ht_type.tp_flags |= Py_TPFLAGS_CHECKTYPES;
#endif
576
        type->ht_type.tp_flags &= ~Py_TPFLAGS_HAVE_GC;
577

Wenzel Jakob's avatar
Wenzel Jakob committed
578
        if (rec->doc) {
579
580
            /* Allocate memory for docstring (using PyObject_MALLOC, since
               Python will free this later on) */
Wenzel Jakob's avatar
Wenzel Jakob committed
581
            size_t size = strlen(rec->doc) + 1;
582
            type->ht_type.tp_doc = (char *) PyObject_MALLOC(size);
Wenzel Jakob's avatar
Wenzel Jakob committed
583
            memcpy((void *) type->ht_type.tp_doc, rec->doc, size);
Wenzel Jakob's avatar
Wenzel Jakob committed
584
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
585
586

        if (PyType_Ready(&type->ht_type) < 0)
587
            pybind11_fail("generic_type: PyType_Ready failed!");
588
589

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

591
        if (scope_module) // Needed by pydoc
Wenzel Jakob's avatar
Wenzel Jakob committed
592
            attr("__module__") = scope_module;
Wenzel Jakob's avatar
Wenzel Jakob committed
593

594
        /* Register type with the parent scope */
595
596
        if (rec->scope)
            rec->scope.attr(handle(type->ht_name)) = *this;
Wenzel Jakob's avatar
Wenzel Jakob committed
597

598
        type_holder.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
599
600
    }

601
    /// Allocate a metaclass on demand (for static properties)
Wenzel Jakob's avatar
Wenzel Jakob committed
602
603
    handle metaclass() {
        auto &ht_type = ((PyHeapTypeObject *) m_ptr)->ht_type;
604
        auto &ob_type = PYBIND11_OB_TYPE(ht_type);
605

Wenzel Jakob's avatar
Wenzel Jakob committed
606
        if (ob_type == &PyType_Type) {
607
608
609
610
            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)
611
                pybind11_fail("generic_type::metaclass(): unable to create type object!");
612
613

            auto type = (PyHeapTypeObject*) type_holder.ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
614
615
616
617
618
619
            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
620
            type->ht_type.tp_name = strdup(name_.c_str());
Wenzel Jakob's avatar
Wenzel Jakob committed
621
            type->ht_type.tp_base = ob_type;
622
623
624
            type->ht_type.tp_flags |= (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE) &
                                      ~Py_TPFLAGS_HAVE_GC;

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

Wenzel Jakob's avatar
Wenzel Jakob committed
628
            ob_type = (PyTypeObject *) type_holder.release().ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
629
630
631
632
633
634
635
636
637
638
639
        }
        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 *) {
640
641
642
        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
643
644
645
646
647
648
649
650
651
652
653
654
655
656
        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())
657
                    pybind11_fail("generic_type::dealloc(): Tried to deallocate unregistered instance!");
Wenzel Jakob's avatar
Wenzel Jakob committed
658
659
660
                registered_instances.erase(it);
            }
            Py_XDECREF(self->parent);
661
662
            if (self->weakrefs)
                PyObject_ClearWeakRefs((PyObject *) self);
Wenzel Jakob's avatar
Wenzel Jakob committed
663
664
665
666
        }
        Py_TYPE(self)->tp_free((PyObject*) self);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
667
668
669
    void install_buffer_funcs(
            buffer_info *(*get_buffer)(PyObject *, void *),
            void *get_buffer_data) {
Wenzel Jakob's avatar
Wenzel Jakob committed
670
671
        PyHeapTypeObject *type = (PyHeapTypeObject*) m_ptr;
        type->ht_type.tp_as_buffer = &type->as_buffer;
672
673
674
#if PY_MAJOR_VERSION < 3
        type->ht_type.tp_flags |= Py_TPFLAGS_HAVE_NEWBUFFER;
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
675
676
        type->as_buffer.bf_getbuffer = getbuffer;
        type->as_buffer.bf_releasebuffer = releasebuffer;
677
678
679
        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
680
681
682
    }

    static int getbuffer(PyObject *obj, Py_buffer *view, int flags) {
683
684
685
        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
686
687
688
            return -1;
        }
        memset(view, 0, sizeof(Py_buffer));
689
        buffer_info *info = tinfo->get_buffer(obj, tinfo->get_buffer_data);
Wenzel Jakob's avatar
Wenzel Jakob committed
690
691
692
693
694
695
696
697
698
699
700
701
        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;
702
703
            view->strides = (ssize_t *) &info->strides[0];
            view->shape = (ssize_t *) &info->shape[0];
Wenzel Jakob's avatar
Wenzel Jakob committed
704
705
706
707
708
709
710
711
712
        }
        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
713
714
template <typename type, typename holder_type = std::unique_ptr<type>>
class class_ : public detail::generic_type {
Wenzel Jakob's avatar
Wenzel Jakob committed
715
716
717
public:
    typedef detail::instance<type, holder_type> instance_type;

718
    PYBIND11_OBJECT(class_, detail::generic_type, PyType_Check)
Wenzel Jakob's avatar
Wenzel Jakob committed
719

Wenzel Jakob's avatar
Wenzel Jakob committed
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
    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
736

737
    template <typename Func, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
738
    class_ &def(const char *name_, Func&& f, const Extra&... extra) {
739
        cpp_function cf(std::forward<Func>(f), name(name_),
Wenzel Jakob's avatar
Wenzel Jakob committed
740
741
                        sibling(attr(name_)), is_method(*this),
                        extra...);
742
        attr(cf.name()) = cf;
Wenzel Jakob's avatar
Wenzel Jakob committed
743
744
745
        return *this;
    }

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

754
    template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
755
    class_ &def(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
Wenzel Jakob's avatar
Wenzel Jakob committed
756
        op.template execute<type>(*this, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
757
758
759
        return *this;
    }

760
    template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
761
    class_ & def_cast(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
Wenzel Jakob's avatar
Wenzel Jakob committed
762
        op.template execute_cast<type>(*this, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
763
764
765
        return *this;
    }

766
    template <typename... Args, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
767
    class_ &def(const detail::init<Args...> &init, const Extra&... extra) {
Wenzel Jakob's avatar
Wenzel Jakob committed
768
        init.template execute<type>(*this, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
769
770
771
        return *this;
    }

772
    template <typename Func> class_& def_buffer(Func &&func) {
Wenzel Jakob's avatar
Wenzel Jakob committed
773
774
775
        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
776
777
778
            detail::type_caster<type> caster;
            if (!caster.load(obj, false))
                return nullptr;
Wenzel Jakob's avatar
Wenzel Jakob committed
779
780
            return new buffer_info(((capture *) ptr)->func(caster));
        }, ptr);
Wenzel Jakob's avatar
Wenzel Jakob committed
781
782
783
        return *this;
    }

784
    template <typename C, typename D, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
785
    class_ &def_readwrite(const char *name, D C::*pm, const Extra&... extra) {
786
787
788
        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
789
790
791
        return *this;
    }

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

799
    template <typename D, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
800
    class_ &def_readwrite_static(const char *name, D *pm, const Extra& ...extra) {
801
802
803
        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
804
805
806
        return *this;
    }

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

814
815
816
    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
817
818
819
        return *this;
    }

820
821
822
    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
823
824
825
        return *this;
    }

826
827
    template <typename... Extra>
    class_ &def_property(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
828
        return def_property_static(name, fget, fset, is_method(*this), extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
829
830
    }

831
832
833
834
835
836
837
    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
838
        object property(
Wenzel Jakob's avatar
Wenzel Jakob committed
839
840
            PyObject_CallFunctionObjArgs((PyObject *) &PyProperty_Type, fget.ptr() ? fget.ptr() : Py_None,
                                         fset.ptr() ? fset.ptr() : Py_None, Py_None, doc_obj.ptr(), nullptr), false);
841
842
843
844
        if (rec_fget->class_)
            attr(name) = property;
        else
            metaclass().attr(name) = property;
Wenzel Jakob's avatar
Wenzel Jakob committed
845
846
        return *this;
    }
847
848

    template <typename target> class_ alias() {
849
        auto &instances = pybind11::detail::get_internals().registered_types_cpp;
850
        instances[std::type_index(typeid(target))] = instances[std::type_index(typeid(type))];
851
852
        return *this;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
853
private:
854
855
856
    /// 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 */) {
857
        try {
858
            new (&inst->holder) holder_type(std::static_pointer_cast<type>(inst->value->shared_from_this()));
859
860
861
        } catch (const std::bad_weak_ptr &) {
            new (&inst->holder) holder_type(inst->value);
        }
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
    }

    /// 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);
885
886
887
        inst->constructed = true;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
888
889
890
891
892
893
894
895
    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);
        }
896
        generic_type::dealloc((detail::instance<void> *) inst);
Wenzel Jakob's avatar
Wenzel Jakob committed
897
    }
898
899
900
901
902
903

    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
904
905
906
907
908
};

/// Binds C++ enumerations and enumeration classes to Python
template <typename Type> class enum_ : public class_<Type> {
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
909
910
911
    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
912
        auto entries = new std::unordered_map<int, const char *>();
913
        this->def("__repr__", [name, entries](Type value) -> std::string {
Wenzel Jakob's avatar
Wenzel Jakob committed
914
            auto it = entries->find((int) value);
Wenzel Jakob's avatar
Wenzel Jakob committed
915
916
917
918
            return std::string(name) + "." +
                ((it == entries->end()) ? std::string("???")
                                        : std::string(it->second));
        });
919
920
        this->def("__init__", [](Type& value, int i) { value = (Type)i; });
        this->def("__init__", [](Type& value, int i) { new (&value) Type((Type) i); });
921
        this->def("__int__", [](Type value) { return (int) value; });
922
923
        this->def("__eq__", [](const Type &value, Type *value2) { return value2 && value == *value2; });
        this->def("__ne__", [](const Type &value, Type *value2) { return !value2 || value != *value2; });
924
        this->def("__hash__", [](const Type &value) { return (int) value; });
Wenzel Jakob's avatar
Wenzel Jakob committed
925
926
927
928
929
930
931
        m_entries = entries;
    }

    /// Export enumeration entries into the parent scope
    void export_values() {
        PyObject *dict = ((PyTypeObject *) this->m_ptr)->tp_dict;
        PyObject *key, *value;
932
        ssize_t pos = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
933
934
935
936
937
938
939
        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) {
940
        this->attr(name) = pybind11::cast(value, return_value_policy::copy);
Wenzel Jakob's avatar
Wenzel Jakob committed
941
942
943
944
945
        (*m_entries)[(int) value] = name;
        return *this;
    }
private:
    std::unordered_map<int, const char *> *m_entries;
Wenzel Jakob's avatar
Wenzel Jakob committed
946
    handle m_parent;
Wenzel Jakob's avatar
Wenzel Jakob committed
947
948
949
};

NAMESPACE_BEGIN(detail)
950
template <typename... Args> struct init {
Wenzel Jakob's avatar
Wenzel Jakob committed
951
    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
952
        /// Function which calls a specific C++ in-place constructor
Wenzel Jakob's avatar
Wenzel Jakob committed
953
        class_.def("__init__", [](Base *instance, Args... args) { new (instance) Base(args...); }, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
954
955
    }
};
956

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

962
    if (!nurse || !patient)
963
        pybind11_fail("Could not activate keep_alive!");
964

965
966
967
    if (patient.ptr() == Py_None)
        return; /* Nothing to keep alive */

968
    cpp_function disable_lifesupport(
969
        [patient](handle weakref) { patient.dec_ref(); weakref.dec_ref(); });
970

971
    weakref wr(nurse, disable_lifesupport);
972

973
974
    patient.inc_ref(); /* reference patient and leak the weak reference */
    (void) wr.release();
975
976
}

977
978
template <typename Iterator> struct iterator_state { Iterator it, end; };

Wenzel Jakob's avatar
Wenzel Jakob committed
979
980
NAMESPACE_END(detail)

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

983
984
985
986
987
988
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; })
989
            .def("__next__", [](state &s) -> decltype(*std::declval<Iterator>()) {
990
991
992
993
994
995
996
997
998
                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 });
}

999
1000
1001
1002
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
1003
template <typename InputType, typename OutputType> void implicitly_convertible() {
1004
    auto implicit_caster = [](PyObject *obj, PyTypeObject *type) -> PyObject * {
Wenzel Jakob's avatar
Wenzel Jakob committed
1005
1006
1007
1008
1009
1010
1011
1012
1013
        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;
    };
1014
1015
    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
1016
    if (it == registered_types.end())
1017
        pybind11_fail("implicitly_convertible: Unable to find type " + type_id<OutputType>());
1018
    ((detail::type_info *) it->second)->implicit_conversions.push_back(implicit_caster);
Wenzel Jakob's avatar
Wenzel Jakob committed
1019
1020
}

1021
#if defined(WITH_THREAD)
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035

/* 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
1036
1037
1038
 *    thread would otherwise constantly construct and destroy thread state data
 *    structures.
 */
Wenzel Jakob's avatar
Wenzel Jakob committed
1039
1040
1041

class gil_scoped_acquire {
public:
1042
    PYBIND11_NOINLINE gil_scoped_acquire() {
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
        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;
1053
1054
1055
            #if PY_MAJOR_VERSION < 3
                PyThread_delete_key_value(internals.tstate);
            #endif
1056
1057
            PyThread_set_key_value(internals.tstate, tstate);
        } else {
1058
            release = detail::get_thread_state_unchecked() != tstate;
1059
1060
1061
1062
        }

        if (release) {
            /* Work around an annoying assertion in PyThreadState_Swap */
1063
1064
1065
1066
            #if defined(Py_DEBUG)
                PyInterpreterState *interp = tstate->interp;
                tstate->interp = nullptr;
            #endif
1067
            PyEval_AcquireThread(tstate);
1068
1069
1070
            #if defined(Py_DEBUG)
                tstate->interp = interp;
            #endif
1071
1072
1073
1074
1075
1076
1077
1078
1079
        }

        inc_ref();
    }

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

1080
    PYBIND11_NOINLINE void dec_ref() {
1081
1082
        --tstate->gilstate_counter;
        #if !defined(NDEBUG)
1083
            if (detail::get_thread_state_unchecked() != tstate)
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
                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();
1095
            PyThread_delete_key_value(detail::get_internals().tstate);
1096
1097
1098
1099
            release = false;
        }
    }

1100
    PYBIND11_NOINLINE ~gil_scoped_acquire() {
1101
1102
1103
1104
1105
1106
1107
        dec_ref();
        if (release)
           PyEval_SaveThread();
    }
private:
    PyThreadState *tstate = nullptr;
    bool release = true;
Wenzel Jakob's avatar
Wenzel Jakob committed
1108
1109
1110
1111
};

class gil_scoped_release {
public:
1112
1113
    gil_scoped_release(bool disassoc = false) : disassoc(disassoc) {
        tstate = PyEval_SaveThread();
1114
1115
1116
1117
1118
1119
1120
1121
        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
        }
1122
1123
1124
1125
1126
    }
    ~gil_scoped_release() {
        if (!tstate)
            return;
        PyEval_RestoreThread(tstate);
1127
1128
1129
1130
1131
1132
1133
        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);
        }
1134
1135
1136
1137
    }
private:
    PyThreadState *tstate;
    bool disassoc;
Wenzel Jakob's avatar
Wenzel Jakob committed
1138
};
1139
1140
1141
#else
class gil_scoped_acquire { };
class gil_scoped_release { };
1142
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
1143

1144
1145
inline function get_overload(const void *this_ptr, const char *name)  {
    handle py_object = detail::get_object_handle(this_ptr);
1146
1147
    if (!py_object)
        return function();
1148
1149
1150
    handle type = py_object.get_type();
    auto key = std::make_pair(type.ptr(), name);

1151
1152
    /* Cache functions that aren't overloaded in Python to avoid
       many costly Python dictionary lookups below */
1153
1154
1155
1156
1157
1158
1159
1160
1161
    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();
    }
1162

1163
    /* Don't call dispatch code if invoked from overridden function */
1164
    PyFrameObject *frame = PyThreadState_Get()->frame;
1165
    if (frame && (std::string) pybind11::handle(frame->f_code->co_name).str() == name &&
1166
1167
1168
1169
1170
1171
1172
        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();
    }
1173
1174
1175
    return overload;
}

1176
#define PYBIND11_OVERLOAD_INT(ret_type, class_name, name, ...) { \
1177
1178
        pybind11::gil_scoped_acquire gil; \
        pybind11::function overload = pybind11::get_overload(this, #name); \
1179
        if (overload) \
1180
            return overload(__VA_ARGS__).template cast<ret_type>();  }
1181

1182
1183
#define PYBIND11_OVERLOAD(ret_type, class_name, name, ...) \
    PYBIND11_OVERLOAD_INT(ret_type, class_name, name, __VA_ARGS__) \
1184
1185
    return class_name::name(__VA_ARGS__)

1186
1187
#define PYBIND11_OVERLOAD_PURE(ret_type, class_name, name, ...) \
    PYBIND11_OVERLOAD_INT(ret_type, class_name, name, __VA_ARGS__) \
1188
    pybind11::pybind11_fail("Tried to call pure virtual function \"" #name "\"");
1189

1190
NAMESPACE_END(pybind11)
Wenzel Jakob's avatar
Wenzel Jakob committed
1191
1192

#if defined(_MSC_VER)
Wenzel Jakob's avatar
Wenzel Jakob committed
1193
#  pragma warning(pop)
Ben Pritchard's avatar
Ben Pritchard committed
1194
1195
#elif defined(__ICC) || defined(__INTEL_COMPILER)
#  pragma warning(pop)
1196
#elif defined(__GNUG__) && !defined(__clang__)
Wenzel Jakob's avatar
Wenzel Jakob committed
1197
#  pragma GCC diagnostic pop
Wenzel Jakob's avatar
Wenzel Jakob committed
1198
#endif