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

Wenzel Jakob's avatar
Wenzel Jakob committed
30
#include "attr.h"
Wenzel Jakob's avatar
Wenzel Jakob committed
31

32
NAMESPACE_BEGIN(pybind11)
Wenzel Jakob's avatar
Wenzel Jakob committed
33

Wenzel Jakob's avatar
Wenzel Jakob committed
34
/// Wraps an arbitrary C++ function/method/lambda function/.. into a callable Python object
35
class cpp_function : public function {
36
protected:
Wenzel Jakob's avatar
Wenzel Jakob committed
37
38
39
    /// Picks a suitable return value converter from cast.h
    template <typename T> using return_value_caster =
        detail::type_caster<typename std::conditional<
40
            std::is_void<T>::value, detail::void_type, typename detail::intrinsic_type<T>::type>::type>;
Wenzel Jakob's avatar
Wenzel Jakob committed
41
42

    /// Picks a suitable argument value converter from cast.h
43
    template <typename... T> using arg_value_caster =
Wenzel Jakob's avatar
Wenzel Jakob committed
44
45
        detail::type_caster<typename std::tuple<T...>>;
public:
46
    cpp_function() { }
Wenzel Jakob's avatar
Wenzel Jakob committed
47
48

    /// Vanilla function pointers
49
    template <typename Return, typename... Args, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
50
51
52
    cpp_function(Return (*f)(Args...), const Extra&... extra) {
        auto rec = new detail::function_record();
        rec->data = (void *) f;
Wenzel Jakob's avatar
Wenzel Jakob committed
53

54
        typedef arg_value_caster<Args...> cast_in;
55
56
        typedef return_value_caster<Return> cast_out;

57
        /* Dispatch code which converts function arguments and performs the actual function call */
Wenzel Jakob's avatar
Wenzel Jakob committed
58
        rec->impl = [](detail::function_record *rec, handle pyArgs, handle parent) -> handle {
Wenzel Jakob's avatar
Wenzel Jakob committed
59
            cast_in args;
60
61

            /* Try to cast the function arguments into the C++ domain */
62
            if (!args.load(pyArgs, true))
63
64
                return PYBIND11_TRY_NEXT_OVERLOAD;

Wenzel Jakob's avatar
Wenzel Jakob committed
65
66
            /* Invoke call policy pre-call hook */
            detail::process_attributes<Extra...>::precall(pyArgs);
67
68

            /* Do the call and convert the return value back into the Python domain */
Wenzel Jakob's avatar
Wenzel Jakob committed
69
70
71
72
73
74
            handle result = cast_out::cast(
                args.template call<Return>((Return (*) (Args...)) rec->data),
                rec->policy, parent);

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

76
            return result;
Wenzel Jakob's avatar
Wenzel Jakob committed
77
78
        };

Wenzel Jakob's avatar
Wenzel Jakob committed
79
80
        /* Process any user-provided function attributes */
        detail::process_attributes<Extra...>::init(extra..., rec);
81
82

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

        /* Register the function with Python from generic (non-templated) code */
Wenzel Jakob's avatar
Wenzel Jakob committed
87
        initialize(rec, signature.text(), signature.types(), sizeof...(Args));
Wenzel Jakob's avatar
Wenzel Jakob committed
88
89
90
    }

