pybind11.h 49.3 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
425
426
427
428
429
430
431
432
433
434
        } 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) {
435
                /* When a constructor ran successfully, the corresponding
Wenzel Jakob's avatar
Wenzel Jakob committed
436
                   holder type (e.g. std::unique_ptr) must still be initialized. */
437
                PyObject *inst = PyTuple_GET_ITEM(args, 0);
Wenzel Jakob's avatar
Wenzel Jakob committed
438
439
440
441
442
443
                auto tinfo = detail::get_type_info(Py_TYPE(inst));
                tinfo->init_holder(inst, nullptr);
            }
            return result.ptr();
        }
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
444
445
};

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

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

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

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

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

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

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

        if (!type_holder || !name)
520
            pybind11_fail("generic_type: unable to create type object!");
521
522
523
524
525

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

531
532
533
534
535
536
        object scope_module;
        if (rec->scope) {
            scope_module = (object) rec->scope.attr("__module__");
            if (!scope_module)
                scope_module = (object) rec->scope.attr("__name__");
        }
537

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

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

561
562
563
564
        /* 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
565

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

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

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

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

        if (PyType_Ready(&type->ht_type) < 0)
590
            pybind11_fail("generic_type: PyType_Ready failed!");
591
592

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

594
        if (scope_module) // Needed by pydoc
Wenzel Jakob's avatar
Wenzel Jakob committed
595
            attr("__module__") = scope_module;
Wenzel Jakob's avatar
Wenzel Jakob committed
596

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

601
        type_holder.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
602
603
    }

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

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

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

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

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

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

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

721
    PYBIND11_OBJECT(class_, detail::generic_type, PyType_Check)
Wenzel Jakob's avatar
Wenzel Jakob committed
722

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

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

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

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

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

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

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

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

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

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

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

817
818
819
    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
820
821
822
        return *this;
    }

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

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

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

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

    /// 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);
888
889
890
        inst->constructed = true;
    }

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

    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
907
908
909
910
911
};

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

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

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

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

965
    if (!nurse || !patient)
966
        pybind11_fail("Could not activate keep_alive!");
967

968
969
970
    if (patient.ptr() == Py_None)
        return; /* Nothing to keep alive */

971
    cpp_function disable_lifesupport(
972
        [patient](handle weakref) { patient.dec_ref(); weakref.dec_ref(); });
973

974
    weakref wr(nurse, disable_lifesupport);
975

976
977
    patient.inc_ref(); /* reference patient and leak the weak reference */
    (void) wr.release();
978
979
}

980
981
template <typename Iterator> struct iterator_state { Iterator it, end; };

Wenzel Jakob's avatar
Wenzel Jakob committed
982
983
NAMESPACE_END(detail)

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

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

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

1024
#if defined(WITH_THREAD)
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038

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

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

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

        inc_ref();
    }

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

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

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

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

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

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

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

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

1185
1186
#define PYBIND11_OVERLOAD(ret_type, class_name, name, ...) \
    PYBIND11_OVERLOAD_INT(ret_type, class_name, name, __VA_ARGS__) \
1187
1188
    return class_name::name(__VA_ARGS__)

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

1193
NAMESPACE_END(pybind11)
Wenzel Jakob's avatar
Wenzel Jakob committed
1194
1195

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