    /// Delegating helper constructor to deal with lambda functions
Wenzel Jakob's avatar
Wenzel Jakob committed
91
    template <typename Func, typename... Extra> cpp_function(Func &&f, const Extra&... extra) {
92
        initialize(std::forward<Func>(f),
Wenzel Jakob's avatar
Wenzel Jakob committed
93
                   (typename detail::remove_class<decltype(
Wenzel Jakob's avatar
Wenzel Jakob committed
94
                       &std::remove_reference<Func>::type::operator())>::type *) nullptr, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
95
96
    }

97
    /// Delegating helper constructor to deal with class methods (non-const)
98
    template <typename Return, typename Class, typename... Arg, typename... Extra> cpp_function(
Wenzel Jakob's avatar
Wenzel Jakob committed
99
            Return (Class::*f)(Arg...), const Extra&... extra) {
100
        initialize([f](Class *c, Arg... args) -> Return { return (c->*f)(args...); },
Wenzel Jakob's avatar
Wenzel Jakob committed
101
                   (Return (*) (Class *, Arg...)) nullptr, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
102
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
103

104
    /// Delegating helper constructor to deal with class methods (const)
105
    template <typename Return, typename Class, typename... Arg, typename... Extra> cpp_function(
Wenzel Jakob's avatar
Wenzel Jakob committed
106
            Return (Class::*f)(Arg...) const, const Extra&... extra) {
107
        initialize([f](const Class *c, Arg... args) -> Return { return (c->*f)(args...); },
Wenzel Jakob's avatar
Wenzel Jakob committed
108
                   (Return (*)(const Class *, Arg ...)) nullptr, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
109
110
    }

111
    /// Return the function name
Wenzel Jakob's avatar
Wenzel Jakob committed
112
    object name() const { return attr("__name__"); }
113

114
115
protected:
    /// Special internal constructor for functors, lambda functions, etc.
116
    template <typename Func, typename Return, typename... Args, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
117
    void initialize(Func &&f, Return (*)(Args...), const Extra&... extra) {
118
        struct capture { typename std::remove_reference<Func>::type f; };
Wenzel Jakob's avatar
Wenzel Jakob committed
119

120
        /* Store the function including any extra state it might have (e.g. a lambda capture object) */
Wenzel Jakob's avatar
Wenzel Jakob committed
121
122
        auto rec = new detail::function_record();
        rec->data = new capture { std::forward<Func>(f) };
123

124
        /* Create a cleanup handler, but only if we have to (less generated code) */
125
        if (!std::is_trivially_destructible<Func>::value)
Wenzel Jakob's avatar
Wenzel Jakob committed
126
            rec->free_data = [](void *ptr) { delete (capture *) ptr; };
127
        else
Wenzel Jakob's avatar
Wenzel Jakob committed
128
            rec->free_data = operator delete;
129

130
        typedef arg_value_caster<Args...> cast_in;
131
        typedef return_value_caster<Return> cast_out;
Wenzel Jakob's avatar
Wenzel Jakob committed
132

133
        /* Dispatch code which converts function arguments and performs the actual function call */
Wenzel Jakob's avatar
Wenzel Jakob committed
134
        rec->impl = [](detail::function_record *rec, handle pyArgs, handle parent) -> handle {
Wenzel Jakob's avatar
Wenzel Jakob committed
135
            cast_in args;
136
137

            /* Try to cast the function arguments into the C++ domain */
138
            if (!args.load(pyArgs, true))
139
140
                return PYBIND11_TRY_NEXT_OVERLOAD;

Wenzel Jakob's avatar
Wenzel Jakob committed
141
142
            /* Invoke call policy pre-call hook */
            detail::process_attributes<Extra...>::precall(pyArgs);
143
144

            /* Do the call and convert the return value back into the Python domain */
Wenzel Jakob's avatar
Wenzel Jakob committed
145
146
147
148
149
150
            handle result = cast_out::cast(
                args.template call<Return>(((capture *) rec->data)->f),
                rec->policy, parent);

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

152
            return result;
Wenzel Jakob's avatar
Wenzel Jakob committed
153
154
        };

Wenzel Jakob's avatar
Wenzel Jakob committed
155
156
        /* Process any user-provided function attributes */
        detail::process_attributes<Extra...>::init(extra..., rec);
157
158

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

        /* Register the function with Python from generic (non-templated) code */
Wenzel Jakob's avatar
Wenzel Jakob committed
163
        initialize(rec, signature.text(), signature.types(), sizeof...(Args));
164
165
    }

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

170
        /* Create copies of all referenced C-style strings */
Wenzel Jakob's avatar
Wenzel Jakob committed
171
172
173
        rec->name = strdup(rec->name ? rec->name : "");
        if (rec->doc) rec->doc = strdup(rec->doc);
        for (auto &a: rec->args) {
174
175
176
177
178
            if (a.name)
                a.name = strdup(a.name);
            if (a.descr)
                a.descr = strdup(a.descr);
            else if (a.value)
179
                a.descr = strdup(((std::string) ((object) handle(a.value).attr("__repr__"))().str()).c_str());
180
        }
181
        auto const &registered_types = detail::get_internals().registered_types_cpp;
182
183
184
185
186
187
188
189
190
191

        /* 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
192
193
                if (type_depth == 1 && arg_index < rec->args.size()) {
                    signature += rec->args[arg_index].name;
194
195
196
197
198
                    signature += " : ";
                }
                ++type_depth;
            } else if (c == '}') {
                --type_depth;
Wenzel Jakob's avatar
Wenzel Jakob committed
199
200
                if (type_depth == 1 && arg_index < rec->args.size()) {
                    if (rec->args[arg_index].descr) {
201
                        signature += " = ";
Wenzel Jakob's avatar
Wenzel Jakob committed
202
                        signature += rec->args[arg_index].descr;
203
204
205
206
207
                    }
                    arg_index++;
                }
            } else if (c == '%') {
                const std::type_info *t = types[type_index++];
208
                if (!t)
209
                    pybind11_fail("Internal error while parsing type signature (1)");
210
                auto it = registered_types.find(std::type_index(*t));
211
                if (it != registered_types.end()) {
212
                    signature += ((const detail::type_info *) it->second)->type->tp_name;
213
214
215
216
217
218
219
220
221
                } else {
                    std::string tname(t->name());
                    detail::clean_type_id(tname);
                    signature += tname;
                }
            } else {
                signature += c;
            }
        }
222
        if (type_depth != 0 || types[type_index] != nullptr)
223
            pybind11_fail("Internal error while parsing type signature (2)");
224
225
226
227
228

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

230
#if PY_MAJOR_VERSION < 3
Wenzel Jakob's avatar
Wenzel Jakob committed
231
232
233
        if (strcmp(rec->name, "__next__") == 0) {
            std::free(rec->name);
            rec->name = strdup("next");
234
        }
235
236
#endif

Wenzel Jakob's avatar
Wenzel Jakob committed
237
        if (!rec->args.empty() && (int) rec->args.size() != args)
238
            pybind11_fail(
Wenzel Jakob's avatar
Wenzel Jakob committed
239
240
                "cpp_function(): function \"" + std::string(rec->name) + "\" takes " +
                std::to_string(args) + " arguments, but " + std::to_string(rec->args.size()) +
241
                " pybind11::arg entries were specified!");
242

Wenzel Jakob's avatar
Wenzel Jakob committed
243
244
245
        rec->is_constructor = !strcmp(rec->name, "__init__");
        rec->signature = strdup(signature.c_str());
        rec->args.shrink_to_fit();
246
247

#if PY_MAJOR_VERSION < 3
Wenzel Jakob's avatar
Wenzel Jakob committed
248
249
        if (rec->sibling && PyMethod_Check(rec->sibling.ptr()))
            rec->sibling = PyMethod_GET_FUNCTION(rec->sibling.ptr());
250
#endif
251

Wenzel Jakob's avatar
Wenzel Jakob committed
252
253
254
255
        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;
256
257
            /* 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
258
259
            if (chain->class_ != rec->class_)
                chain = nullptr;
260
261
        }

Wenzel Jakob's avatar
Wenzel Jakob committed
262
        if (!chain) {
263
            /* No existing overload was found, create a new function object */
Wenzel Jakob's avatar
Wenzel Jakob committed
264
265
266
267
268
            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;
269

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

            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
282
            if (!m_ptr)
283
                pybind11_fail("cpp_function::cpp_function(): Could not allocate function object");
Wenzel Jakob's avatar
Wenzel Jakob committed
284
        } else {
285
            /* Append at the end of the overload chain */
Wenzel Jakob's avatar
Wenzel Jakob committed
286
            m_ptr = rec->sibling.ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
287
            inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
288
289
290
291
            chain_start = chain;
            while (chain->next)
                chain = chain->next;
            chain->next = rec;
Wenzel Jakob's avatar
Wenzel Jakob committed
292
        }
293

Wenzel Jakob's avatar
Wenzel Jakob committed
294
        std::string signatures;
295
        int index = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
296
        /* Create a nice pydoc rec including all signatures and
297
           docstrings of the functions in the overload chain */
298
299
300
301
302
303
304
        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
305
306
        for (auto it = chain_start; it != nullptr; it = it->next) {
            if (chain)
307
                signatures += std::to_string(++index) + ". ";
308
            signatures += rec->name;
309
310
311
312
            signatures += it->signature;
            signatures += "\n";
            if (it->doc && strlen(it->doc) > 0) {
                signatures += "\n";
313
                signatures += it->doc;
314
315
                signatures += "\n";
            }
316
            if (it->next)
Wenzel Jakob's avatar
Wenzel Jakob committed
317
318
                signatures += "\n";
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
319
320

        /* Install docstring */
Wenzel Jakob's avatar
Wenzel Jakob committed
321
322
        PyCFunctionObject *func = (PyCFunctionObject *) m_ptr;
        if (func->m_ml->ml_doc)
323
            std::free((char *) func->m_ml->ml_doc);
Wenzel Jakob's avatar
Wenzel Jakob committed
324
        func->m_ml->ml_doc = strdup(signatures.c_str());
Wenzel Jakob's avatar
Wenzel Jakob committed
325
326
327

        if (rec->class_) {
            m_ptr = PYBIND11_INSTANCE_METHOD_NEW(m_ptr, rec->class_.ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
328
            if (!m_ptr)
329
                pybind11_fail("cpp_function::cpp_function(): Could not allocate instance method object");
Wenzel Jakob's avatar
Wenzel Jakob committed
330
331
332
            Py_DECREF(func);
        }
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411

    /// 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)
                rec->free_data(rec->data);
            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 */
        int nargs = (int) PyTuple_Size(args),
            nkwargs = kwargs ? (int) PyDict_Size(kwargs) : 0;

        handle parent = nargs > 0 ? PyTuple_GetItem(args, 0) : nullptr,
               result = PYBIND11_TRY_NEXT_OVERLOAD;
        try {
            for (; it != nullptr; it = it->next) {
                tuple args_(args, true);
                int kwargs_consumed = 0;

                /* 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)
                 */

                if (nargs < (int) it->args.size()) {
                    args_ = tuple(it->args.size());
                    for (int i = 0; i < nargs; ++i) {
                        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 {
                            kwargs_consumed = -1; /* definite failure */
                            break;
                        }
                    }
                }
412
413
414
415

                try {
                    if (kwargs_consumed == nkwargs)
                        result = it->impl(it, args_, parent);
Wenzel Jakob's avatar
Wenzel Jakob committed
416
                } catch (cast_error &) {
417
418
                    result = PYBIND11_TRY_NEXT_OVERLOAD;
                }
Wenzel Jakob's avatar
Wenzel Jakob committed
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456

                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;
        } 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) {
457
                /* When a constructor ran successfully, the corresponding
Wenzel Jakob's avatar
Wenzel Jakob committed
458
459
460
461
462
463
464
465
                   holder type (e.g. std::unique_ptr) must still be initialized. */
                PyObject *inst = PyTuple_GetItem(args, 0);
                auto tinfo = detail::get_type_info(Py_TYPE(inst));
                tinfo->init_holder(inst, nullptr);
            }
            return result.ptr();
        }
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
466
467
};

468
/// Wrapper for Python extension modules
Wenzel Jakob's avatar
Wenzel Jakob committed
469
470
class module : public object {
public:
471
    PYBIND11_OBJECT_DEFAULT(module, object, PyModule_Check)
Wenzel Jakob's avatar
Wenzel Jakob committed
472
473

    module(const char *name, const char *doc = nullptr) {
474
#if PY_MAJOR_VERSION >= 3
Wenzel Jakob's avatar
Wenzel Jakob committed
475
476
477
478
479
480
481
        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);
482
483
484
#else
        m_ptr = Py_InitModule3(name, nullptr, doc);
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
485
        if (m_ptr == nullptr)
486
            pybind11_fail("Internal error in module::module()");
Wenzel Jakob's avatar
Wenzel Jakob committed
487
488
489
        inc_ref();
    }

490
    template <typename Func, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
491
    module &def(const char *name_, Func &&f, const Extra& ... extra) {
492
        cpp_function func(std::forward<Func>(f), name(name_),
493
                          sibling((handle) attr(name_)), scope(*this), extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
494
495
        /* PyModule_AddObject steals a reference to 'func' */
        PyModule_AddObject(ptr(), name_, func.inc_ref().ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
496
497
498
        return *this;
    }

499
    module def_submodule(const char *name, const char *doc = nullptr) {
Wenzel Jakob's avatar
Wenzel Jakob committed
500
501
502
        std::string full_name = std::string(PyModule_GetName(m_ptr))
            + std::string(".") + std::string(name);
        module result(PyImport_AddModule(full_name.c_str()), true);
503
        if (doc)
504
            result.attr("__doc__") = pybind11::str(doc);
Wenzel Jakob's avatar
Wenzel Jakob committed
505
506
507
        attr(name) = result;
        return result;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
508
509

    static module import(const char *name) {
510
511
        PyObject *obj = PyImport_ImportModule(name);
        if (!obj)
512
            pybind11_fail("Module \"" + std::string(name) + "\" not found!");
513
        return module(obj, false);
Wenzel Jakob's avatar
Wenzel Jakob committed
514
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
515
516
517
};

NAMESPACE_BEGIN(detail)
Wenzel Jakob's avatar
Wenzel Jakob committed
518
/// Generic support for creating new Python heap types
519
class generic_type : public object {
Wenzel Jakob's avatar
Wenzel Jakob committed
520
    template <typename type, typename holder_type> friend class class_;
Wenzel Jakob's avatar
Wenzel Jakob committed
521
public:
522
    PYBIND11_OBJECT_DEFAULT(generic_type, object, PyType_Check)
Wenzel Jakob's avatar
Wenzel Jakob committed
523
524
525
526
527
528
529
530
531
532
533
534
535
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 + "\"");
            }
        }
536
537

        object type_holder(PyType_Type.tp_alloc(&PyType_Type, 0), false);
Wenzel Jakob's avatar
Wenzel Jakob committed
538
        object name(PYBIND11_FROM_STRING(rec->name), false);
539
540
541
        auto type = (PyHeapTypeObject*) type_holder.ptr();

        if (!type_holder || !name)
542
            pybind11_fail("generic_type: unable to create type object!");
543
544
545
546
547

        /* 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
548
549
        tinfo->type_size = rec->type_size;
        tinfo->init_holder = rec->init_holder;
550
        internals.registered_types_cpp[std::type_index(*(rec->type))] = tinfo;
551
552
        internals.registered_types_py[type] = tinfo;

553
554
555
556
557
558
        object scope_module;
        if (rec->scope) {
            scope_module = (object) rec->scope.attr("__module__");
            if (!scope_module)
                scope_module = (object) rec->scope.attr("__name__");
        }
559

Wenzel Jakob's avatar
Wenzel Jakob committed
560
561
        std::string full_name = (scope_module ? ((std::string) scope_module.str() + "." + rec->name)
                                              : std::string(rec->name));
562
563
        /* Basic type attributes */
        type->ht_type.tp_name = strdup(full_name.c_str());
Wenzel Jakob's avatar
Wenzel Jakob committed
564
565
566
        type->ht_type.tp_basicsize = rec->instance_size;
        type->ht_type.tp_base = (PyTypeObject *) rec->base_handle.ptr();
        rec->base_handle.inc_ref();
567
568
569

#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3
        /* Qualified names for Python >= 3.3 */
570
571
572
        object scope_qualname;
        if (rec->scope)
            scope_qualname = (object) rec->scope.attr("__qualname__");
573
574
575
576
577
578
579
        if (scope_qualname) {
            type->ht_qualname = PyUnicode_FromFormat(
                "%U.%U", scope_qualname.ptr(), name.ptr());
        } else {
            type->ht_qualname = name.ptr();
            name.inc_ref();
        }
580
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
581
        type->ht_name = name.release().ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
582

583
584
585
586
        /* 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
587

588
        /* Supported elementary operations */
Wenzel Jakob's avatar
Wenzel Jakob committed
589
590
        type->ht_type.tp_init = (initproc) init;
        type->ht_type.tp_new = (newfunc) new_instance;
Wenzel Jakob's avatar
Wenzel Jakob committed
591
        type->ht_type.tp_dealloc = rec->dealloc;
592
593

        /* Support weak references (needed for the keep_alive feature) */
594
        type->ht_type.tp_weaklistoffset = offsetof(instance_essentials<void>, weakrefs);
595
596
597

        /* Flags */
        type->ht_type.tp_flags |= Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HEAPTYPE;
598
599
600
#if PY_MAJOR_VERSION < 3
        type->ht_type.tp_flags |= Py_TPFLAGS_CHECKTYPES;
#endif
601
        type->ht_type.tp_flags &= ~Py_TPFLAGS_HAVE_GC;
602

Wenzel Jakob's avatar
Wenzel Jakob committed
603
        if (rec->doc) {
604
605
            /* Allocate memory for docstring (using PyObject_MALLOC, since
               Python will free this later on) */
Wenzel Jakob's avatar
Wenzel Jakob committed
606
            size_t size = strlen(rec->doc) + 1;
607
            type->ht_type.tp_doc = (char *) PyObject_MALLOC(size);
Wenzel Jakob's avatar
Wenzel Jakob committed
608
            memcpy((void *) type->ht_type.tp_doc, rec->doc, size);
Wenzel Jakob's avatar
Wenzel Jakob committed
609
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
610
611

        if (PyType_Ready(&type->ht_type) < 0)
612
            pybind11_fail("generic_type: PyType_Ready failed!");
613
614

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

616
        if (scope_module) // Needed by pydoc
Wenzel Jakob's avatar
Wenzel Jakob committed
617
            attr("__module__") = scope_module;
Wenzel Jakob's avatar
Wenzel Jakob committed
618

619
        /* Register type with the parent scope */
620
621
        if (rec->scope)
            rec->scope.attr(handle(type->ht_name)) = *this;
Wenzel Jakob's avatar
Wenzel Jakob committed
622

623
        type_holder.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
624
625
    }

626
    /// Allocate a metaclass on demand (for static properties)
Wenzel Jakob's avatar
Wenzel Jakob committed
627
628
    handle metaclass() {
        auto &ht_type = ((PyHeapTypeObject *) m_ptr)->ht_type;
629
        auto &ob_type = PYBIND11_OB_TYPE(ht_type);
630

Wenzel Jakob's avatar
Wenzel Jakob committed
631
        if (ob_type == &PyType_Type) {
632
633
634
635
            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)
636
                pybind11_fail("generic_type::metaclass(): unable to create type object!");
637
638

            auto type = (PyHeapTypeObject*) type_holder.ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
639
640
641
642
643
644
            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
645
            type->ht_type.tp_name = strdup(name_.c_str());
Wenzel Jakob's avatar
Wenzel Jakob committed
646
            type->ht_type.tp_base = ob_type;
647
648
649
            type->ht_type.tp_flags |= (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE) &
                                      ~Py_TPFLAGS_HAVE_GC;

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

Wenzel Jakob's avatar
Wenzel Jakob committed
653
            ob_type = (PyTypeObject *) type_holder.release().ptr();
Wenzel Jakob's avatar
Wenzel Jakob committed
654
655
656
657
658
659
660
661
662
663
664
        }
        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 *) {
665
666
667
        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
668
669
670
671
672
673
674
675
676
677
678
679
680
681
        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())
682
                    pybind11_fail("generic_type::dealloc(): Tried to deallocate unregistered instance!");
Wenzel Jakob's avatar
Wenzel Jakob committed
683
684
685
                registered_instances.erase(it);
            }
            Py_XDECREF(self->parent);
686
687
            if (self->weakrefs)
                PyObject_ClearWeakRefs((PyObject *) self);
Wenzel Jakob's avatar
Wenzel Jakob committed
688
689
690
691
        }
        Py_TYPE(self)->tp_free((PyObject*) self);
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
692
693
694
    void install_buffer_funcs(
            buffer_info *(*get_buffer)(PyObject *, void *),
            void *get_buffer_data) {
Wenzel Jakob's avatar
Wenzel Jakob committed
695
696
        PyHeapTypeObject *type = (PyHeapTypeObject*) m_ptr;
        type->ht_type.tp_as_buffer = &type->as_buffer;
697
698
699
#if PY_MAJOR_VERSION < 3
        type->ht_type.tp_flags |= Py_TPFLAGS_HAVE_NEWBUFFER;
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
700
701
        type->as_buffer.bf_getbuffer = getbuffer;
        type->as_buffer.bf_releasebuffer = releasebuffer;
702
703
704
        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
705
706
707
    }

    static int getbuffer(PyObject *obj, Py_buffer *view, int flags) {
708
709
710
        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
711
712
713
            return -1;
        }
        memset(view, 0, sizeof(Py_buffer));
714
        buffer_info *info = tinfo->get_buffer(obj, tinfo->get_buffer_data);
Wenzel Jakob's avatar
Wenzel Jakob committed
715
716
717
718
719
720
721
722
723
724
725
726
        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;
727
728
            view->strides = (ssize_t *) &info->strides[0];
            view->shape = (ssize_t *) &info->shape[0];
Wenzel Jakob's avatar
Wenzel Jakob committed
729
730
731
732
733
734
735
736
737
        }
        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
738
739
template <typename type, typename holder_type = std::unique_ptr<type>>
class class_ : public detail::generic_type {
Wenzel Jakob's avatar
Wenzel Jakob committed
740
741
742
public:
    typedef detail::instance<type, holder_type> instance_type;

743
    PYBIND11_OBJECT(class_, detail::generic_type, PyType_Check)
Wenzel Jakob's avatar
Wenzel Jakob committed
744

Wenzel Jakob's avatar
Wenzel Jakob committed
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
    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
761

762
    template <typename Func, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
763
    class_ &def(const char *name_, Func&& f, const Extra&... extra) {
764
        cpp_function cf(std::forward<Func>(f), name(name_),
Wenzel Jakob's avatar
Wenzel Jakob committed
765
766
                        sibling(attr(name_)), is_method(*this),
                        extra...);
767
        attr(cf.name()) = cf;
Wenzel Jakob's avatar
Wenzel Jakob committed
768
769
770
        return *this;
    }

771
    template <typename Func, typename... Extra> class_ &
Wenzel Jakob's avatar
Wenzel Jakob committed
772
    def_static(const char *name_, Func f, const Extra&... extra) {
773
        cpp_function cf(std::forward<Func>(f), name(name_),
774
                        sibling(attr(name_)), scope(*this), extra...);
775
        attr(cf.name()) = cf;
Wenzel Jakob's avatar
Wenzel Jakob committed
776
777
778
        return *this;
    }

779
    template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
780
    class_ &def(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
Wenzel Jakob's avatar
Wenzel Jakob committed
781
        op.template execute<type>(*this, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
782
783
784
        return *this;
    }

785
    template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
786
    class_ & def_cast(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
Wenzel Jakob's avatar
Wenzel Jakob committed
787
        op.template execute_cast<type>(*this, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
788
789
790
        return *this;
    }

791
    template <typename... Args, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
792
    class_ &def(const detail::init<Args...> &init, const Extra&... extra) {
Wenzel Jakob's avatar
Wenzel Jakob committed
793
        init.template execute<type>(*this, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
794
795
796
        return *this;
    }

797
    template <typename Func> class_& def_buffer(Func &&func) {
Wenzel Jakob's avatar
Wenzel Jakob committed
798
799
800
        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
801
802
803
            detail::type_caster<type> caster;
            if (!caster.load(obj, false))
                return nullptr;
Wenzel Jakob's avatar
Wenzel Jakob committed
804
805
            return new buffer_info(((capture *) ptr)->func(caster));
        }, ptr);
Wenzel Jakob's avatar
Wenzel Jakob committed
806
807
808
        return *this;
    }

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

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

824
    template <typename D, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
825
    class_ &def_readwrite_static(const char *name, D *pm, const Extra& ...extra) {
826
827
828
        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
829
830
831
        return *this;
    }

832
    template <typename D, typename... Extra>
Wenzel Jakob's avatar
Wenzel Jakob committed
833
    class_ &def_readonly_static(const char *name, const D *pm, const Extra& ...extra) {
834
835
        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
836
837
838
        return *this;
    }

839
840
841
    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
842
843
844
        return *this;
    }

845
846
847
    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
848
849
850
        return *this;
    }

851
852
    template <typename... Extra>
    class_ &def_property(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
853
        return def_property_static(name, fget, fset, is_method(*this), extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
854
855
    }

856
857
858
859
860
861
862
    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
863
        object property(
Wenzel Jakob's avatar
Wenzel Jakob committed
864
865
            PyObject_CallFunctionObjArgs((PyObject *) &PyProperty_Type, fget.ptr() ? fget.ptr() : Py_None,
                                         fset.ptr() ? fset.ptr() : Py_None, Py_None, doc_obj.ptr(), nullptr), false);
866
867
868
869
        if (rec_fget->class_)
            attr(name) = property;
        else
            metaclass().attr(name) = property;
Wenzel Jakob's avatar
Wenzel Jakob committed
870
871
        return *this;
    }
872
873

    template <typename target> class_ alias() {
874
        auto &instances = pybind11::detail::get_internals().registered_types_cpp;
875
        instances[std::type_index(typeid(target))] = instances[std::type_index(typeid(type))];
876
877
        return *this;
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
878
private:
879
880
881
    /// 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 */) {
882
        try {
883
            new (&inst->holder) holder_type(std::static_pointer_cast<type>(inst->value->shared_from_this()));
884
885
886
        } catch (const std::bad_weak_ptr &) {
            new (&inst->holder) holder_type(inst->value);
        }
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
    }

    /// 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);
910
911
912
        inst->constructed = true;
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
913
914
915
916
917
918
919
920
    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);
        }
921
        generic_type::dealloc((detail::instance<void> *) inst);
Wenzel Jakob's avatar
Wenzel Jakob committed
922
    }
923
924
925
926
927
928

    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
929
930
931
932
933
};

/// Binds C++ enumerations and enumeration classes to Python
template <typename Type> class enum_ : public class_<Type> {
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
934
935
936
    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
937
        auto entries = new std::unordered_map<int, const char *>();
938
        this->def("__repr__", [name, entries](Type value) -> std::string {
Wenzel Jakob's avatar
Wenzel Jakob committed
939
            auto it = entries->find((int) value);
Wenzel Jakob's avatar
Wenzel Jakob committed
940
941
942
943
            return std::string(name) + "." +
                ((it == entries->end()) ? std::string("???")
                                        : std::string(it->second));
        });
944
945
        this->def("__init__", [](Type& value, int i) { value = (Type)i; });
        this->def("__init__", [](Type& value, int i) { new (&value) Type((Type) i); });
946
        this->def("__int__", [](Type value) { return (int) value; });
947
948
        this->def("__eq__", [](const Type &value, Type *value2) { return value2 && value == *value2; });
        this->def("__ne__", [](const Type &value, Type *value2) { return !value2 || value != *value2; });
949
        this->def("__hash__", [](const Type &value) { return (int) value; });
Wenzel Jakob's avatar
Wenzel Jakob committed
950
951
952
953
954
955
956
        m_entries = entries;
    }

    /// Export enumeration entries into the parent scope
    void export_values() {
        PyObject *dict = ((PyTypeObject *) this->m_ptr)->tp_dict;
        PyObject *key, *value;
957
        ssize_t pos = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
958
959
960
961
962
963
964
        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) {
965
        this->attr(name) = pybind11::cast(value, return_value_policy::copy);
Wenzel Jakob's avatar
Wenzel Jakob committed
966
967
968
969
970
        (*m_entries)[(int) value] = name;
        return *this;
    }
private:
    std::unordered_map<int, const char *> *m_entries;
Wenzel Jakob's avatar
Wenzel Jakob committed
971
    handle m_parent;
Wenzel Jakob's avatar
Wenzel Jakob committed
972
973
974
};

NAMESPACE_BEGIN(detail)
975
template <typename... Args> struct init {
Wenzel Jakob's avatar
Wenzel Jakob committed
976
    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
977
        /// Function which calls a specific C++ in-place constructor
Wenzel Jakob's avatar
Wenzel Jakob committed
978
        class_.def("__init__", [](Base *instance, Args... args) { new (instance) Base(args...); }, extra...);
Wenzel Jakob's avatar
Wenzel Jakob committed
979
980
    }
};
981

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

987
    if (!nurse || !patient)
988
        pybind11_fail("Could not activate keep_alive!");
989

990
991
992
    if (patient.ptr() == Py_None)
        return; /* Nothing to keep alive */

993
    cpp_function disable_lifesupport(
994
        [patient](handle weakref) { patient.dec_ref(); weakref.dec_ref(); });
995

996
    weakref wr(nurse, disable_lifesupport);
997

998
999
    patient.inc_ref(); /* reference patient and leak the weak reference */
    (void) wr.release();
1000
1001
}

1002
1003
template <typename Iterator> struct iterator_state { Iterator it, end; };

Wenzel Jakob's avatar
Wenzel Jakob committed
1004
1005
NAMESPACE_END(detail)

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

1008
1009
1010
1011
1012
1013
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; })
1014
            .def("__next__", [](state &s) -> decltype(*std::declval<Iterator>()) {
1015
1016
1017
1018
1019
1020
1021
1022
1023
                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 });
}

1024
1025
1026
1027
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
1028
template <typename InputType, typename OutputType> void implicitly_convertible() {
1029
    auto implicit_caster = [](PyObject *obj, PyTypeObject *type) -> PyObject * {
Wenzel Jakob's avatar
Wenzel Jakob committed
1030
1031
1032
1033
1034
1035
1036
1037
1038
        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;
    };
1039
1040
    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
1041
    if (it == registered_types.end())
1042
        pybind11_fail("implicitly_convertible: Unable to find type " + type_id<OutputType>());
1043
    ((detail::type_info *) it->second)->implicit_conversions.push_back(implicit_caster);
Wenzel Jakob's avatar
Wenzel Jakob committed
1044
1045
}

1046
#if defined(WITH_THREAD)
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060

/* 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
1061
1062
1063
 *    thread would otherwise constantly construct and destroy thread state data
 *    structures.
 */
Wenzel Jakob's avatar
Wenzel Jakob committed
1064
1065
1066

class gil_scoped_acquire {
public:
1067
    PYBIND11_NOINLINE gil_scoped_acquire() {
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
        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;
1078
1079
1080
            #if PY_MAJOR_VERSION < 3
                PyThread_delete_key_value(internals.tstate);
            #endif
1081
1082
            PyThread_set_key_value(internals.tstate, tstate);
        } else {
1083
            release = detail::get_thread_state_unchecked() != tstate;
1084
1085
1086
1087
        }

        if (release) {
            /* Work around an annoying assertion in PyThreadState_Swap */
1088
1089
1090
1091
            #if defined(Py_DEBUG)
                PyInterpreterState *interp = tstate->interp;
                tstate->interp = nullptr;
            #endif
1092
            PyEval_AcquireThread(tstate);
1093
1094
1095
            #if defined(Py_DEBUG)
                tstate->interp = interp;
            #endif
1096
1097
1098
1099
1100
1101
1102
1103
1104
        }

        inc_ref();
    }

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

1105
    PYBIND11_NOINLINE void dec_ref() {
1106
1107
        --tstate->gilstate_counter;
        #if !defined(NDEBUG)
1108
            if (detail::get_thread_state_unchecked() != tstate)
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
                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();
1120
            PyThread_delete_key_value(detail::get_internals().tstate);
1121
1122
1123
1124
            release = false;
        }
    }

1125
    PYBIND11_NOINLINE ~gil_scoped_acquire() {
1126
1127
1128
1129
1130
1131
1132
        dec_ref();
        if (release)
           PyEval_SaveThread();
    }
private:
    PyThreadState *tstate = nullptr;
    bool release = true;
Wenzel Jakob's avatar
Wenzel Jakob committed
1133
1134
1135
1136
};

class gil_scoped_release {
public:
1137
1138
    gil_scoped_release(bool disassoc = false) : disassoc(disassoc) {
        tstate = PyEval_SaveThread();
1139
1140
1141
1142
1143
1144
1145
1146
        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
        }
1147
1148
1149
1150
1151
    }
    ~gil_scoped_release() {
        if (!tstate)
            return;
        PyEval_RestoreThread(tstate);
1152
1153
1154
1155
1156
1157
1158
        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);
        }
1159
1160
1161
1162
    }
private:
    PyThreadState *tstate;
    bool disassoc;
Wenzel Jakob's avatar
Wenzel Jakob committed
1163
};
1164
1165
1166
#else
class gil_scoped_acquire { };
class gil_scoped_release { };
1167
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
1168

1169
1170
inline function get_overload(const void *this_ptr, const char *name)  {
    handle py_object = detail::get_object_handle(this_ptr);
1171
1172
    if (!py_object)
        return function();
1173
1174
1175
    handle type = py_object.get_type();
    auto key = std::make_pair(type.ptr(), name);

1176
1177
    /* Cache functions that aren't overloaded in Python to avoid
       many costly Python dictionary lookups below */
1178
1179
1180
1181
1182
1183
1184
1185
1186
    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();
    }
1187

1188
    /* Don't call dispatch code if invoked from overridden function */
1189
    PyFrameObject *frame = PyThreadState_Get()->frame;
1190
    if (frame && (std::string) pybind11::handle(frame->f_code->co_name).str() == name &&
1191
1192
1193
1194
1195
1196
1197
        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();
    }
1198
1199
1200
    return overload;
}

1201
#define PYBIND11_OVERLOAD_INT(ret_type, class_name, name, ...) { \
1202
1203
        pybind11::gil_scoped_acquire gil; \
        pybind11::function overload = pybind11::get_overload(this, #name); \
1204
        if (overload) \
1205
            return overload(__VA_ARGS__).template cast<ret_type>();  }
1206

1207
1208
#define PYBIND11_OVERLOAD(ret_type, class_name, name, ...) \
    PYBIND11_OVERLOAD_INT(ret_type, class_name, name, __VA_ARGS__) \
1209
1210
    return class_name::name(__VA_ARGS__)

1211
1212
#define PYBIND11_OVERLOAD_PURE(ret_type, class_name, name, ...) \
    PYBIND11_OVERLOAD_INT(ret_type, class_name, name, __VA_ARGS__) \
1213
    pybind11::pybind11_fail("Tried to call pure virtual function \"" #name "\"");
1214

1215
NAMESPACE_END(pybind11)
Wenzel Jakob's avatar
Wenzel Jakob committed
1216
1217

#if defined(_MSC_VER)
Wenzel Jakob's avatar
Wenzel Jakob committed
1218
#  pragma warning(pop)
Ben Pritchard's avatar
Ben Pritchard committed
1219
1220
#elif defined(__ICC) || defined(__INTEL_COMPILER)
#  pragma warning(pop)
1221
#elif defined(__GNUG__) && !defined(__clang__)
Wenzel Jakob's avatar
Wenzel Jakob committed
1222
#  pragma GCC diagnostic pop
Wenzel Jakob's avatar
Wenzel Jakob committed
1223
#endif