cast.h 128 KB
Newer Older
Wenzel Jakob's avatar
Wenzel Jakob committed
1
/*
2
    pybind11/cast.h: Partial template specializations to cast between
Wenzel Jakob's avatar
Wenzel Jakob committed
3
4
    C++ and Python types

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
#ifndef PYBIND11_USE_SMART_HOLDER_AS_DEFAULT
14
#define PYBIND11_USE_SMART_HOLDER_AS_DEFAULT
15
16
#endif

17
#include "pytypes.h"
18
19
#include "detail/typeid.h"
#include "detail/descr.h"
20
#include "detail/internals.h"
21
#include "detail/smart_holder_poc.h"
Wenzel Jakob's avatar
Wenzel Jakob committed
22
#include <array>
Wenzel Jakob's avatar
Wenzel Jakob committed
23
#include <limits>
24
#include <tuple>
25
#include <type_traits>
Wenzel Jakob's avatar
Wenzel Jakob committed
26

27
28
29
30
31
32
33
34
35
36
37
38
39
#if defined(PYBIND11_CPP17)
#  if defined(__has_include)
#    if __has_include(<string_view>)
#      define PYBIND11_HAS_STRING_VIEW
#    endif
#  elif defined(_MSC_VER)
#    define PYBIND11_HAS_STRING_VIEW
#  endif
#endif
#ifdef PYBIND11_HAS_STRING_VIEW
#include <string_view>
#endif

40
41
42
43
#if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
#  define PYBIND11_HAS_U8STRING
#endif

44
PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
45
46
47

using pybindit::memory::smart_holder;

48
PYBIND11_NAMESPACE_BEGIN(detail)
49

50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/// A life support system for temporary objects created by `type_caster::load()`.
/// Adding a patient will keep it alive up until the enclosing function returns.
class loader_life_support {
public:
    /// A new patient frame is created when a function is entered
    loader_life_support() {
        get_internals().loader_patient_stack.push_back(nullptr);
    }

    /// ... and destroyed after it returns
    ~loader_life_support() {
        auto &stack = get_internals().loader_patient_stack;
        if (stack.empty())
            pybind11_fail("loader_life_support: internal error");

        auto ptr = stack.back();
        stack.pop_back();
        Py_CLEAR(ptr);

        // A heuristic to reduce the stack's capacity (e.g. after long recursive calls)
70
        if (stack.capacity() > 16 && !stack.empty() && stack.capacity() / stack.size() > 2)
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
            stack.shrink_to_fit();
    }

    /// This can only be used inside a pybind11-bound function, either by `argument_loader`
    /// at argument preparation time or by `py::cast()` at execution time.
    PYBIND11_NOINLINE static void add_patient(handle h) {
        auto &stack = get_internals().loader_patient_stack;
        if (stack.empty())
            throw cast_error("When called outside a bound function, py::cast() cannot "
                             "do Python -> C++ conversions which require the creation "
                             "of temporary values");

        auto &list_ptr = stack.back();
        if (list_ptr == nullptr) {
            list_ptr = PyList_New(1);
            if (!list_ptr)
                pybind11_fail("loader_life_support: error allocating list");
            PyList_SET_ITEM(list_ptr, 0, h.inc_ref().ptr());
        } else {
            auto result = PyList_Append(list_ptr, h.ptr());
            if (result == -1)
                pybind11_fail("loader_life_support: error adding patient");
        }
    }
};

97
98
99
100
101
102
103
104
105
106
107
// Gets the cache entry for the given type, creating it if necessary.  The return value is the pair
// returned by emplace, i.e. an iterator for the entry and a bool set to `true` if the entry was
// just created.
inline std::pair<decltype(internals::registered_types_py)::iterator, bool> all_type_info_get_cache(PyTypeObject *type);

// Populates a just-created cache entry.
PYBIND11_NOINLINE inline void all_type_info_populate(PyTypeObject *t, std::vector<type_info *> &bases) {
    std::vector<PyTypeObject *> check;
    for (handle parent : reinterpret_borrow<tuple>(t->tp_bases))
        check.push_back((PyTypeObject *) parent.ptr());

Wenzel Jakob's avatar
Wenzel Jakob committed
108
    auto const &type_dict = get_internals().registered_types_py;
109
110
111
112
113
114
    for (size_t i = 0; i < check.size(); i++) {
        auto type = check[i];
        // Ignore Python2 old-style class super type:
        if (!PyType_Check((PyObject *) type)) continue;

        // Check `type` in the current set of registered python types:
Wenzel Jakob's avatar
Wenzel Jakob committed
115
        auto it = type_dict.find(type);
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
        if (it != type_dict.end()) {
            // We found a cache entry for it, so it's either pybind-registered or has pre-computed
            // pybind bases, but we have to make sure we haven't already seen the type(s) before: we
            // want to follow Python/virtual C++ rules that there should only be one instance of a
            // common base.
            for (auto *tinfo : it->second) {
                // NB: Could use a second set here, rather than doing a linear search, but since
                // having a large number of immediate pybind11-registered types seems fairly
                // unlikely, that probably isn't worthwhile.
                bool found = false;
                for (auto *known : bases) {
                    if (known == tinfo) { found = true; break; }
                }
                if (!found) bases.push_back(tinfo);
            }
        }
        else if (type->tp_bases) {
            // It's some python type, so keep follow its bases classes to look for one or more
            // registered types
            if (i + 1 == check.size()) {
                // When we're at the end, we can pop off the current element to avoid growing
137
                // `check` when adding just one base (which is typical--i.e. when there is no
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
                // multiple inheritance)
                check.pop_back();
                i--;
            }
            for (handle parent : reinterpret_borrow<tuple>(type->tp_bases))
                check.push_back((PyTypeObject *) parent.ptr());
        }
    }
}

/**
 * Extracts vector of type_info pointers of pybind-registered roots of the given Python type.  Will
 * be just 1 pybind type for the Python type of a pybind-registered class, or for any Python-side
 * derived class that uses single inheritance.  Will contain as many types as required for a Python
 * class that uses multiple inheritance to inherit (directly or indirectly) from multiple
 * pybind-registered classes.  Will be empty if neither the type nor any base classes are
 * pybind-registered.
 *
 * The value is cached for the lifetime of the Python type.
 */
inline const std::vector<detail::type_info *> &all_type_info(PyTypeObject *type) {
    auto ins = all_type_info_get_cache(type);
    if (ins.second)
        // New cache entry: populate it
        all_type_info_populate(type, ins.first->second);

    return ins.first->second;
}

/**
 * Gets a single pybind11 type info for a python type.  Returns nullptr if neither the type nor any
 * ancestors are pybind11-registered.  Throws an exception if there are multiple bases--use
 * `all_type_info` instead if you want to support multiple bases.
 */
PYBIND11_NOINLINE inline detail::type_info* get_type_info(PyTypeObject *type) {
    auto &bases = all_type_info(type);
174
    if (bases.empty())
175
176
177
178
        return nullptr;
    if (bases.size() > 1)
        pybind11_fail("pybind11::detail::get_type_info: type has multiple pybind11-registered bases");
    return bases.front();
Wenzel Jakob's avatar
Wenzel Jakob committed
179
180
}

181
inline detail::type_info *get_local_type_info(const std::type_index &tp) {
182
    auto &locals = registered_local_types_cpp();
183
    auto it = locals.find(tp);
184
    if (it != locals.end())
185
        return it->second;
186
187
188
189
190
191
192
    return nullptr;
}

inline detail::type_info *get_global_type_info(const std::type_index &tp) {
    auto &types = get_internals().registered_types_cpp;
    auto it = types.find(tp);
    if (it != types.end())
193
        return it->second;
194
195
196
197
198
199
200
201
202
203
204
    return nullptr;
}

/// Return the type info for a given C++ type; on lookup failure can either throw or return nullptr.
PYBIND11_NOINLINE inline detail::type_info *get_type_info(const std::type_index &tp,
                                                          bool throw_if_missing = false) {
    if (auto ltype = get_local_type_info(tp))
        return ltype;
    if (auto gtype = get_global_type_info(tp))
        return gtype;

Wenzel Jakob's avatar
Wenzel Jakob committed
205
206
207
208
209
    if (throw_if_missing) {
        std::string tname = tp.name();
        detail::clean_type_id(tname);
        pybind11_fail("pybind11::detail::get_type_info: unable to find type info for \"" + tname + "\"");
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
210
211
212
    return nullptr;
}

Wenzel Jakob's avatar
Wenzel Jakob committed
213
214
PYBIND11_NOINLINE inline handle get_type_handle(const std::type_info &tp, bool throw_if_missing) {
    detail::type_info *type_info = get_type_info(tp, throw_if_missing);
Wenzel Jakob's avatar
Wenzel Jakob committed
215
216
217
    return handle(type_info ? ((PyObject *) type_info->type) : nullptr);
}

218
219
220
221
222
223
224
225
226
227
228
229
230
// Searches the inheritance graph for a registered Python instance, using all_type_info().
PYBIND11_NOINLINE inline handle find_registered_python_instance(void *src,
                                                                const detail::type_info *tinfo) {
    auto it_instances = get_internals().registered_instances.equal_range(src);
    for (auto it_i = it_instances.first; it_i != it_instances.second; ++it_i) {
        for (auto instance_type : detail::all_type_info(Py_TYPE(it_i->second))) {
            if (instance_type && same_type(*instance_type->cpptype, *tinfo->cpptype))
                return handle((PyObject *) it_i->second).inc_ref();
        }
    }
    return handle();
}

231
struct value_and_holder {
232
233
234
235
    instance *inst = nullptr;
    size_t index = 0u;
    const detail::type_info *type = nullptr;
    void **vh = nullptr;
236

237
    // Main constructor for a found value/holder:
238
239
240
241
242
    value_and_holder(instance *i, const detail::type_info *type, size_t vpos, size_t index) :
        inst{i}, index{index}, type{type},
        vh{inst->simple_layout ? inst->simple_value_holder : &inst->nonsimple.values_and_holders[vpos]}
    {}

243
    // Default constructor (used to signal a value-and-holder not found by get_value_and_holder())
244
    value_and_holder() = default;
245

246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
    // Used for past-the-end iterator
    value_and_holder(size_t index) : index{index} {}

    template <typename V = void> V *&value_ptr() const {
        return reinterpret_cast<V *&>(vh[0]);
    }
    // True if this `value_and_holder` has a non-null value pointer
    explicit operator bool() const { return value_ptr(); }

    template <typename H> H &holder() const {
        return reinterpret_cast<H &>(vh[1]);
    }
    bool holder_constructed() const {
        return inst->simple_layout
            ? inst->simple_holder_constructed
261
            : inst->nonsimple.status[index] & instance::status_holder_constructed;
262
    }
263
    void set_holder_constructed(bool v = true) {
264
        if (inst->simple_layout)
265
266
            inst->simple_holder_constructed = v;
        else if (v)
267
            inst->nonsimple.status[index] |= instance::status_holder_constructed;
268
269
        else
            inst->nonsimple.status[index] &= (uint8_t) ~instance::status_holder_constructed;
270
271
272
273
274
275
    }
    bool instance_registered() const {
        return inst->simple_layout
            ? inst->simple_instance_registered
            : inst->nonsimple.status[index] & instance::status_instance_registered;
    }
276
    void set_instance_registered(bool v = true) {
277
        if (inst->simple_layout)
278
279
            inst->simple_instance_registered = v;
        else if (v)
280
            inst->nonsimple.status[index] |= instance::status_instance_registered;
281
282
        else
            inst->nonsimple.status[index] &= (uint8_t) ~instance::status_instance_registered;
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
    }
};

// Container for accessing and iterating over an instance's values/holders
struct values_and_holders {
private:
    instance *inst;
    using type_vec = std::vector<detail::type_info *>;
    const type_vec &tinfo;

public:
    values_and_holders(instance *inst) : inst{inst}, tinfo(all_type_info(Py_TYPE(inst))) {}

    struct iterator {
    private:
298
299
        instance *inst = nullptr;
        const type_vec *types = nullptr;
300
301
        value_and_holder curr;
        friend struct values_and_holders;
302
303
        iterator(instance *inst, const type_vec *tinfo)
            : inst{inst}, types{tinfo},
304
            curr(inst /* instance */,
305
                 types->empty() ? nullptr : (*types)[0] /* type info */,
306
307
308
309
310
311
                 0, /* vpos: (non-simple types only): the first vptr comes first */
                 0 /* index */)
        {}
        // Past-the-end iterator:
        iterator(size_t end) : curr(end) {}
    public:
312
313
        bool operator==(const iterator &other) const { return curr.index == other.curr.index; }
        bool operator!=(const iterator &other) const { return curr.index != other.curr.index; }
314
        iterator &operator++() {
315
316
            if (!inst->simple_layout)
                curr.vh += 1 + (*types)[curr.index]->holder_size_in_ptrs;
317
            ++curr.index;
318
            curr.type = curr.index < types->size() ? (*types)[curr.index] : nullptr;
319
320
321
322
323
324
            return *this;
        }
        value_and_holder &operator*() { return curr; }
        value_and_holder *operator->() { return &curr; }
    };

325
    iterator begin() { return iterator(inst, &tinfo); }
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
    iterator end() { return iterator(tinfo.size()); }

    iterator find(const type_info *find_type) {
        auto it = begin(), endit = end();
        while (it != endit && it->type != find_type) ++it;
        return it;
    }

    size_t size() { return tinfo.size(); }
};

/**
 * Extracts C++ value and holder pointer references from an instance (which may contain multiple
 * values/holders for python-side multiple inheritance) that match the given type.  Throws an error
 * if the given type (or ValueType, if omitted) is not a pybind11 base of the given instance.  If
 * `find_type` is omitted (or explicitly specified as nullptr) the first value/holder are returned,
 * regardless of type (and the resulting .type will be nullptr).
 *
 * The returned object should be short-lived: in particular, it must not outlive the called-upon
 * instance.
 */
347
PYBIND11_NOINLINE inline value_and_holder instance::get_value_and_holder(const type_info *find_type /*= nullptr default in common.h*/, bool throw_if_missing /*= true in common.h*/) {
348
349
350
351
352
353
354
355
356
    // Optimize common case:
    if (!find_type || Py_TYPE(this) == find_type->type)
        return value_and_holder(this, find_type, 0, 0);

    detail::values_and_holders vhs(this);
    auto it = vhs.find(find_type);
    if (it != vhs.end())
        return *it;

357
358
359
    if (!throw_if_missing)
        return value_and_holder();

360
361
362
363
364
365
#if defined(NDEBUG)
    pybind11_fail("pybind11::detail::instance::get_value_and_holder: "
            "type is not a pybind11 base of the given instance "
            "(compile in debug mode for type details)");
#else
    pybind11_fail("pybind11::detail::instance::get_value_and_holder: `" +
366
367
            get_fully_qualified_tp_name(find_type->type) + "' is not a pybind11 base of the given `" +
            get_fully_qualified_tp_name(Py_TYPE(this)) + "' instance");
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
#endif
}

PYBIND11_NOINLINE inline void instance::allocate_layout() {
    auto &tinfo = all_type_info(Py_TYPE(this));

    const size_t n_types = tinfo.size();

    if (n_types == 0)
        pybind11_fail("instance allocation failed: new instance has no pybind11-registered base types");

    simple_layout =
        n_types == 1 && tinfo.front()->holder_size_in_ptrs <= instance_simple_holder_in_ptrs();

    // Simple path: no python-side multiple inheritance, and a small-enough holder
    if (simple_layout) {
        simple_value_holder[0] = nullptr;
        simple_holder_constructed = false;
386
        simple_instance_registered = false;
387
388
389
390
391
392
393
394
395
396
397
398
    }
    else { // multiple base types or a too-large holder
        // Allocate space to hold: [v1*][h1][v2*][h2]...[bb...] where [vN*] is a value pointer,
        // [hN] is the (uninitialized) holder instance for value N, and [bb...] is a set of bool
        // values that tracks whether each associated holder has been initialized.  Each [block] is
        // padded, if necessary, to an integer multiple of sizeof(void *).
        size_t space = 0;
        for (auto t : tinfo) {
            space += 1; // value pointer
            space += t->holder_size_in_ptrs; // holder instance
        }
        size_t flags_at = space;
399
        space += size_in_ptrs(n_types); // status bytes (holder_constructed and instance_registered)
400
401
402
403
404
405
406
407
408
409
410
411
412
413

        // Allocate space for flags, values, and holders, and initialize it to 0 (flags and values,
        // in particular, need to be 0).  Use Python's memory allocation functions: in Python 3.6
        // they default to using pymalloc, which is designed to be efficient for small allocations
        // like the one we're doing here; in earlier versions (and for larger allocations) they are
        // just wrappers around malloc.
#if PY_VERSION_HEX >= 0x03050000
        nonsimple.values_and_holders = (void **) PyMem_Calloc(space, sizeof(void *));
        if (!nonsimple.values_and_holders) throw std::bad_alloc();
#else
        nonsimple.values_and_holders = (void **) PyMem_New(void *, space);
        if (!nonsimple.values_and_holders) throw std::bad_alloc();
        std::memset(nonsimple.values_and_holders, 0, space * sizeof(void *));
#endif
414
        nonsimple.status = reinterpret_cast<uint8_t *>(&nonsimple.values_and_holders[flags_at]);
415
416
417
418
419
420
421
422
423
    }
    owned = true;
}

PYBIND11_NOINLINE inline void instance::deallocate_layout() {
    if (!simple_layout)
        PyMem_Free(nonsimple.values_and_holders);
}

424
PYBIND11_NOINLINE inline bool isinstance_generic(handle obj, const std::type_info &tp) {
Wenzel Jakob's avatar
Wenzel Jakob committed
425
    handle type = detail::get_type_handle(tp, false);
426
427
    if (!type)
        return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
428
    return isinstance(obj, type);
429
430
}

Wenzel Jakob's avatar
Wenzel Jakob committed
431
PYBIND11_NOINLINE inline std::string error_string() {
432
433
434
435
436
    if (!PyErr_Occurred()) {
        PyErr_SetString(PyExc_RuntimeError, "Unknown internal error occurred");
        return "Unknown internal error occurred";
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
437
    error_scope scope; // Preserve error state
Wenzel Jakob's avatar
Wenzel Jakob committed
438

439
    std::string errorString;
Wenzel Jakob's avatar
Wenzel Jakob committed
440
441
    if (scope.type) {
        errorString += handle(scope.type).attr("__name__").cast<std::string>();
Wenzel Jakob's avatar
Wenzel Jakob committed
442
443
        errorString += ": ";
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
444
    if (scope.value)
445
        errorString += (std::string) str(scope.value);
Wenzel Jakob's avatar
Wenzel Jakob committed
446

447
448
    PyErr_NormalizeException(&scope.type, &scope.value, &scope.trace);

449
450
451
452
453
#if PY_MAJOR_VERSION >= 3
    if (scope.trace != nullptr)
        PyException_SetTraceback(scope.value, scope.trace);
#endif

Wenzel Jakob's avatar
Wenzel Jakob committed
454
#if !defined(PYPY_VERSION)
455
    if (scope.trace) {
456
        auto *trace = (PyTracebackObject *) scope.trace;
457
458
459
460
461
462
463
464
465
466
467
468
469
470

        /* Get the deepest trace possible */
        while (trace->tb_next)
            trace = trace->tb_next;

        PyFrameObject *frame = trace->tb_frame;
        errorString += "\n\nAt:\n";
        while (frame) {
            int lineno = PyFrame_GetLineNumber(frame);
            errorString +=
                "  " + handle(frame->f_code->co_filename).cast<std::string>() +
                "(" + std::to_string(lineno) + "): " +
                handle(frame->f_code->co_name).cast<std::string>() + "\n";
            frame = frame->f_back;
471
472
        }
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
473
#endif
474

Wenzel Jakob's avatar
Wenzel Jakob committed
475
476
477
    return errorString;
}

478
479
480
481
PYBIND11_NOINLINE inline handle get_object_handle(const void *ptr, const detail::type_info *type ) {
    auto &instances = get_internals().registered_instances;
    auto range = instances.equal_range(ptr);
    for (auto it = range.first; it != range.second; ++it) {
482
        for (const auto &vh : values_and_holders(it->second)) {
483
484
485
            if (vh.type == type)
                return handle((PyObject *) it->second);
        }
486
487
    }
    return handle();
Wenzel Jakob's avatar
Wenzel Jakob committed
488
489
}

490
inline PyThreadState *get_thread_state_unchecked() {
Wenzel Jakob's avatar
Wenzel Jakob committed
491
492
493
#if defined(PYPY_VERSION)
    return PyThreadState_GET();
#elif PY_VERSION_HEX < 0x03000000
494
495
496
497
498
499
500
501
502
503
    return _PyThreadState_Current;
#elif PY_VERSION_HEX < 0x03050000
    return (PyThreadState*) _Py_atomic_load_relaxed(&_PyThreadState_Current);
#elif PY_VERSION_HEX < 0x03050200
    return (PyThreadState*) _PyThreadState_Current.value;
#else
    return _PyThreadState_UncheckedGet();
#endif
}

504
// Forward declarations
505
inline void keep_alive_impl(handle nurse, handle patient);
506
inline PyObject *make_new_instance(PyTypeObject *type);
507

Wenzel Jakob's avatar
Wenzel Jakob committed
508
509
510
class type_caster_generic {
public:
    PYBIND11_NOINLINE type_caster_generic(const std::type_info &type_info)
511
        : typeinfo(get_type_info(type_info)), cpptype(&type_info) { }
Wenzel Jakob's avatar
Wenzel Jakob committed
512

513
514
    type_caster_generic(const type_info *typeinfo)
        : typeinfo(typeinfo), cpptype(typeinfo ? typeinfo->cpptype : nullptr) { }
515

516
517
    bool load(handle src, bool convert) {
        return load_impl<type_caster_generic>(src, convert);
Wenzel Jakob's avatar
Wenzel Jakob committed
518
519
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
520
    PYBIND11_NOINLINE static handle cast(const void *_src, return_value_policy policy, handle parent,
521
                                         const detail::type_info *tinfo,
Wenzel Jakob's avatar
Wenzel Jakob committed
522
                                         void *(*copy_constructor)(const void *),
Wenzel Jakob's avatar
Wenzel Jakob committed
523
                                         void *(*move_constructor)(const void *),
Wenzel Jakob's avatar
Wenzel Jakob committed
524
                                         const void *existing_holder = nullptr) {
525
        if (!tinfo) // no type info: error will be set already
Wenzel Jakob's avatar
Wenzel Jakob committed
526
527
            return handle();

528
529
530
        void *src = const_cast<void *>(_src);
        if (src == nullptr)
            return none().release();
531

532
533
        if (handle registered_inst = find_registered_python_instance(src, tinfo))
            return registered_inst;
534

535
        auto inst = reinterpret_steal<object>(make_new_instance(tinfo->type));
536
        auto wrapper = reinterpret_cast<instance *>(inst.ptr());
537
        wrapper->owned = false;
538
        void *&valueptr = values_and_holders(wrapper).begin()->value_ptr();
539
540

        switch (policy) {
Wenzel Jakob's avatar
Wenzel Jakob committed
541
542
            case return_value_policy::automatic:
            case return_value_policy::take_ownership:
543
                valueptr = src;
Wenzel Jakob's avatar
Wenzel Jakob committed
544
545
546
547
548
                wrapper->owned = true;
                break;

            case return_value_policy::automatic_reference:
            case return_value_policy::reference:
549
                valueptr = src;
Wenzel Jakob's avatar
Wenzel Jakob committed
550
551
552
553
554
                wrapper->owned = false;
                break;

            case return_value_policy::copy:
                if (copy_constructor)
555
                    valueptr = copy_constructor(src);
556
557
558
559
560
561
562
563
564
565
566
                else {
#if defined(NDEBUG)
                    throw cast_error("return_value_policy = copy, but type is "
                                     "non-copyable! (compile in debug mode for details)");
#else
                    std::string type_name(tinfo->cpptype->name());
                    detail::clean_type_id(type_name);
                    throw cast_error("return_value_policy = copy, but type " +
                                     type_name + " is non-copyable!");
#endif
                }
Wenzel Jakob's avatar
Wenzel Jakob committed
567
568
569
570
571
                wrapper->owned = true;
                break;

            case return_value_policy::move:
                if (move_constructor)
572
                    valueptr = move_constructor(src);
Wenzel Jakob's avatar
Wenzel Jakob committed
573
                else if (copy_constructor)
574
                    valueptr = copy_constructor(src);
575
576
577
578
579
580
581
582
583
584
585
586
                else {
#if defined(NDEBUG)
                    throw cast_error("return_value_policy = move, but type is neither "
                                     "movable nor copyable! "
                                     "(compile in debug mode for details)");
#else
                    std::string type_name(tinfo->cpptype->name());
                    detail::clean_type_id(type_name);
                    throw cast_error("return_value_policy = move, but type " +
                                     type_name + " is neither movable nor copyable!");
#endif
                }
Wenzel Jakob's avatar
Wenzel Jakob committed
587
588
589
590
                wrapper->owned = true;
                break;

            case return_value_policy::reference_internal:
591
                valueptr = src;
Wenzel Jakob's avatar
Wenzel Jakob committed
592
                wrapper->owned = false;
593
                keep_alive_impl(inst, parent);
Wenzel Jakob's avatar
Wenzel Jakob committed
594
595
596
597
                break;

            default:
                throw cast_error("unhandled return_value_policy: should not happen!");
Wenzel Jakob's avatar
Wenzel Jakob committed
598
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
599

600
        tinfo->init_instance(wrapper, existing_holder);
601

Wenzel Jakob's avatar
Wenzel Jakob committed
602
        return inst.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
603
604
    }

605
    // Base methods for generic caster; there are overridden in copyable_holder_caster
606
607
608
609
610
    void load_value(value_and_holder &&v_h) {
        auto *&vptr = v_h.value_ptr();
        // Lazy allocation for unallocated values:
        if (vptr == nullptr) {
            auto *type = v_h.type ? v_h.type : typeinfo;
611
612
613
            if (type->operator_new) {
                vptr = type->operator_new(type->type_size);
            } else {
614
                #if defined(__cpp_aligned_new) && (!defined(_MSC_VER) || _MSC_VER >= 1912)
615
616
                    if (type->type_align > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
                        vptr = ::operator new(type->type_size,
617
                                              std::align_val_t(type->type_align));
618
619
620
621
                    else
                #endif
                vptr = ::operator new(type->type_size);
            }
622
623
        }
        value = vptr;
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
    }
    bool try_implicit_casts(handle src, bool convert) {
        for (auto &cast : typeinfo->implicit_casts) {
            type_caster_generic sub_caster(*cast.first);
            if (sub_caster.load(src, convert)) {
                value = cast.second(sub_caster.value);
                return true;
            }
        }
        return false;
    }
    bool try_direct_conversions(handle src) {
        for (auto &converter : *typeinfo->direct_conversions) {
            if (converter(src.ptr(), value))
                return true;
        }
        return false;
    }
    void check_holder_compat() {}

644
645
646
647
648
649
650
651
652
653
    PYBIND11_NOINLINE static void *local_load(PyObject *src, const type_info *ti) {
        auto caster = type_caster_generic(ti);
        if (caster.load(src, false))
            return caster.value;
        return nullptr;
    }

    /// Try to load with foreign typeinfo, if available. Used when there is no
    /// native typeinfo, or when the native one wasn't able to produce a value.
    PYBIND11_NOINLINE bool try_load_foreign_module_local(handle src) {
654
        constexpr auto *local_key = PYBIND11_MODULE_LOCAL_ID;
655
        const auto pytype = type::handle_of(src);
656
657
658
659
660
661
        if (!hasattr(pytype, local_key))
            return false;

        type_info *foreign_typeinfo = reinterpret_borrow<capsule>(getattr(pytype, local_key));
        // Only consider this foreign loader if actually foreign and is a loader of the correct cpp type
        if (foreign_typeinfo->module_local_load == &local_load
662
            || (cpptype && !same_type(*cpptype, *foreign_typeinfo->cpptype)))
663
664
665
666
667
668
669
670
671
            return false;

        if (auto result = foreign_typeinfo->module_local_load(src.ptr(), foreign_typeinfo)) {
            value = result;
            return true;
        }
        return false;
    }

672
673
674
675
676
    // Implementation of `load`; this takes the type of `this` so that it can dispatch the relevant
    // bits of code between here and copyable_holder_caster where the two classes need different
    // logic (without having to resort to virtual inheritance).
    template <typename ThisT>
    PYBIND11_NOINLINE bool load_impl(handle src, bool convert) {
677
678
        if (!src) return false;
        if (!typeinfo) return try_load_foreign_module_local(src);
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
        if (src.is_none()) {
            // Defer accepting None to other overloads (if we aren't in convert mode):
            if (!convert) return false;
            value = nullptr;
            return true;
        }

        auto &this_ = static_cast<ThisT &>(*this);
        this_.check_holder_compat();

        PyTypeObject *srctype = Py_TYPE(src.ptr());

        // Case 1: If src is an exact type match for the target type then we can reinterpret_cast
        // the instance's value pointer to the target type:
        if (srctype == typeinfo->type) {
            this_.load_value(reinterpret_cast<instance *>(src.ptr())->get_value_and_holder());
            return true;
        }
        // Case 2: We have a derived class
        else if (PyType_IsSubtype(srctype, typeinfo->type)) {
            auto &bases = all_type_info(srctype);
            bool no_cpp_mi = typeinfo->simple_type;

            // Case 2a: the python type is a Python-inherited derived class that inherits from just
            // one simple (no MI) pybind11 class, or is an exact match, so the C++ instance is of
            // the right type and we can use reinterpret_cast.
            // (This is essentially the same as case 2b, but because not using multiple inheritance
            // is extremely common, we handle it specially to avoid the loop iterator and type
            // pointer lookup overhead)
            if (bases.size() == 1 && (no_cpp_mi || bases.front()->type == typeinfo->type)) {
                this_.load_value(reinterpret_cast<instance *>(src.ptr())->get_value_and_holder());
                return true;
            }
            // Case 2b: the python type inherits from multiple C++ bases.  Check the bases to see if
            // we can find an exact match (or, for a simple C++ type, an inherited match); if so, we
            // can safely reinterpret_cast to the relevant pointer.
            else if (bases.size() > 1) {
                for (auto base : bases) {
                    if (no_cpp_mi ? PyType_IsSubtype(base->type, typeinfo->type) : base->type == typeinfo->type) {
                        this_.load_value(reinterpret_cast<instance *>(src.ptr())->get_value_and_holder(base));
                        return true;
                    }
                }
            }

            // Case 2c: C++ multiple inheritance is involved and we couldn't find an exact type match
            // in the registered bases, above, so try implicit casting (needed for proper C++ casting
            // when MI is involved).
            if (this_.try_implicit_casts(src, convert))
                return true;
        }

        // Perform an implicit conversion
        if (convert) {
            for (auto &converter : typeinfo->implicit_conversions) {
734
735
736
                auto temp = reinterpret_steal<object>(converter(src.ptr(), typeinfo->type));
                if (load_impl<ThisT>(temp, false)) {
                    loader_life_support::add_patient(temp);
737
                    return true;
738
                }
739
740
741
742
            }
            if (this_.try_direct_conversions(src))
                return true;
        }
743
744
745
746
747
748
749
750
751
752
753

        // Failed to match local typeinfo. Try again with global.
        if (typeinfo->module_local) {
            if (auto gtype = get_global_type_info(*typeinfo->cpptype)) {
                typeinfo = gtype;
                return load(src, false);
            }
        }

        // Global typeinfo has precedence over foreign module_local
        return try_load_foreign_module_local(src);
754
755
756
    }


757
758
759
760
    // Called to do type lookup and wrap the pointer and type in a pair when a dynamic_cast
    // isn't needed or can't be used.  If the type is unknown, sets the error and returns a pair
    // with .second = nullptr.  (p.first = nullptr is not an error: it becomes None).
    PYBIND11_NOINLINE static std::pair<const void *, const type_info *> src_and_type(
761
            const void *src, const std::type_info &cast_type, const std::type_info *rtti_type = nullptr) {
762
763
        if (auto *tpi = get_type_info(cast_type))
            return {src, const_cast<const type_info *>(tpi)};
764
765

        // Not found, set error:
766
        std::string tname = rtti_type ? rtti_type->name() : cast_type.name();
767
768
769
770
771
772
        detail::clean_type_id(tname);
        std::string msg = "Unregistered type : " + tname;
        PyErr_SetString(PyExc_TypeError, msg.c_str());
        return {nullptr, nullptr};
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
773
    const type_info *typeinfo = nullptr;
774
    const std::type_info *cpptype = nullptr;
775
    void *value = nullptr;
Wenzel Jakob's avatar
Wenzel Jakob committed
776
777
};

778
779
780
781
782
783
784
/**
 * Determine suitable casting operator for pointer-or-lvalue-casting type casters.  The type caster
 * needs to provide `operator T*()` and `operator T&()` operators.
 *
 * If the type supports moving the value away via an `operator T&&() &&` method, it should use
 * `movable_cast_op_type` instead.
 */
785
template <typename T>
786
using cast_op_type =
787
    conditional_t<std::is_pointer<remove_reference_t<T>>::value,
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
        typename std::add_pointer<intrinsic_t<T>>::type,
        typename std::add_lvalue_reference<intrinsic_t<T>>::type>;

/**
 * Determine suitable casting operator for a type caster with a movable value.  Such a type caster
 * needs to provide `operator T*()`, `operator T&()`, and `operator T&&() &&`.  The latter will be
 * called in appropriate contexts where the value can be moved rather than copied.
 *
 * These operator are automatically provided when using the PYBIND11_TYPE_CASTER macro.
 */
template <typename T>
using movable_cast_op_type =
    conditional_t<std::is_pointer<typename std::remove_reference<T>::type>::value,
        typename std::add_pointer<intrinsic_t<T>>::type,
    conditional_t<std::is_rvalue_reference<T>::value,
        typename std::add_rvalue_reference<intrinsic_t<T>>::type,
        typename std::add_lvalue_reference<intrinsic_t<T>>::type>>;
805

806
807
808
809
810
811
812
// std::is_copy_constructible isn't quite enough: it lets std::vector<T> (and similar) through when
// T is non-copyable, but code containing such a copy constructor fails to actually compile.
template <typename T, typename SFINAE = void> struct is_copy_constructible : std::is_copy_constructible<T> {};

// Specialization for types that appear to be copy constructible but also look like stl containers
// (we specifically check for: has `value_type` and `reference` with `reference = value_type&`): if
// so, copy constructability depends on whether the value_type is copy constructible.
813
814
template <typename Container> struct is_copy_constructible<Container, enable_if_t<all_of<
        std::is_copy_constructible<Container>,
815
816
817
        std::is_same<typename Container::value_type &, typename Container::reference>,
        // Avoid infinite recursion
        negation<std::is_same<Container, typename Container::value_type>>
818
819
    >::value>> : is_copy_constructible<typename Container::value_type> {};

820
821
822
// Likewise for std::pair
// (after C++17 it is mandatory that the copy constructor not exist when the two types aren't themselves
// copy constructible, but this can not be relied upon when T1 or T2 are themselves containers).
823
824
template <typename T1, typename T2> struct is_copy_constructible<std::pair<T1, T2>>
    : all_of<is_copy_constructible<T1>, is_copy_constructible<T2>> {};
825
826
827
828
829
830
831
832
833

// The same problems arise with std::is_copy_assignable, so we use the same workaround.
template <typename T, typename SFINAE = void> struct is_copy_assignable : std::is_copy_assignable<T> {};
template <typename Container> struct is_copy_assignable<Container, enable_if_t<all_of<
        std::is_copy_assignable<Container>,
        std::is_same<typename Container::value_type &, typename Container::reference>
    >::value>> : is_copy_assignable<typename Container::value_type> {};
template <typename T1, typename T2> struct is_copy_assignable<std::pair<T1, T2>>
    : all_of<is_copy_assignable<T1>, is_copy_assignable<T2>> {};
834

835
PYBIND11_NAMESPACE_END(detail)
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853

// polymorphic_type_hook<itype>::get(src, tinfo) determines whether the object pointed
// to by `src` actually is an instance of some class derived from `itype`.
// If so, it sets `tinfo` to point to the std::type_info representing that derived
// type, and returns a pointer to the start of the most-derived object of that type
// (in which `src` is a subobject; this will be the same address as `src` in most
// single inheritance cases). If not, or if `src` is nullptr, it simply returns `src`
// and leaves `tinfo` at its default value of nullptr.
//
// The default polymorphic_type_hook just returns src. A specialization for polymorphic
// types determines the runtime type of the passed object and adjusts the this-pointer
// appropriately via dynamic_cast<void*>. This is what enables a C++ Animal* to appear
// to Python as a Dog (if Dog inherits from Animal, Animal is polymorphic, Dog is
// registered with pybind11, and this Animal is in fact a Dog).
//
// You may specialize polymorphic_type_hook yourself for types that want to appear
// polymorphic to Python but do not use C++ RTTI. (This is a not uncommon pattern
// in performance-sensitive applications, used most notably in LLVM.)
854
855
856
857
//
// polymorphic_type_hook_base allows users to specialize polymorphic_type_hook with
// std::enable_if. User provided specializations will always have higher priority than
// the default implementation and specialization provided in polymorphic_type_hook_base.
858
template <typename itype, typename SFINAE = void>
859
struct polymorphic_type_hook_base
860
861
862
863
{
    static const void *get(const itype *src, const std::type_info*&) { return src; }
};
template <typename itype>
864
struct polymorphic_type_hook_base<itype, detail::enable_if_t<std::is_polymorphic<itype>::value>>
865
866
867
868
869
870
{
    static const void *get(const itype *src, const std::type_info*& type) {
        type = src ? &typeid(*src) : nullptr;
        return dynamic_cast<const void*>(src);
    }
};
871
872
template <typename itype, typename SFINAE = void>
struct polymorphic_type_hook : public polymorphic_type_hook_base<itype> {};
873

874
PYBIND11_NAMESPACE_BEGIN(detail)
875

876
/// Generic type caster for objects stored on the heap
877
template <typename type> class type_caster_base : public type_caster_generic {
878
    using itype = intrinsic_t<type>;
879

880
public:
881
    static constexpr auto name = _<type>();
882

Wenzel Jakob's avatar
Wenzel Jakob committed
883
    type_caster_base() : type_caster_base(typeid(type)) { }
884
    explicit type_caster_base(const std::type_info &info) : type_caster_generic(info) { }
885

886
    static handle cast(const itype &src, return_value_policy policy, handle parent) {
887
        if (policy == return_value_policy::automatic || policy == return_value_policy::automatic_reference)
888
            policy = return_value_policy::copy;
889
        return cast(&src, policy, parent);
890
891
    }

892
893
    static handle cast(itype &&src, return_value_policy, handle parent) {
        return cast(&src, return_value_policy::move, parent);
Wenzel Jakob's avatar
Wenzel Jakob committed
894
895
    }

896
897
898
    // Returns a (pointer, type_info) pair taking care of necessary type lookup for a
    // polymorphic type (using RTTI by default, but can be overridden by specializing
    // polymorphic_type_hook). If the instance isn't derived, returns the base version.
899
    static std::pair<const void *, const type_info *> src_and_type(const itype *src) {
900
        auto &cast_type = typeid(itype);
901
        const std::type_info *instance_type = nullptr;
902
903
904
905
906
907
908
909
910
911
912
913
        const void *vsrc = polymorphic_type_hook<itype>::get(src, instance_type);
        if (instance_type && !same_type(cast_type, *instance_type)) {
            // This is a base pointer to a derived type. If the derived type is registered
            // with pybind11, we want to make the full derived object available.
            // In the typical case where itype is polymorphic, we get the correct
            // derived pointer (which may be != base pointer) by a dynamic_cast to
            // most derived type. If itype is not polymorphic, we won't get here
            // except via a user-provided specialization of polymorphic_type_hook,
            // and the user has promised that no this-pointer adjustment is
            // required in that case, so it's OK to use static_cast.
            if (const auto *tpi = get_type_info(*instance_type))
                return {vsrc, tpi};
914
915
916
        }
        // Otherwise we have either a nullptr, an `itype` pointer, or an unknown derived pointer, so
        // don't do a cast
917
        return type_caster_generic::src_and_type(src, cast_type, instance_type);
918
919
    }

920
    static handle cast(const itype *src, return_value_policy policy, handle parent) {
921
        auto st = src_and_type(src);
Wenzel Jakob's avatar
Wenzel Jakob committed
922
        return type_caster_generic::cast(
923
            st.first, policy, parent, st.second,
924
            make_copy_constructor(src), make_move_constructor(src));
925
926
    }

927
    static handle cast_holder(const itype *src, const void *holder) {
928
        auto st = src_and_type(src);
929
        return type_caster_generic::cast(
930
            st.first, return_value_policy::take_ownership, {}, st.second,
931
932
933
            nullptr, nullptr, holder);
    }

934
    template <typename T> using cast_op_type = detail::cast_op_type<T>;
935

936
937
    operator itype*() { return (type *) value; }
    operator itype&() { if (!value) throw reference_cast_error(); return *((itype *) value); }
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959

protected:
    using Constructor = void *(*)(const void *);

    /* Only enabled when the types are {copy,move}-constructible *and* when the type
       does not have a private operator new implementation. */
    template <typename T, typename = enable_if_t<is_copy_constructible<T>::value>>
    static auto make_copy_constructor(const T *x) -> decltype(new T(*x), Constructor{}) {
        return [](const void *arg) -> void * {
            return new T(*reinterpret_cast<const T *>(arg));
        };
    }

    template <typename T, typename = enable_if_t<std::is_move_constructible<T>::value>>
    static auto make_move_constructor(const T *x) -> decltype(new T(std::move(*const_cast<T *>(x))), Constructor{}) {
        return [](const void *arg) -> void * {
            return new T(std::move(*const_cast<T *>(reinterpret_cast<const T *>(arg))));
        };
    }

    static Constructor make_copy_constructor(...) { return nullptr; }
    static Constructor make_move_constructor(...) { return nullptr; }
960
961
};

962
963
964
965
966
967
// Tag to be used as base class, inspected by is_smart_holder_type_caster<T> test.
struct is_smart_holder_type_caster_base_tag {};

template <typename T>
struct is_smart_holder_type_caster;

968
//DETAIL/SMART_HOLDER_TYPE_CASTERS_H/BEGIN/////////////////////////////////////////////////////////
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992

//FWD begin
inline void register_instance(instance *self, void *valptr, const type_info *tinfo);
inline bool deregister_instance(instance *self, void *valptr, const type_info *tinfo);
//FWD end

// The modified_type_caster_generic_load_impl could replace type_caster_generic::load_impl but not
// vice versa. The main difference is that the original code only propagates a reference to the
// held value, while the modified implementation propagates value_and_holder.
// clang-format off
class modified_type_caster_generic_load_impl {
public:
    PYBIND11_NOINLINE modified_type_caster_generic_load_impl(const std::type_info &type_info)
        : typeinfo(get_type_info(type_info)), cpptype(&type_info) { }

    explicit modified_type_caster_generic_load_impl(const type_info *typeinfo = nullptr)
        : typeinfo(typeinfo), cpptype(typeinfo ? typeinfo->cpptype : nullptr) { }

    bool load(handle src, bool convert) {
        return load_impl<modified_type_caster_generic_load_impl>(src, convert);
    }

    // Base methods for generic caster; there are overridden in copyable_holder_caster
    void load_value_and_holder(value_and_holder &&v_h) {
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
        if (!v_h.holder_constructed()) {
            // This is needed for old-style __init__.
            // type_caster_generic::load_value BEGIN
            auto *&vptr = v_h.value_ptr();
            // Lazy allocation for unallocated values:
            if (vptr == nullptr) {
                // Lazy allocation for unallocated values:
                auto *type = v_h.type ? v_h.type : typeinfo;
                if (type->operator_new) {
                    vptr = type->operator_new(type->type_size);
                } else {
                    #if defined(__cpp_aligned_new) && (!defined(_MSC_VER) || _MSC_VER >= 1912)
                        if (type->type_align > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
                            vptr = ::operator new(type->type_size,
                                                  std::align_val_t(type->type_align));
                        else
                    #endif
                    vptr = ::operator new(type->type_size);
                }
            }
            // type_caster_generic::load_value END
1014
        }
1015
        loaded_v_h = std::move(v_h);
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
        loaded_v_h.type = typeinfo;
    }

    bool try_implicit_casts(handle src, bool convert) {
        for (auto &cast : typeinfo->implicit_casts) {
            modified_type_caster_generic_load_impl sub_caster(*cast.first);
            if (sub_caster.load(src, convert)) {
                if (loaded_v_h_cpptype != nullptr) {
                    pybind11_fail("smart_holder_type_casters: try_implicit_casts failure.");
                }
                loaded_v_h = sub_caster.loaded_v_h;
                loaded_v_h_cpptype = cast.first;
                implicit_cast = cast.second;
                return true;
            }
        }
        return false;
    }

    bool try_direct_conversions(handle src) {
        for (auto &converter : *typeinfo->direct_conversions) {
1037
            if (converter(src.ptr(), unowned_void_ptr_from_direct_conversion)) {
1038
                return true;
1039
            }
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
        }
        return false;
    }

    PYBIND11_NOINLINE static void *local_load(PyObject *src, const type_info *ti) {
        std::unique_ptr<modified_type_caster_generic_load_impl> loader(
            new modified_type_caster_generic_load_impl(ti));
        if (loader->load(src, false)) {
            // Trick to work with the existing pybind11 internals.
            // The void pointer is immediately captured in a new unique_ptr in
            // try_load_foreign_module_local. If this assumption is violated sanitizers
            // will most likely flag a leak (verified to be the case with ASAN).
            return static_cast<void *>(loader.release());
        }
        return nullptr;
    }

    /// Try to load with foreign typeinfo, if available. Used when there is no
    /// native typeinfo, or when the native one wasn't able to produce a value.
    PYBIND11_NOINLINE bool try_load_foreign_module_local(handle src) {
        constexpr auto *local_key = PYBIND11_MODULE_LOCAL_ID;
        const auto pytype = type::handle_of(src);
        if (!hasattr(pytype, local_key))
            return false;

        type_info *foreign_typeinfo = reinterpret_borrow<capsule>(getattr(pytype, local_key));
        // Only consider this foreign loader if actually foreign and is a loader of the correct cpp type
        if (foreign_typeinfo->module_local_load == &local_load
            || (cpptype && !same_type(*cpptype, *foreign_typeinfo->cpptype)))
            return false;

        void* foreign_loader_void_ptr =
            foreign_typeinfo->module_local_load(src.ptr(), foreign_typeinfo);
        if (foreign_loader_void_ptr != nullptr) {
            auto foreign_loader = std::unique_ptr<modified_type_caster_generic_load_impl>(
                static_cast<modified_type_caster_generic_load_impl *>(foreign_loader_void_ptr));
            // Magic number intentionally hard-coded for simplicity and maximum robustness.
            if (foreign_loader->local_load_safety_guard != 1887406645) {
                pybind11_fail(
                    "smart_holder_type_casters: Unexpected local_load_safety_guard,"
                    " possibly due to py::class_ holder mixup.");
            }
            if (loaded_v_h_cpptype != nullptr) {
                pybind11_fail("smart_holder_type_casters: try_load_foreign_module_local failure.");
            }
            loaded_v_h = foreign_loader->loaded_v_h;
            loaded_v_h_cpptype = foreign_loader->loaded_v_h_cpptype;
            implicit_cast = foreign_loader->implicit_cast;
            return true;
        }
        return false;
    }

    // Implementation of `load`; this takes the type of `this` so that it can dispatch the relevant
    // bits of code between here and copyable_holder_caster where the two classes need different
    // logic (without having to resort to virtual inheritance).
    template <typename ThisT>
    PYBIND11_NOINLINE bool load_impl(handle src, bool convert) {
        if (!src) return false;
        if (!typeinfo) return try_load_foreign_module_local(src);
        if (src.is_none()) {
            // Defer accepting None to other overloads (if we aren't in convert mode):
            if (!convert) return false;
            loaded_v_h = value_and_holder();
            return true;
        }

        auto &this_ = static_cast<ThisT &>(*this);

        PyTypeObject *srctype = Py_TYPE(src.ptr());

        // Case 1: If src is an exact type match for the target type then we can reinterpret_cast
        // the instance's value pointer to the target type:
        if (srctype == typeinfo->type) {
            this_.load_value_and_holder(reinterpret_cast<instance *>(src.ptr())->get_value_and_holder());
            return true;
        }
        // Case 2: We have a derived class
        else if (PyType_IsSubtype(srctype, typeinfo->type)) {
            auto &bases = all_type_info(srctype); // subtype bases
            bool no_cpp_mi = typeinfo->simple_type;

            // Case 2a: the python type is a Python-inherited derived class that inherits from just
            // one simple (no MI) pybind11 class, or is an exact match, so the C++ instance is of
            // the right type and we can use reinterpret_cast.
            // (This is essentially the same as case 2b, but because not using multiple inheritance
            // is extremely common, we handle it specially to avoid the loop iterator and type
            // pointer lookup overhead)
            if (bases.size() == 1 && (no_cpp_mi || bases.front()->type == typeinfo->type)) {
                this_.load_value_and_holder(reinterpret_cast<instance *>(src.ptr())->get_value_and_holder());
                loaded_v_h_cpptype = bases.front()->cpptype;
                reinterpret_cast_deemed_ok = true;
                return true;
            }
            // Case 2b: the python type inherits from multiple C++ bases.  Check the bases to see if
            // we can find an exact match (or, for a simple C++ type, an inherited match); if so, we
            // can safely reinterpret_cast to the relevant pointer.
            else if (bases.size() > 1) {
                for (auto base : bases) {
                    if (no_cpp_mi ? PyType_IsSubtype(base->type, typeinfo->type) : base->type == typeinfo->type) {
                        this_.load_value_and_holder(reinterpret_cast<instance *>(src.ptr())->get_value_and_holder(base));
                        loaded_v_h_cpptype = base->cpptype;
                        reinterpret_cast_deemed_ok = true;
                        return true;
                    }
                }
            }

            // Case 2c: C++ multiple inheritance is involved and we couldn't find an exact type match
            // in the registered bases, above, so try implicit casting (needed for proper C++ casting
            // when MI is involved).
            if (this_.try_implicit_casts(src, convert)) {
                return true;
            }
        }

        // Perform an implicit conversion
        if (convert) {
            for (auto &converter : typeinfo->implicit_conversions) {
                auto temp = reinterpret_steal<object>(converter(src.ptr(), typeinfo->type));
                if (load_impl<ThisT>(temp, false)) {
                    loader_life_support::add_patient(temp);
                    return true;
                }
            }
            if (this_.try_direct_conversions(src))
                return true;
        }

        // Failed to match local typeinfo. Try again with global.
        if (typeinfo->module_local) {
            if (auto gtype = get_global_type_info(*typeinfo->cpptype)) {
                typeinfo = gtype;
                return load(src, false);
            }
        }

        // Global typeinfo has precedence over foreign module_local
        return try_load_foreign_module_local(src);
    }

    const type_info *typeinfo = nullptr;
    const std::type_info *cpptype = nullptr;
1183
    void *unowned_void_ptr_from_direct_conversion = nullptr;
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
    const std::type_info *loaded_v_h_cpptype = nullptr;
    void *(*implicit_cast)(void *) = nullptr;
    value_and_holder loaded_v_h;
    bool reinterpret_cast_deemed_ok = false;
    // Magic number intentionally hard-coded, to guard against class_ holder mixups.
    // Ideally type_caster_generic would have a similar guard, but this requires a change there.
    std::size_t local_load_safety_guard = 1887406645; // 32-bit compatible value for portability.
};
// clang-format on

1194
struct smart_holder_type_caster_class_hooks : is_smart_holder_type_caster_base_tag {
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
    static decltype(&modified_type_caster_generic_load_impl::local_load)
    get_local_load_function_ptr() {
        return &modified_type_caster_generic_load_impl::local_load;
    }

    template <typename T>
    static void init_instance_for_type(detail::instance *inst, const void *holder_const_void_ptr) {
        // Need for const_cast is a consequence of the type_info::init_instance type:
        // void (*init_instance)(instance *, const void *);
        auto holder_void_ptr = const_cast<void *>(holder_const_void_ptr);

        auto v_h = inst->get_value_and_holder(detail::get_type_info(typeid(T)));
        if (!v_h.instance_registered()) {
            register_instance(inst, v_h.value_ptr(), v_h.type);
            v_h.set_instance_registered();
        }
        using holder_type = pybindit::memory::smart_holder;
        if (holder_void_ptr) {
            // Note: inst->owned ignored.
            auto holder_ptr = static_cast<holder_type *>(holder_void_ptr);
            new (std::addressof(v_h.holder<holder_type>())) holder_type(std::move(*holder_ptr));
        } else if (inst->owned) {
            new (std::addressof(v_h.holder<holder_type>()))
                holder_type(holder_type::from_raw_ptr_take_ownership(v_h.value_ptr<T>()));
        } else {
            new (std::addressof(v_h.holder<holder_type>()))
                holder_type(holder_type::from_raw_ptr_unowned(v_h.value_ptr<T>()));
        }
        v_h.set_holder_constructed();
    }
};

template <typename T>
struct smart_holder_type_caster_load {
    using holder_type = pybindit::memory::smart_holder;

    bool load(handle src, bool convert) {
1232
        static_assert(is_smart_holder_type_caster<T>::value, "Internal consistency error.");
1233
1234
1235
1236
1237
1238
1239
        load_impl = modified_type_caster_generic_load_impl(typeid(T));
        if (!load_impl.load(src, convert))
            return false;
        return true;
    }

    T *loaded_as_raw_ptr_unowned() const {
1240
        void *void_ptr = load_impl.unowned_void_ptr_from_direct_conversion;
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
        if (void_ptr == nullptr) {
            if (have_holder()) {
                throw_if_uninitialized_or_disowned_holder();
                void_ptr = holder().template as_raw_ptr_unowned<void>();
            } else if (load_impl.loaded_v_h.vh != nullptr)
                void_ptr = load_impl.loaded_v_h.value_ptr();
            if (void_ptr == nullptr)
                return nullptr;
        }
        return convert_type(void_ptr);
1251
1252
1253
    }

    T &loaded_as_lvalue_ref() const {
1254
1255
1256
        T *raw_ptr = loaded_as_raw_ptr_unowned();
        if (raw_ptr == nullptr) throw reference_cast_error();
        return *raw_ptr;
1257
1258
    }

1259
    std::shared_ptr<T> loaded_as_shared_ptr() const {
1260
1261
        if (load_impl.unowned_void_ptr_from_direct_conversion != nullptr)
            throw cast_error("Unowned pointer from direct conversion cannot be converted to a"
1262
                             " std::shared_ptr.");
1263
        if (!have_holder()) return nullptr;
1264
        throw_if_uninitialized_or_disowned_holder();
1265
1266
1267
1268
        std::shared_ptr<void> void_ptr = holder().template as_shared_ptr<void>();
        return std::shared_ptr<T>(void_ptr, convert_type(void_ptr.get()));
    }

1269
    template <typename D>
1270
    std::unique_ptr<T, D> loaded_as_unique_ptr(const char *context = "loaded_as_unique_ptr") {
1271
1272
        if (load_impl.unowned_void_ptr_from_direct_conversion != nullptr)
            throw cast_error("Unowned pointer from direct conversion cannot be converted to a"
1273
                             " std::unique_ptr.");
1274
        if (!have_holder()) return nullptr;
1275
        throw_if_uninitialized_or_disowned_holder();
1276
1277
        holder().template ensure_compatible_rtti_uqp_del<T, D>(context);
        holder().ensure_use_count_1(context);
1278
        auto raw_void_ptr = holder().template as_raw_ptr_unowned<void>();
1279
        // SMART_HOLDER_WIP: MISSING: Safety checks for type conversions
1280
1281
1282
1283
1284
        // (T must be polymorphic or meet certain other conditions).
        T *raw_type_ptr = convert_type(raw_void_ptr);

        // Critical transfer-of-ownership section. This must stay together.
        holder().release_ownership();
1285
        auto result = std::unique_ptr<T, D>(raw_type_ptr);
1286

1287
1288
1289
1290
1291
        void *value_void_ptr = load_impl.loaded_v_h.value_ptr();
        if (value_void_ptr != raw_void_ptr) {
            pybind11_fail("smart_holder_type_casters: loaded_as_unique_ptr failure:"
                          " value_void_ptr != raw_void_ptr");
        }
1292
1293
1294
1295
1296
1297
1298
1299
1300
        load_impl.loaded_v_h.value_ptr() = nullptr;
        deregister_instance(load_impl.loaded_v_h.inst, value_void_ptr, load_impl.loaded_v_h.type);

        return result;
    }

private:
    modified_type_caster_generic_load_impl load_impl;

1301
1302
1303
    bool have_holder() const {
        return load_impl.loaded_v_h.vh != nullptr && load_impl.loaded_v_h.holder_constructed();
    }
1304

1305
1306
    holder_type &holder() const { return load_impl.loaded_v_h.holder<holder_type>(); }

1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
    // have_holder() must be true or this function will fail.
    void throw_if_uninitialized_or_disowned_holder() const {
        if (!holder().is_populated) {
            pybind11_fail("Missing value for wrapped C++ type:"
                          " Python instance is uninitialized.");
        }
        if (!holder().has_pointee()) {
            throw cast_error("Missing value for wrapped C++ type:"
                             " Python instance was disowned.");
        }
    }

1319
1320
1321
1322
1323
1324
1325
1326
1327
    T *convert_type(void *void_ptr) const {
        if (void_ptr != nullptr && load_impl.loaded_v_h_cpptype != nullptr
            && !load_impl.reinterpret_cast_deemed_ok && load_impl.implicit_cast != nullptr) {
            void_ptr = load_impl.implicit_cast(void_ptr);
        }
        return static_cast<T *>(void_ptr);
    }
};

1328
// SMART_HOLDER_WIP: IMPROVABLE: Formally factor out of type_caster_base.
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
struct make_constructor : private type_caster_base<int> { // Any type, nothing special about int.
    using type_caster_base<int>::Constructor;
    using type_caster_base<int>::make_copy_constructor;
    using type_caster_base<int>::make_move_constructor;
};

template <typename T>
struct smart_holder_type_caster : smart_holder_type_caster_load<T>,
                                  smart_holder_type_caster_class_hooks {
    static constexpr auto name = _<T>();

    // static handle cast(T, ...)
    // is redundant (leads to ambiguous overloads).

    static handle cast(T &&src, return_value_policy /*policy*/, handle parent) {
        // type_caster_base BEGIN
        // clang-format off
        return cast(&src, return_value_policy::move, parent);
        // clang-format on
        // type_caster_base END
    }

    static handle cast(T const &src, return_value_policy policy, handle parent) {
        // type_caster_base BEGIN
        // clang-format off
        if (policy == return_value_policy::automatic || policy == return_value_policy::automatic_reference)
            policy = return_value_policy::copy;
        return cast(&src, policy, parent);
        // clang-format on
        // type_caster_base END
    }

    static handle cast(T &src, return_value_policy policy, handle parent) {
        return cast(const_cast<T const &>(src), policy, parent); // Mutbl2Const
    }

    static handle cast(T const *src, return_value_policy policy, handle parent) {
        auto st = type_caster_base<T>::src_and_type(src);
        return cast_const_raw_ptr( // Originally type_caster_generic::cast.
            st.first,
            policy,
            parent,
            st.second,
            make_constructor::make_copy_constructor(src),
            make_constructor::make_move_constructor(src));
    }

    static handle cast(T *src, return_value_policy policy, handle parent) {
        return cast(const_cast<T const *>(src), policy, parent); // Mutbl2Const
    }

1380
#if defined(_MSC_VER) && _MSC_VER < 1910
1381
    // Working around MSVC 2015 bug. const-correctness is lost.
1382
    // SMART_HOLDER_WIP: IMPROVABLE: make common code work with MSVC 2015.
1383
1384
    template <typename T_>
    using cast_op_type = detail::cast_op_type<T_>;
1385
#else
1386
1387
1388
1389
    template <typename T_>
    using cast_op_type = conditional_t<
        std::is_same<remove_reference_t<T_>, T const *>::value,
        T const *,
1390
1391
        conditional_t<std::is_same<remove_reference_t<T_>, T *>::value,
                      T *,
1392
                      conditional_t<std::is_same<T_, T const &>::value, T const &, T &>>>;
1393
#endif
1394

1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
    // The const operators here prove that the existing type_caster mechanism already supports
    // const-correctness. However, fully implementing const-correctness inside this type_caster
    // is still a major project.
    operator T const &() const {
        return const_cast<smart_holder_type_caster *>(this)->loaded_as_lvalue_ref();
    }
    operator T const *() const {
        return const_cast<smart_holder_type_caster *>(this)->loaded_as_raw_ptr_unowned();
    }
    operator T &() { return this->loaded_as_lvalue_ref(); }
    operator T *() { return this->loaded_as_raw_ptr_unowned(); }
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503

    // Originally type_caster_generic::cast.
    PYBIND11_NOINLINE static handle cast_const_raw_ptr(const void *_src,
                                                       return_value_policy policy,
                                                       handle parent,
                                                       const detail::type_info *tinfo,
                                                       void *(*copy_constructor)(const void *),
                                                       void *(*move_constructor)(const void *),
                                                       const void *existing_holder = nullptr) {
        if (!tinfo) // no type info: error will be set already
            return handle();

        void *src = const_cast<void *>(_src);
        if (src == nullptr)
            return none().release();

        if (handle existing_inst = find_registered_python_instance(src, tinfo))
            return existing_inst;

        auto inst       = reinterpret_steal<object>(make_new_instance(tinfo->type));
        auto wrapper    = reinterpret_cast<instance *>(inst.ptr());
        wrapper->owned  = false;
        void *&valueptr = values_and_holders(wrapper).begin()->value_ptr();

        switch (policy) {
            case return_value_policy::automatic:
            case return_value_policy::take_ownership:
                valueptr       = src;
                wrapper->owned = true;
                break;

            case return_value_policy::automatic_reference:
            case return_value_policy::reference:
                valueptr       = src;
                wrapper->owned = false;
                break;

            case return_value_policy::copy:
                if (copy_constructor)
                    valueptr = copy_constructor(src);
                else {
#if defined(NDEBUG)
                    throw cast_error("return_value_policy = copy, but type is "
                                     "non-copyable! (compile in debug mode for details)");
#else
                    std::string type_name(tinfo->cpptype->name());
                    detail::clean_type_id(type_name);
                    throw cast_error("return_value_policy = copy, but type " + type_name
                                     + " is non-copyable!");
#endif
                }
                wrapper->owned = true;
                break;

            case return_value_policy::move:
                if (move_constructor)
                    valueptr = move_constructor(src);
                else if (copy_constructor)
                    valueptr = copy_constructor(src);
                else {
#if defined(NDEBUG)
                    throw cast_error("return_value_policy = move, but type is neither "
                                     "movable nor copyable! "
                                     "(compile in debug mode for details)");
#else
                    std::string type_name(tinfo->cpptype->name());
                    detail::clean_type_id(type_name);
                    throw cast_error("return_value_policy = move, but type " + type_name
                                     + " is neither movable nor copyable!");
#endif
                }
                wrapper->owned = true;
                break;

            case return_value_policy::reference_internal:
                valueptr       = src;
                wrapper->owned = false;
                keep_alive_impl(inst, parent);
                break;

            default:
                throw cast_error("unhandled return_value_policy: should not happen!");
        }

        tinfo->init_instance(wrapper, existing_holder);

        return inst.release();
    }
};

template <typename T>
struct smart_holder_type_caster<std::shared_ptr<T>> : smart_holder_type_caster_load<T>,
                                                      smart_holder_type_caster_class_hooks {
    static constexpr auto name = _<std::shared_ptr<T>>();

    static handle cast(const std::shared_ptr<T> &src, return_value_policy policy, handle parent) {
        if (policy != return_value_policy::automatic
            && policy != return_value_policy::reference_internal) {
1504
            // SMART_HOLDER_WIP: IMPROVABLE: Error message.
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
            throw cast_error("Invalid return_value_policy for shared_ptr.");
        }

        auto src_raw_ptr = src.get();
        auto st          = type_caster_base<T>::src_and_type(src_raw_ptr);
        if (st.first == nullptr)
            return none().release(); // PyErr was set already.

        void *src_raw_void_ptr         = static_cast<void *>(src_raw_ptr);
        const detail::type_info *tinfo = st.second;
        if (handle existing_inst = find_registered_python_instance(src_raw_void_ptr, tinfo))
1516
1517
            // SMART_HOLDER_WIP: MISSING: Enforcement of consistency with existing smart_holder.
            // SMART_HOLDER_WIP: MISSING: keep_alive.
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
            return existing_inst;

        auto inst           = reinterpret_steal<object>(make_new_instance(tinfo->type));
        auto *inst_raw_ptr  = reinterpret_cast<instance *>(inst.ptr());
        inst_raw_ptr->owned = true;
        void *&valueptr     = values_and_holders(inst_raw_ptr).begin()->value_ptr();
        valueptr            = src_raw_void_ptr;

        auto smhldr = pybindit::memory::smart_holder::from_shared_ptr(src);
        tinfo->init_instance(inst_raw_ptr, static_cast<const void *>(&smhldr));

        if (policy == return_value_policy::reference_internal)
            keep_alive_impl(inst, parent);

        return inst.release();
    }

    template <typename>
    using cast_op_type = std::shared_ptr<T>;

    operator std::shared_ptr<T>() { return this->loaded_as_shared_ptr(); }
};

template <typename T>
struct smart_holder_type_caster<std::shared_ptr<T const>> : smart_holder_type_caster_load<T>,
                                                            smart_holder_type_caster_class_hooks {
    static constexpr auto name = _<std::shared_ptr<T const>>();

    static handle
    cast(const std::shared_ptr<T const> &src, return_value_policy policy, handle parent) {
        return smart_holder_type_caster<std::shared_ptr<T>>::cast(
            std::const_pointer_cast<T>(src), // Const2Mutbl
            policy,
            parent);
    }

    template <typename>
    using cast_op_type = std::shared_ptr<T const>;

    operator std::shared_ptr<T const>() { return this->loaded_as_shared_ptr(); } // Mutbl2Const
};

1560
1561
1562
1563
template <typename T, typename D>
struct smart_holder_type_caster<std::unique_ptr<T, D>> : smart_holder_type_caster_load<T>,
                                                         smart_holder_type_caster_class_hooks {
    static constexpr auto name = _<std::unique_ptr<T, D>>();
1564

1565
    static handle cast(std::unique_ptr<T, D> &&src, return_value_policy policy, handle parent) {
1566
        if (policy != return_value_policy::automatic
1567
1568
            && policy != return_value_policy::reference_internal
            && policy != return_value_policy::move) {
1569
            // SMART_HOLDER_WIP: IMPROVABLE: Error message.
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
            throw cast_error("Invalid return_value_policy for unique_ptr.");
        }

        auto src_raw_ptr = src.get();
        auto st          = type_caster_base<T>::src_and_type(src_raw_ptr);
        if (st.first == nullptr)
            return none().release(); // PyErr was set already.

        void *src_raw_void_ptr         = static_cast<void *>(src_raw_ptr);
        const detail::type_info *tinfo = st.second;
        if (find_registered_python_instance(src_raw_void_ptr, tinfo))
            throw cast_error("Invalid unique_ptr: another instance owns this pointer already.");

        auto inst           = reinterpret_steal<object>(make_new_instance(tinfo->type));
        auto *inst_raw_ptr  = reinterpret_cast<instance *>(inst.ptr());
        inst_raw_ptr->owned = true;
        void *&valueptr     = values_and_holders(inst_raw_ptr).begin()->value_ptr();
        valueptr            = src_raw_void_ptr;

        auto smhldr = pybindit::memory::smart_holder::from_unique_ptr(std::move(src));
        tinfo->init_instance(inst_raw_ptr, static_cast<const void *>(&smhldr));

        if (policy == return_value_policy::reference_internal)
            keep_alive_impl(inst, parent);

        return inst.release();
    }

    template <typename>
1599
    using cast_op_type = std::unique_ptr<T, D>;
1600

1601
    operator std::unique_ptr<T, D>() { return this->template loaded_as_unique_ptr<D>(); }
1602
1603
};

1604
1605
1606
1607
template <typename T, typename D>
struct smart_holder_type_caster<std::unique_ptr<T const, D>>
    : smart_holder_type_caster_load<T>, smart_holder_type_caster_class_hooks {
    static constexpr auto name = _<std::unique_ptr<T const, D>>();
1608

1609
1610
1611
1612
    static handle
    cast(std::unique_ptr<T const, D> &&src, return_value_policy policy, handle parent) {
        return smart_holder_type_caster<std::unique_ptr<T, D>>::cast(
            std::unique_ptr<T, D>(const_cast<T *>(src.release())), // Const2Mutbl
1613
1614
1615
1616
1617
            policy,
            parent);
    }

    template <typename>
1618
    using cast_op_type = std::unique_ptr<T const, D>;
1619

1620
    operator std::unique_ptr<T const, D>() { return this->template loaded_as_unique_ptr<D>(); }
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
};

#ifndef PYBIND11_USE_SMART_HOLDER_AS_DEFAULT
#define PYBIND11_SMART_HOLDER_TYPE_CASTERS(T)                                                     \
    namespace pybind11 {                                                                          \
    namespace detail {                                                                            \
    template <>                                                                                   \
    class type_caster<T> : public smart_holder_type_caster<T> {};                                 \
    template <>                                                                                   \
    class type_caster<std::shared_ptr<T>> : public smart_holder_type_caster<std::shared_ptr<T>> { \
    };                                                                                            \
    template <>                                                                                   \
    class type_caster<std::shared_ptr<T const>>                                                   \
        : public smart_holder_type_caster<std::shared_ptr<T const>> {};                           \
1635
1636
1637
1638
1639
1640
    template <typename D>                                                                         \
    class type_caster<std::unique_ptr<T, D>>                                                      \
        : public smart_holder_type_caster<std::unique_ptr<T, D>> {};                              \
    template <typename D>                                                                         \
    class type_caster<std::unique_ptr<T const, D>>                                                \
        : public smart_holder_type_caster<std::unique_ptr<T const, D>> {};                        \
1641
1642
1643
1644
    }                                                                                             \
    }
#endif

1645
//DETAIL/SMART_HOLDER_TYPE_CASTERS_H/END///////////////////////////////////////////////////////////
1646
1647
1648

#ifndef PYBIND11_USE_SMART_HOLDER_AS_DEFAULT

1649
#define PYBIND11_SMART_POINTER_HOLDER_TYPE_CASTERS(T, ...)
1650

1651
template <typename T> class type_caster_for_class_ : public type_caster_base<T> {};
1652
1653
1654

#else

1655
#define PYBIND11_SMART_POINTER_HOLDER_TYPE_CASTERS(T, ...)                                        \
1656
1657
1658
1659
1660
    namespace pybind11 {                                                                          \
    namespace detail {                                                                            \
    template <>                                                                                   \
    class type_caster<T> : public type_caster_base<T> {};                                         \
    template <>                                                                                   \
1661
    class type_caster<__VA_ARGS__> : public type_caster_holder<T, __VA_ARGS__> {};                \
1662
1663
1664
    }                                                                                             \
    }

1665
template <typename T> class type_caster_for_class_ : public smart_holder_type_caster<T> {};
1666
1667

template <typename T>
1668
class type_caster_for_class_<std::shared_ptr<T>> : public smart_holder_type_caster<std::shared_ptr<T>> {};
1669
1670

template <typename T>
1671
class type_caster_for_class_<std::shared_ptr<T const>>
1672
1673
    : public smart_holder_type_caster<std::shared_ptr<T const>> {};

1674
template <typename T, typename D>
1675
class type_caster_for_class_<std::unique_ptr<T, D>>
1676
    : public smart_holder_type_caster<std::unique_ptr<T, D>> {};
1677

1678
template <typename T, typename D>
1679
class type_caster_for_class_<std::unique_ptr<T const, D>>
1680
    : public smart_holder_type_caster<std::unique_ptr<T const, D>> {};
1681
1682
1683
1684
1685

#define PYBIND11_SMART_HOLDER_TYPE_CASTERS(T)

#endif

1686
1687
template <typename type, typename SFINAE = void> class type_caster : public type_caster_for_class_<type> { };

1688
template <typename type> using make_caster = type_caster<intrinsic_t<type>>;
Wenzel Jakob's avatar
Wenzel Jakob committed
1689

1690
1691
1692
1693
1694
1695
1696
template <typename T>
struct is_smart_holder_type_caster {
    static constexpr bool value = std::is_base_of<
        is_smart_holder_type_caster_base_tag,
        make_caster<T>>::value;
};

1697
// Shortcut for calling a caster's `cast_op_type` cast operator for casting a type_caster to a T
1698
template <typename T> typename make_caster<T>::template cast_op_type<T> cast_op(make_caster<T> &caster) {
1699
1700
    return caster.operator typename make_caster<T>::template cast_op_type<T>();
}
1701
1702
1703
1704
template <typename T> typename make_caster<T>::template cast_op_type<typename std::add_rvalue_reference<T>::type>
cast_op(make_caster<T> &&caster) {
    return std::move(caster).operator
        typename make_caster<T>::template cast_op_type<typename std::add_rvalue_reference<T>::type>();
1705
1706
}

1707
1708
1709
1710
template <typename type> class type_caster<std::reference_wrapper<type>> {
private:
    using caster_t = make_caster<type>;
    caster_t subcaster;
1711
1712
1713
1714
1715
1716
1717
1718
    using reference_t = type&;
    using subcaster_cast_op_type =
        typename caster_t::template cast_op_type<reference_t>;

    static_assert(std::is_same<typename std::remove_const<type>::type &, subcaster_cast_op_type>::value ||
                  std::is_same<reference_t, subcaster_cast_op_type>::value,
                  "std::reference_wrapper<T> caster requires T to have a caster with an "
                  "`operator T &()` or `operator const T &()`");
1719
public:
1720
    bool load(handle src, bool convert) { return subcaster.load(src, convert); }
1721
    static constexpr auto name = caster_t::name;
1722
    static handle cast(const std::reference_wrapper<type> &src, return_value_policy policy, handle parent) {
1723
1724
1725
1726
        // It is definitely wrong to take ownership of this pointer, so mask that rvp
        if (policy == return_value_policy::take_ownership || policy == return_value_policy::automatic)
            policy = return_value_policy::automatic_reference;
        return caster_t::cast(&src.get(), policy, parent);
1727
    }
1728
    template <typename T> using cast_op_type = std::reference_wrapper<type>;
1729
    operator std::reference_wrapper<type>() { return cast_op<type &>(subcaster); }
1730
1731
};

1732
#define PYBIND11_TYPE_CASTER(type, py_name) \
Wenzel Jakob's avatar
Wenzel Jakob committed
1733
1734
1735
    protected: \
        type value; \
    public: \
1736
        static constexpr auto name = py_name; \
1737
1738
        template <typename T_, enable_if_t<std::is_same<type, remove_cv_t<T_>>::value, int> = 0> \
        static handle cast(T_ *src, return_value_policy policy, handle parent) { \
1739
            if (!src) return none().release(); \
1740
1741
1742
1743
1744
            if (policy == return_value_policy::take_ownership) { \
                auto h = cast(std::move(*src), policy, parent); delete src; return h; \
            } else { \
                return cast(*src, policy, parent); \
            } \
Wenzel Jakob's avatar
Wenzel Jakob committed
1745
1746
        } \
        operator type*() { return &value; } \
1747
        operator type&() { return value; } \
1748
        operator type&&() && { return std::move(value); } \
1749
        template <typename T_> using cast_op_type = pybind11::detail::movable_cast_op_type<T_>
Wenzel Jakob's avatar
Wenzel Jakob committed
1750

1751

1752
1753
template <typename CharT> using is_std_char_type = any_of<
    std::is_same<CharT, char>, /* std::string */
1754
1755
1756
#if defined(PYBIND11_HAS_U8STRING)
    std::is_same<CharT, char8_t>, /* std::u8string */
#endif
1757
1758
1759
1760
1761
    std::is_same<CharT, char16_t>, /* std::u16string */
    std::is_same<CharT, char32_t>, /* std::u32string */
    std::is_same<CharT, wchar_t> /* std::wstring */
>;

1762

Wenzel Jakob's avatar
Wenzel Jakob committed
1763
template <typename T>
1764
struct type_caster<T, enable_if_t<std::is_arithmetic<T>::value && !is_std_char_type<T>::value>> {
1765
1766
1767
    using _py_type_0 = conditional_t<sizeof(T) <= sizeof(long), long, long long>;
    using _py_type_1 = conditional_t<std::is_signed<T>::value, _py_type_0, typename std::make_unsigned<_py_type_0>::type>;
    using py_type = conditional_t<std::is_floating_point<T>::value, double, _py_type_1>;
Wenzel Jakob's avatar
Wenzel Jakob committed
1768
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
1769

1770
    bool load(handle src, bool convert) {
Wenzel Jakob's avatar
Wenzel Jakob committed
1771
        py_type py_value;
Wenzel Jakob's avatar
Wenzel Jakob committed
1772

1773
        if (!src)
1774
            return false;
1775

1776
1777
1778
1779
1780
1781
1782
1783
#if !defined(PYPY_VERSION)
        auto index_check = [](PyObject *o) { return PyIndex_Check(o); };
#else
        // In PyPy 7.3.3, `PyIndex_Check` is implemented by calling `__index__`,
        // while CPython only considers the existence of `nb_index`/`__index__`.
        auto index_check = [](PyObject *o) { return hasattr(o, "__index__"); };
#endif

1784
1785
1786
1787
1788
        if (std::is_floating_point<T>::value) {
            if (convert || PyFloat_Check(src.ptr()))
                py_value = (py_type) PyFloat_AsDouble(src.ptr());
            else
                return false;
1789
1790
        } else if (PyFloat_Check(src.ptr())) {
            return false;
1791
        } else if (!convert && !PYBIND11_LONG_CHECK(src.ptr()) && !index_check(src.ptr())) {
1792
            return false;
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
        } else {
            handle src_or_index = src;
#if PY_VERSION_HEX < 0x03080000
            object index;
            if (!PYBIND11_LONG_CHECK(src.ptr())) {  // So: index_check(src.ptr())
                index = reinterpret_steal<object>(PyNumber_Index(src.ptr()));
                if (!index) {
                    PyErr_Clear();
                    if (!convert)
                        return false;
                }
                else {
                    src_or_index = index;
                }
            }
#endif
            if (std::is_unsigned<py_type>::value) {
                py_value = as_unsigned<py_type>(src_or_index.ptr());
            } else { // signed integer:
                py_value = sizeof(T) <= sizeof(long)
                    ? (py_type) PyLong_AsLong(src_or_index.ptr())
                    : (py_type) PYBIND11_LONG_AS_LONGLONG(src_or_index.ptr());
            }
Wenzel Jakob's avatar
Wenzel Jakob committed
1816
1817
        }

1818
        // Python API reported an error
1819
        bool py_err = py_value == (py_type) -1 && PyErr_Occurred();
1820

1821
1822
1823
        // Check to see if the conversion is valid (integers should match exactly)
        // Signed/unsigned checks happen elsewhere
        if (py_err || (std::is_integral<T>::value && sizeof(py_type) != sizeof(T) && py_value != (py_type) (T) py_value)) {
Wenzel Jakob's avatar
Wenzel Jakob committed
1824
            PyErr_Clear();
1825
            if (py_err && convert && PyNumber_Check(src.ptr())) {
1826
1827
1828
                auto tmp = reinterpret_steal<object>(std::is_floating_point<T>::value
                                                     ? PyNumber_Float(src.ptr())
                                                     : PyNumber_Long(src.ptr()));
1829
1830
1831
                PyErr_Clear();
                return load(tmp, false);
            }
Wenzel Jakob's avatar
Wenzel Jakob committed
1832
1833
            return false;
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
1834

Wenzel Jakob's avatar
Wenzel Jakob committed
1835
1836
1837
1838
        value = (T) py_value;
        return true;
    }

1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
    template<typename U = T>
    static typename std::enable_if<std::is_floating_point<U>::value, handle>::type
    cast(U src, return_value_policy /* policy */, handle /* parent */) {
        return PyFloat_FromDouble((double) src);
    }

    template<typename U = T>
    static typename std::enable_if<!std::is_floating_point<U>::value && std::is_signed<U>::value && (sizeof(U) <= sizeof(long)), handle>::type
    cast(U src, return_value_policy /* policy */, handle /* parent */) {
        return PYBIND11_LONG_FROM_SIGNED((long) src);
    }

    template<typename U = T>
    static typename std::enable_if<!std::is_floating_point<U>::value && std::is_unsigned<U>::value && (sizeof(U) <= sizeof(unsigned long)), handle>::type
    cast(U src, return_value_policy /* policy */, handle /* parent */) {
        return PYBIND11_LONG_FROM_UNSIGNED((unsigned long) src);
    }

    template<typename U = T>
    static typename std::enable_if<!std::is_floating_point<U>::value && std::is_signed<U>::value && (sizeof(U) > sizeof(long)), handle>::type
    cast(U src, return_value_policy /* policy */, handle /* parent */) {
        return PyLong_FromLongLong((long long) src);
    }

    template<typename U = T>
    static typename std::enable_if<!std::is_floating_point<U>::value && std::is_unsigned<U>::value && (sizeof(U) > sizeof(unsigned long)), handle>::type
    cast(U src, return_value_policy /* policy */, handle /* parent */) {
        return PyLong_FromUnsignedLongLong((unsigned long long) src);
Wenzel Jakob's avatar
Wenzel Jakob committed
1867
1868
    }

1869
    PYBIND11_TYPE_CASTER(T, _<std::is_integral<T>::value>("int", "float"));
Wenzel Jakob's avatar
Wenzel Jakob committed
1870
};
Wenzel Jakob's avatar
Wenzel Jakob committed
1871

1872
template<typename T> struct void_caster {
Wenzel Jakob's avatar
Wenzel Jakob committed
1873
public:
1874
1875
1876
1877
1878
    bool load(handle src, bool) {
        if (src && src.is_none())
            return true;
        return false;
    }
1879
    static handle cast(T, return_value_policy /* policy */, handle /* parent */) {
Wenzel Jakob's avatar
Wenzel Jakob committed
1880
        return none().inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
1881
    }
1882
    PYBIND11_TYPE_CASTER(T, _("None"));
Wenzel Jakob's avatar
Wenzel Jakob committed
1883
1884
};

1885
1886
template <> class type_caster<void_type> : public void_caster<void_type> {};

1887
1888
1889
1890
1891
template <> class type_caster<void> : public type_caster<void_type> {
public:
    using type_caster<void_type>::cast;

    bool load(handle h, bool) {
1892
1893
        if (!h) {
            return false;
1894
        } else if (h.is_none()) {
1895
1896
1897
            value = nullptr;
            return true;
        }
1898
1899

        /* Check if this is a capsule */
1900
        if (isinstance<capsule>(h)) {
1901
            value = reinterpret_borrow<capsule>(h);
1902
1903
1904
1905
            return true;
        }

        /* Check if this is a C++ type */
1906
        auto &bases = all_type_info((PyTypeObject *) type::handle_of(h).ptr());
1907
1908
        if (bases.size() == 1) { // Only allowing loading from a single-value type
            value = values_and_holders(reinterpret_cast<instance *>(h.ptr())).begin()->value_ptr();
1909
1910
1911
1912
1913
            return true;
        }

        /* Fail */
        return false;
1914
1915
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
1916
    static handle cast(const void *ptr, return_value_policy /* policy */, handle /* parent */) {
1917
1918
1919
        if (ptr)
            return capsule(ptr).release();
        else
Wenzel Jakob's avatar
Wenzel Jakob committed
1920
            return none().inc_ref();
1921
    }
1922

1923
1924
    template <typename T> using cast_op_type = void*&;
    operator void *&() { return value; }
1925
    static constexpr auto name = _("capsule");
1926
private:
1927
    void *value = nullptr;
1928
1929
};

1930
template <> class type_caster<std::nullptr_t> : public void_caster<std::nullptr_t> { };
1931

Wenzel Jakob's avatar
Wenzel Jakob committed
1932
1933
template <> class type_caster<bool> {
public:
1934
    bool load(handle src, bool convert) {
1935
1936
        if (!src) return false;
        else if (src.ptr() == Py_True) { value = true; return true; }
Wenzel Jakob's avatar
Wenzel Jakob committed
1937
        else if (src.ptr() == Py_False) { value = false; return true; }
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
        else if (convert || !strcmp("numpy.bool_", Py_TYPE(src.ptr())->tp_name)) {
            // (allow non-implicit conversion for numpy booleans)

            Py_ssize_t res = -1;
            if (src.is_none()) {
                res = 0;  // None is implicitly converted to False
            }
            #if defined(PYPY_VERSION)
            // On PyPy, check that "__bool__" (or "__nonzero__" on Python 2.7) attr exists
            else if (hasattr(src, PYBIND11_BOOL_ATTR)) {
                res = PyObject_IsTrue(src.ptr());
            }
            #else
            // Alternate approach for CPython: this does the same as the above, but optimized
            // using the CPython API so as to avoid an unneeded attribute lookup.
            else if (auto tp_as_number = src.ptr()->ob_type->tp_as_number) {
                if (PYBIND11_NB_BOOL(tp_as_number)) {
                    res = (*PYBIND11_NB_BOOL(tp_as_number))(src.ptr());
                }
            }
            #endif
            if (res == 0 || res == 1) {
                value = (bool) res;
                return true;
1962
1963
            } else {
                PyErr_Clear();
1964
1965
1966
            }
        }
        return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
1967
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
1968
1969
    static handle cast(bool src, return_value_policy /* policy */, handle /* parent */) {
        return handle(src ? Py_True : Py_False).inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
1970
    }
1971
    PYBIND11_TYPE_CASTER(bool, _("bool"));
Wenzel Jakob's avatar
Wenzel Jakob committed
1972
1973
};

1974
// Helper class for UTF-{8,16,32} C++ stl strings:
1975
1976
1977
template <typename StringType, bool IsView = false> struct string_caster {
    using CharT = typename StringType::value_type;

1978
    // Simplify life by being able to assume standard char sizes (the standard only guarantees
1979
    // minimums, but Python requires exact sizes)
1980
    static_assert(!std::is_same<CharT, char>::value || sizeof(CharT) == 1, "Unsupported char size != 1");
1981
1982
1983
#if defined(PYBIND11_HAS_U8STRING)
    static_assert(!std::is_same<CharT, char8_t>::value || sizeof(CharT) == 1, "Unsupported char8_t size != 1");
#endif
1984
1985
1986
1987
1988
1989
1990
    static_assert(!std::is_same<CharT, char16_t>::value || sizeof(CharT) == 2, "Unsupported char16_t size != 2");
    static_assert(!std::is_same<CharT, char32_t>::value || sizeof(CharT) == 4, "Unsupported char32_t size != 4");
    // wchar_t can be either 16 bits (Windows) or 32 (everywhere else)
    static_assert(!std::is_same<CharT, wchar_t>::value || sizeof(CharT) == 2 || sizeof(CharT) == 4,
            "Unsupported wchar_t size != 2/4");
    static constexpr size_t UTF_N = 8 * sizeof(CharT);

Wenzel Jakob's avatar
Wenzel Jakob committed
1991
    bool load(handle src, bool) {
eirrgang's avatar
eirrgang committed
1992
#if PY_MAJOR_VERSION < 3
Wenzel Jakob's avatar
Wenzel Jakob committed
1993
        object temp;
1994
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
1995
        handle load_src = src;
1996
1997
1998
        if (!src) {
            return false;
        } else if (!PyUnicode_Check(load_src.ptr())) {
eirrgang's avatar
eirrgang committed
1999
#if PY_MAJOR_VERSION >= 3
2000
            return load_bytes(load_src);
2001
#else
2002
            if (std::is_same<CharT, char>::value) {
2003
2004
2005
                return load_bytes(load_src);
            }

2006
            // The below is a guaranteed failure in Python 3 when PyUnicode_Check returns false
2007
2008
            if (!PYBIND11_BYTES_CHECK(load_src.ptr()))
                return false;
2009

2010
            temp = reinterpret_steal<object>(PyUnicode_FromObject(load_src.ptr()));
Wenzel Jakob's avatar
Wenzel Jakob committed
2011
2012
            if (!temp) { PyErr_Clear(); return false; }
            load_src = temp;
2013
#endif
2014
2015
        }

2016
        auto utfNbytes = reinterpret_steal<object>(PyUnicode_AsEncodedString(
2017
            load_src.ptr(), UTF_N == 8 ? "utf-8" : UTF_N == 16 ? "utf-16" : "utf-32", nullptr));
2018
2019
        if (!utfNbytes) { PyErr_Clear(); return false; }

2020
        const auto *buffer = reinterpret_cast<const CharT *>(PYBIND11_BYTES_AS_STRING(utfNbytes.ptr()));
2021
2022
2023
        size_t length = (size_t) PYBIND11_BYTES_SIZE(utfNbytes.ptr()) / sizeof(CharT);
        if (UTF_N > 8) { buffer++; length--; } // Skip BOM for UTF-16/32
        value = StringType(buffer, length);
2024
2025
2026

        // If we're loading a string_view we need to keep the encoded Python object alive:
        if (IsView)
2027
            loader_life_support::add_patient(utfNbytes);
2028

Wenzel Jakob's avatar
Wenzel Jakob committed
2029
2030
        return true;
    }
hulucc's avatar
hulucc committed
2031

2032
    static handle cast(const StringType &src, return_value_policy /* policy */, handle /* parent */) {
2033
        const char *buffer = reinterpret_cast<const char *>(src.data());
2034
        auto nbytes = ssize_t(src.size() * sizeof(CharT));
2035
        handle s = decode_utfN(buffer, nbytes);
2036
2037
        if (!s) throw error_already_set();
        return s;
Wenzel Jakob's avatar
Wenzel Jakob committed
2038
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
2039

2040
    PYBIND11_TYPE_CASTER(StringType, _(PYBIND11_STRING_NAME));
2041
2042
2043
2044
2045
2046
2047
2048
2049

private:
    static handle decode_utfN(const char *buffer, ssize_t nbytes) {
#if !defined(PYPY_VERSION)
        return
            UTF_N == 8  ? PyUnicode_DecodeUTF8(buffer, nbytes, nullptr) :
            UTF_N == 16 ? PyUnicode_DecodeUTF16(buffer, nbytes, nullptr, nullptr) :
                          PyUnicode_DecodeUTF32(buffer, nbytes, nullptr, nullptr);
#else
2050
2051
        // PyPy segfaults when on PyUnicode_DecodeUTF16 (and possibly on PyUnicode_DecodeUTF32 as well),
        // so bypass the whole thing by just passing the encoding as a string value, which works properly:
2052
2053
2054
        return PyUnicode_Decode(buffer, nbytes, UTF_N == 8 ? "utf-8" : UTF_N == 16 ? "utf-16" : "utf-32", nullptr);
#endif
    }
2055

2056
2057
    // When loading into a std::string or char*, accept a bytes object as-is (i.e.
    // without any encoding/decoding attempt).  For other C++ char sizes this is a no-op.
2058
2059
    // which supports loading a unicode from a str, doesn't take this path.
    template <typename C = CharT>
2060
    bool load_bytes(enable_if_t<std::is_same<C, char>::value, handle> src) {
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
        if (PYBIND11_BYTES_CHECK(src.ptr())) {
            // We were passed a Python 3 raw bytes; accept it into a std::string or char*
            // without any encoding attempt.
            const char *bytes = PYBIND11_BYTES_AS_STRING(src.ptr());
            if (bytes) {
                value = StringType(bytes, (size_t) PYBIND11_BYTES_SIZE(src.ptr()));
                return true;
            }
        }

        return false;
    }
2073

2074
    template <typename C = CharT>
2075
    bool load_bytes(enable_if_t<!std::is_same<C, char>::value, handle>) { return false; }
hulucc's avatar
hulucc committed
2076
2077
};

2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
template <typename CharT, class Traits, class Allocator>
struct type_caster<std::basic_string<CharT, Traits, Allocator>, enable_if_t<is_std_char_type<CharT>::value>>
    : string_caster<std::basic_string<CharT, Traits, Allocator>> {};

#ifdef PYBIND11_HAS_STRING_VIEW
template <typename CharT, class Traits>
struct type_caster<std::basic_string_view<CharT, Traits>, enable_if_t<is_std_char_type<CharT>::value>>
    : string_caster<std::basic_string_view<CharT, Traits>, true> {};
#endif

2088
2089
2090
2091
2092
2093
2094
// Type caster for C-style strings.  We basically use a std::string type caster, but also add the
// ability to use None as a nullptr char* (which the string caster doesn't allow).
template <typename CharT> struct type_caster<CharT, enable_if_t<is_std_char_type<CharT>::value>> {
    using StringType = std::basic_string<CharT>;
    using StringCaster = type_caster<StringType>;
    StringCaster str_caster;
    bool none = false;
2095
    CharT one_char = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
2096
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
2097
    bool load(handle src, bool convert) {
2098
2099
2100
2101
2102
2103
2104
2105
        if (!src) return false;
        if (src.is_none()) {
            // Defer accepting None to other overloads (if we aren't in convert mode):
            if (!convert) return false;
            none = true;
            return true;
        }
        return str_caster.load(src, convert);
2106
2107
    }

2108
2109
2110
    static handle cast(const CharT *src, return_value_policy policy, handle parent) {
        if (src == nullptr) return pybind11::none().inc_ref();
        return StringCaster::cast(StringType(src), policy, parent);
Wenzel Jakob's avatar
Wenzel Jakob committed
2111
2112
    }

2113
2114
2115
2116
2117
2118
2119
    static handle cast(CharT src, return_value_policy policy, handle parent) {
        if (std::is_same<char, CharT>::value) {
            handle s = PyUnicode_DecodeLatin1((const char *) &src, 1, nullptr);
            if (!s) throw error_already_set();
            return s;
        }
        return StringCaster::cast(StringType(1, src), policy, parent);
Wenzel Jakob's avatar
Wenzel Jakob committed
2120
2121
    }

2122
    operator CharT*() { return none ? nullptr : const_cast<CharT *>(static_cast<StringType &>(str_caster).c_str()); }
2123
    operator CharT&() {
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
        if (none)
            throw value_error("Cannot convert None to a character");

        auto &value = static_cast<StringType &>(str_caster);
        size_t str_len = value.size();
        if (str_len == 0)
            throw value_error("Cannot convert empty string to a character");

        // If we're in UTF-8 mode, we have two possible failures: one for a unicode character that
        // is too high, and one for multiple unicode characters (caught later), so we need to figure
        // out how long the first encoded character is in bytes to distinguish between these two
        // errors.  We also allow want to allow unicode characters U+0080 through U+00FF, as those
        // can fit into a single char value.
        if (StringCaster::UTF_N == 8 && str_len > 1 && str_len <= 4) {
2138
            auto v0 = static_cast<unsigned char>(value[0]);
2139
2140
2141
2142
2143
2144
2145
2146
            size_t char0_bytes = !(v0 & 0x80) ? 1 : // low bits only: 0-127
                (v0 & 0xE0) == 0xC0 ? 2 : // 0b110xxxxx - start of 2-byte sequence
                (v0 & 0xF0) == 0xE0 ? 3 : // 0b1110xxxx - start of 3-byte sequence
                4; // 0b11110xxx - start of 4-byte sequence

            if (char0_bytes == str_len) {
                // If we have a 128-255 value, we can decode it into a single char:
                if (char0_bytes == 2 && (v0 & 0xFC) == 0xC0) { // 0x110000xx 0x10xxxxxx
2147
2148
                    one_char = static_cast<CharT>(((v0 & 3) << 6) + (static_cast<unsigned char>(value[1]) & 0x3F));
                    return one_char;
2149
2150
2151
2152
2153
                }
                // Otherwise we have a single character, but it's > U+00FF
                throw value_error("Character code point not in range(0x100)");
            }
        }
Wenzel Jakob's avatar
Wenzel Jakob committed
2154

2155
2156
2157
2158
        // UTF-16 is much easier: we can only have a surrogate pair for values above U+FFFF, thus a
        // surrogate pair with total length 2 instantly indicates a range error (but not a "your
        // string was too long" error).
        else if (StringCaster::UTF_N == 16 && str_len == 2) {
2159
2160
            one_char = static_cast<CharT>(value[0]);
            if (one_char >= 0xD800 && one_char < 0xE000)
2161
2162
                throw value_error("Character code point not in range(0x10000)");
        }
2163

2164
2165
        if (str_len != 1)
            throw value_error("Expected a character, but multi-character string found");
hulucc's avatar
hulucc committed
2166

2167
2168
        one_char = value[0];
        return one_char;
Wenzel Jakob's avatar
Wenzel Jakob committed
2169
    }
hulucc's avatar
hulucc committed
2170

2171
    static constexpr auto name = _(PYBIND11_STRING_NAME);
2172
    template <typename _T> using cast_op_type = pybind11::detail::cast_op_type<_T>;
hulucc's avatar
hulucc committed
2173
2174
};

2175
// Base implementation for std::tuple and std::pair
2176
2177
2178
template <template<typename...> class Tuple, typename... Ts> class tuple_caster {
    using type = Tuple<Ts...>;
    static constexpr auto size = sizeof...(Ts);
2179
    using indices = make_index_sequence<size>;
2180
public:
2181

Wenzel Jakob's avatar
Wenzel Jakob committed
2182
    bool load(handle src, bool convert) {
2183
2184
2185
2186
        if (!isinstance<sequence>(src))
            return false;
        const auto seq = reinterpret_borrow<sequence>(src);
        if (seq.size() != size)
2187
            return false;
2188
        return load_impl(seq, convert, indices{});
2189
    }
2190

2191
2192
2193
    template <typename T>
    static handle cast(T &&src, return_value_policy policy, handle parent) {
        return cast_impl(std::forward<T>(src), policy, parent, indices{});
2194
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
2195

2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
    // copied from the PYBIND11_TYPE_CASTER macro
    template <typename T>
    static handle cast(T *src, return_value_policy policy, handle parent) {
        if (!src) return none().release();
        if (policy == return_value_policy::take_ownership) {
            auto h = cast(std::move(*src), policy, parent); delete src; return h;
        } else {
            return cast(*src, policy, parent);
        }
    }

2207
    static constexpr auto name = _("Tuple[") + concat(make_caster<Ts>::name...) + _("]");
Wenzel Jakob's avatar
Wenzel Jakob committed
2208

2209
2210
    template <typename T> using cast_op_type = type;

2211
2212
    operator type() & { return implicit_cast(indices{}); }
    operator type() && { return std::move(*this).implicit_cast(indices{}); }
Wenzel Jakob's avatar
Wenzel Jakob committed
2213

Wenzel Jakob's avatar
Wenzel Jakob committed
2214
protected:
2215
    template <size_t... Is>
2216
    type implicit_cast(index_sequence<Is...>) & { return type(cast_op<Ts>(std::get<Is>(subcasters))...); }
2217
    template <size_t... Is>
2218
    type implicit_cast(index_sequence<Is...>) && { return type(cast_op<Ts>(std::move(std::get<Is>(subcasters)))...); }
2219

2220
    static constexpr bool load_impl(const sequence &, bool, index_sequence<>) { return true; }
Wenzel Jakob's avatar
Wenzel Jakob committed
2221

2222
    template <size_t... Is>
2223
    bool load_impl(const sequence &seq, bool convert, index_sequence<Is...>) {
2224
2225
2226
2227
#ifdef __cpp_fold_expressions
        if ((... || !std::get<Is>(subcasters).load(seq[Is], convert)))
            return false;
#else
2228
        for (bool r : {std::get<Is>(subcasters).load(seq[Is], convert)...})
Wenzel Jakob's avatar
Wenzel Jakob committed
2229
2230
            if (!r)
                return false;
2231
#endif
Wenzel Jakob's avatar
Wenzel Jakob committed
2232
2233
2234
2235
        return true;
    }

    /* Implementation: Convert a C++ tuple into a Python tuple */
2236
2237
2238
2239
    template <typename T, size_t... Is>
    static handle cast_impl(T &&src, return_value_policy policy, handle parent, index_sequence<Is...>) {
        std::array<object, size> entries{{
            reinterpret_steal<object>(make_caster<Ts>::cast(std::get<Is>(std::forward<T>(src)), policy, parent))...
Wenzel Jakob's avatar
Wenzel Jakob committed
2240
        }};
Wenzel Jakob's avatar
Wenzel Jakob committed
2241
2242
2243
2244
        for (const auto &entry: entries)
            if (!entry)
                return handle();
        tuple result(size);
2245
        int counter = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
2246
2247
2248
        for (auto & entry: entries)
            PyTuple_SET_ITEM(result.ptr(), counter++, entry.release().ptr());
        return result.release();
Wenzel Jakob's avatar
Wenzel Jakob committed
2249
2250
    }

2251
    Tuple<make_caster<Ts>...> subcasters;
Wenzel Jakob's avatar
Wenzel Jakob committed
2252
2253
};

2254
2255
2256
template <typename T1, typename T2> class type_caster<std::pair<T1, T2>>
    : public tuple_caster<std::pair, T1, T2> {};

2257
2258
template <typename... Ts> class type_caster<std::tuple<Ts...>>
    : public tuple_caster<std::tuple, Ts...> {};
2259

2260
2261
2262
2263
2264
2265
2266
/// Helper class which abstracts away certain actions. Users can provide specializations for
/// custom holders, but it's only necessary if the type has a non-standard interface.
template <typename T>
struct holder_helper {
    static auto get(const T &p) -> decltype(p.get()) { return p.get(); }
};

Wenzel Jakob's avatar
Wenzel Jakob committed
2267
/// Type caster for holder types like std::shared_ptr, etc.
2268
2269
2270
2271
2272
/// The SFINAE hook is provided to help work around the current lack of support
/// for smart-pointer interoperability. Please consider it an implementation
/// detail that may change in the future, as formal support for smart-pointer
/// interoperability is added into pybind11.
template <typename type, typename holder_type, typename SFINAE = void>
2273
struct copyable_holder_caster : public type_caster_base<type> {
Wenzel Jakob's avatar
Wenzel Jakob committed
2274
public:
Wenzel Jakob's avatar
Wenzel Jakob committed
2275
    using base = type_caster_base<type>;
2276
2277
    static_assert(std::is_base_of<base, type_caster<type>>::value,
            "Holder classes are only supported for custom types");
Wenzel Jakob's avatar
Wenzel Jakob committed
2278
2279
2280
2281
    using base::base;
    using base::cast;
    using base::typeinfo;
    using base::value;
2282

2283
2284
    bool load(handle src, bool convert) {
        return base::template load_impl<copyable_holder_caster<type, holder_type>>(src, convert);
Wenzel Jakob's avatar
Wenzel Jakob committed
2285
2286
    }

2287
    explicit operator type*() { return this->value; }
2288
2289
2290
    // static_cast works around compiler error with MSVC 17 and CUDA 10.2
    // see issue #2180
    explicit operator type&() { return *(static_cast<type *>(this->value)); }
2291
    explicit operator holder_type*() { return std::addressof(holder); }
2292
    explicit operator holder_type&() { return holder; }
Wenzel Jakob's avatar
Wenzel Jakob committed
2293

2294
2295
2296
2297
    static handle cast(const holder_type &src, return_value_policy, handle) {
        const auto *ptr = holder_helper<holder_type>::get(src);
        return type_caster_base<type>::cast_holder(ptr, &src);
    }
Wenzel Jakob's avatar
Wenzel Jakob committed
2298

2299
2300
2301
2302
2303
protected:
    friend class type_caster_generic;
    void check_holder_compat() {
        if (typeinfo->default_holder)
            throw cast_error("Unable to load a custom holder type from a default-holder instance");
Wenzel Jakob's avatar
Wenzel Jakob committed
2304
2305
    }

2306
    bool load_value(value_and_holder &&v_h) {
2307
2308
        if (v_h.holder_constructed()) {
            value = v_h.value_ptr();
2309
            holder = v_h.template holder<holder_type>();
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
            return true;
        } else {
            throw cast_error("Unable to cast from non-held to held instance (T& to Holder<T>) "
#if defined(NDEBUG)
                             "(compile in debug mode for type information)");
#else
                             "of type '" + type_id<holder_type>() + "''");
#endif
        }
    }

Wenzel Jakob's avatar
Wenzel Jakob committed
2321
2322
2323
2324
2325
2326
    template <typename T = holder_type, detail::enable_if_t<!std::is_constructible<T, const T &, type*>::value, int> = 0>
    bool try_implicit_casts(handle, bool) { return false; }

    template <typename T = holder_type, detail::enable_if_t<std::is_constructible<T, const T &, type*>::value, int> = 0>
    bool try_implicit_casts(handle src, bool convert) {
        for (auto &cast : typeinfo->implicit_casts) {
2327
            copyable_holder_caster sub_caster(*cast.first);
Wenzel Jakob's avatar
Wenzel Jakob committed
2328
2329
2330
2331
2332
2333
            if (sub_caster.load(src, convert)) {
                value = cast.second(sub_caster.value);
                holder = holder_type(sub_caster.holder, (type *) value);
                return true;
            }
        }
2334
        return false;
Wenzel Jakob's avatar
Wenzel Jakob committed
2335
    }
2336

2337
    static bool try_direct_conversions(handle) { return false; }
2338

2339

Wenzel Jakob's avatar
Wenzel Jakob committed
2340
2341
2342
    holder_type holder;
};

2343
#ifndef PYBIND11_USE_SMART_HOLDER_AS_DEFAULT
2344
2345
/// Specialize for the common std::shared_ptr, so users don't need to
template <typename T>
2346
class type_caster<std::shared_ptr<T>> : public copyable_holder_caster<T, std::shared_ptr<T>> { };
2347
#endif
2348

2349
2350
2351
2352
/// Type caster for holder types like std::unique_ptr.
/// Please consider the SFINAE hook an implementation detail, as explained
/// in the comment for the copyable_holder_caster.
template <typename type, typename holder_type, typename SFINAE = void>
2353
struct move_only_holder_caster {
2354
2355
2356
    static_assert(std::is_base_of<type_caster_base<type>, type_caster<type>>::value,
            "Holder classes are only supported for custom types");

2357
2358
    static handle cast(holder_type &&src, return_value_policy, handle) {
        auto *ptr = holder_helper<holder_type>::get(src);
2359
        return type_caster_base<type>::cast_holder(ptr, std::addressof(src));
2360
    }
2361
    static constexpr auto name = type_caster_base<type>::name;
2362
2363
};

2364
#ifndef PYBIND11_USE_SMART_HOLDER_AS_DEFAULT
2365
2366
2367
template <typename type, typename deleter>
class type_caster<std::unique_ptr<type, deleter>>
    : public move_only_holder_caster<type, std::unique_ptr<type, deleter>> { };
2368
#endif
2369
2370

template <typename type, typename holder_type>
2371
using type_caster_holder = conditional_t<is_copy_constructible<holder_type>::value,
2372
2373
                                         copyable_holder_caster<type, holder_type>,
                                         move_only_holder_caster<type, holder_type>>;
2374

2375
2376
template <typename T, bool Value = false> struct always_construct_holder { static constexpr bool value = Value; };

2377
/// Create a specialization for custom holder types (silently ignores std::shared_ptr)
2378
#define PYBIND11_DECLARE_HOLDER_TYPE(type, holder_type, ...) \
2379
2380
    namespace pybind11 { namespace detail { \
    template <typename type> \
2381
2382
    struct always_construct_holder<holder_type> : always_construct_holder<void, ##__VA_ARGS__>  { }; \
    template <typename type> \
2383
2384
2385
2386
    class type_caster<holder_type, enable_if_t<!is_shared_ptr<holder_type>::value>> \
        : public type_caster_holder<type, holder_type> { }; \
    }}

2387
// PYBIND11_DECLARE_HOLDER_TYPE holder types:
2388
template <typename base, typename holder> struct is_holder_type :
2389
    std::is_base_of<detail::type_caster_holder<base, holder>, detail::type_caster<holder>> {};
2390
2391
2392
// Specialization for always-supported unique_ptr holders:
template <typename base, typename deleter> struct is_holder_type<base, std::unique_ptr<base, deleter>> :
    std::true_type {};
2393

2394
2395
template <typename T> struct handle_type_name { static constexpr auto name = _<T>(); };
template <> struct handle_type_name<bytes> { static constexpr auto name = _(PYBIND11_BYTES_NAME); };
2396
template <> struct handle_type_name<int_> { static constexpr auto name = _("int"); };
2397
2398
template <> struct handle_type_name<iterable> { static constexpr auto name = _("Iterable"); };
template <> struct handle_type_name<iterator> { static constexpr auto name = _("Iterator"); };
2399
template <> struct handle_type_name<none> { static constexpr auto name = _("None"); };
2400
2401
template <> struct handle_type_name<args> { static constexpr auto name = _("*args"); };
template <> struct handle_type_name<kwargs> { static constexpr auto name = _("**kwargs"); };
2402

2403
template <typename type>
2404
2405
2406
struct pyobject_caster {
    template <typename T = type, enable_if_t<std::is_same<T, handle>::value, int> = 0>
    bool load(handle src, bool /* convert */) { value = src; return static_cast<bool>(value); }
2407

2408
    template <typename T = type, enable_if_t<std::is_base_of<object, T>::value, int> = 0>
2409
    bool load(handle src, bool /* convert */) {
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
#if PY_MAJOR_VERSION < 3 && !defined(PYBIND11_STR_LEGACY_PERMISSIVE)
        // For Python 2, without this implicit conversion, Python code would
        // need to be cluttered with six.ensure_text() or similar, only to be
        // un-cluttered later after Python 2 support is dropped.
        if (std::is_same<T, str>::value && isinstance<bytes>(src)) {
            PyObject *str_from_bytes = PyUnicode_FromEncodedObject(src.ptr(), "utf-8", nullptr);
            if (!str_from_bytes) throw error_already_set();
            value = reinterpret_steal<type>(str_from_bytes);
            return true;
        }
#endif
2421
2422
        if (!isinstance<type>(src))
            return false;
2423
        value = reinterpret_borrow<type>(src);
2424
2425
        return true;
    }
2426

Wenzel Jakob's avatar
Wenzel Jakob committed
2427
2428
    static handle cast(const handle &src, return_value_policy /* policy */, handle /* parent */) {
        return src.inc_ref();
Wenzel Jakob's avatar
Wenzel Jakob committed
2429
    }
2430
    PYBIND11_TYPE_CASTER(type, handle_type_name<type>::name);
Wenzel Jakob's avatar
Wenzel Jakob committed
2431
2432
};

2433
2434
2435
template <typename T>
class type_caster<T, enable_if_t<is_pyobject<T>::value>> : public pyobject_caster<T> { };

2436
2437
2438
2439
2440
2441
2442
2443
2444
// Our conditions for enabling moving are quite restrictive:
// At compile time:
// - T needs to be a non-const, non-pointer, non-reference type
// - type_caster<T>::operator T&() must exist
// - the type must be move constructible (obviously)
// At run-time:
// - if the type is non-copy-constructible, the object must be the sole owner of the type (i.e. it
//   must have ref_count() == 1)h
// If any of the above are not satisfied, we fall back to copying.
2445
2446
template <typename T> using move_is_plain_type = satisfies_none_of<T,
    std::is_void, std::is_pointer, std::is_reference, std::is_const
2447
>;
2448
template <typename T, typename SFINAE = void> struct move_always : std::false_type {};
2449
2450
template <typename T> struct move_always<T, enable_if_t<all_of<
    move_is_plain_type<T>,
2451
    negation<is_copy_constructible<T>>,
2452
    std::is_move_constructible<T>,
2453
    std::is_same<decltype(std::declval<make_caster<T>>().operator T&()), T&>
2454
>::value>> : std::true_type {};
2455
template <typename T, typename SFINAE = void> struct move_if_unreferenced : std::false_type {};
2456
2457
2458
2459
template <typename T> struct move_if_unreferenced<T, enable_if_t<all_of<
    move_is_plain_type<T>,
    negation<move_always<T>>,
    std::is_move_constructible<T>,
2460
    std::is_same<decltype(std::declval<make_caster<T>>().operator T&()), T&>
2461
2462
>::value>> : std::true_type {};
template <typename T> using move_never = none_of<move_always<T>, move_if_unreferenced<T>>;
2463

2464
2465
2466
2467
2468
2469
// Detect whether returning a `type` from a cast on type's type_caster is going to result in a
// reference or pointer to a local variable of the type_caster.  Basically, only
// non-reference/pointer `type`s and reference/pointers from a type_caster_generic are safe;
// everything else returns a reference/pointer to a local variable.
template <typename type> using cast_is_temporary_value_reference = bool_constant<
    (std::is_reference<type>::value || std::is_pointer<type>::value) &&
Wenzel Jakob's avatar
Wenzel Jakob committed
2470
    !std::is_base_of<type_caster_generic, make_caster<type>>::value &&
2471
2472
    !std::is_same<intrinsic_t<type>, void>::value &&
    !is_smart_holder_type_caster<intrinsic_t<type>>::value
2473
2474
>;

2475
2476
// When a value returned from a C++ function is being cast back to Python, we almost always want to
// force `policy = move`, regardless of the return value policy the function/method was declared
2477
// with.
2478
template <typename Return, typename SFINAE = void> struct return_value_policy_override {
2479
2480
2481
2482
2483
    static return_value_policy policy(return_value_policy p) { return p; }
};

template <typename Return> struct return_value_policy_override<Return,
        detail::enable_if_t<std::is_base_of<type_caster_generic, make_caster<Return>>::value, void>> {
2484
    static return_value_policy policy(return_value_policy p) {
2485
2486
2487
        return !std::is_lvalue_reference<Return>::value &&
               !std::is_pointer<Return>::value
                   ? return_value_policy::move : p;
2488
2489
2490
    }
};

2491
// Basic python -> C++ casting; throws if casting fails
Jason Rhinelander's avatar
Jason Rhinelander committed
2492
template <typename T, typename SFINAE> type_caster<T, SFINAE> &load_type(type_caster<T, SFINAE> &conv, const handle &handle) {
2493
2494
2495
2496
2497
    if (!conv.load(handle, true)) {
#if defined(NDEBUG)
        throw cast_error("Unable to cast Python instance to C++ type (compile in debug mode for details)");
#else
        throw cast_error("Unable to cast Python instance of type " +
2498
            (std::string) str(type::handle_of(handle)) + " to C++ type '" + type_id<T>() + "'");
2499
2500
#endif
    }
2501
2502
    return conv;
}
2503
2504
2505
2506
2507
2508
// Wrapper around the above that also constructs and returns a type_caster
template <typename T> make_caster<T> load_type(const handle &handle) {
    make_caster<T> conv;
    load_type(conv, handle);
    return conv;
}
2509

2510
PYBIND11_NAMESPACE_END(detail)
2511

2512
// pytype -> C++ type
2513
2514
template <typename T, detail::enable_if_t<!detail::is_pyobject<T>::value, int> = 0>
T cast(const handle &handle) {
2515
2516
    using namespace detail;
    static_assert(!cast_is_temporary_value_reference<T>::value,
2517
            "Unable to cast type to reference: value is local to type caster");
2518
    return cast_op<T>(load_type<T>(handle));
Wenzel Jakob's avatar
Wenzel Jakob committed
2519
2520
}

2521
// pytype -> pytype (calls converting constructor)
2522
template <typename T, detail::enable_if_t<detail::is_pyobject<T>::value, int> = 0>
2523
T cast(const handle &handle) { return T(reinterpret_borrow<object>(handle)); }
2524

2525
// C++ type -> py::object
2526
template <typename T, detail::enable_if_t<!detail::is_pyobject<T>::value, int> = 0>
2527
object cast(T &&value, return_value_policy policy = return_value_policy::automatic_reference,
2528
            handle parent = handle()) {
2529
    using no_ref_T = typename std::remove_reference<T>::type;
Wenzel Jakob's avatar
Wenzel Jakob committed
2530
    if (policy == return_value_policy::automatic)
2531
2532
        policy = std::is_pointer<no_ref_T>::value ? return_value_policy::take_ownership :
                 std::is_lvalue_reference<T>::value ? return_value_policy::copy : return_value_policy::move;
2533
    else if (policy == return_value_policy::automatic_reference)
2534
2535
2536
        policy = std::is_pointer<no_ref_T>::value ? return_value_policy::reference :
                 std::is_lvalue_reference<T>::value ? return_value_policy::copy : return_value_policy::move;
    return reinterpret_steal<object>(detail::make_caster<T>::cast(std::forward<T>(value), policy, parent));
Wenzel Jakob's avatar
Wenzel Jakob committed
2537
2538
}

Wenzel Jakob's avatar
Wenzel Jakob committed
2539
template <typename T> T handle::cast() const { return pybind11::cast<T>(*this); }
2540
template <> inline void handle::cast() const { return; }
Wenzel Jakob's avatar
Wenzel Jakob committed
2541

2542
template <typename T>
2543
detail::enable_if_t<!detail::move_never<T>::value, T> move(object &&obj) {
2544
2545
2546
2547
2548
    if (obj.ref_count() > 1)
#if defined(NDEBUG)
        throw cast_error("Unable to cast Python instance to C++ rvalue: instance has multiple references"
            " (compile in debug mode for details)");
#else
2549
        throw cast_error("Unable to move from Python " + (std::string) str(type::handle_of(obj)) +
2550
2551
2552
2553
                " instance to C++ " + type_id<T>() + " instance: instance has multiple references");
#endif

    // Move into a temporary and return that, because the reference may be a local value of `conv`
2554
    T ret = std::move(detail::load_type<T>(obj).operator T&());
2555
2556
2557
    return ret;
}

2558
// Calling cast() on an rvalue calls pybind11::cast with the object rvalue, which does:
2559
2560
2561
2562
// - If we have to move (because T has no copy constructor), do it.  This will fail if the moved
//   object has multiple references, but trying to copy will fail to compile.
// - If both movable and copyable, check ref count: if 1, move; otherwise copy
// - Otherwise (not movable), copy.
2563
template <typename T> detail::enable_if_t<detail::move_always<T>::value, T> cast(object &&object) {
2564
2565
    return move<T>(std::move(object));
}
2566
template <typename T> detail::enable_if_t<detail::move_if_unreferenced<T>::value, T> cast(object &&object) {
2567
2568
2569
2570
2571
    if (object.ref_count() > 1)
        return cast<T>(object);
    else
        return move<T>(std::move(object));
}
2572
template <typename T> detail::enable_if_t<detail::move_never<T>::value, T> cast(object &&object) {
2573
    return cast<T>(object);
2574
2575
2576
2577
2578
2579
2580
}

template <typename T> T object::cast() const & { return pybind11::cast<T>(*this); }
template <typename T> T object::cast() && { return pybind11::cast<T>(std::move(*this)); }
template <> inline void object::cast() const & { return; }
template <> inline void object::cast() && { return; }

2581
PYBIND11_NAMESPACE_BEGIN(detail)
2582

2583
2584
2585
2586
// Declared in pytypes.h:
template <typename T, enable_if_t<!is_pyobject<T>::value, int>>
object object_or_cast(T &&o) { return pybind11::cast(std::forward<T>(o)); }

2587
2588
2589
struct override_unused {}; // Placeholder type for the unneeded (and dead code) static variable in the PYBIND11_OVERRIDE_OVERRIDE macro
template <typename ret_type> using override_caster_t = conditional_t<
    cast_is_temporary_value_reference<ret_type>::value, make_caster<ret_type>, override_unused>;
2590
2591
2592

// Trampoline use: for reference/pointer types to value-converted values, we do a value cast, then
// store the result in the given variable.  For other types, this is a no-op.
2593
template <typename T> enable_if_t<cast_is_temporary_value_reference<T>::value, T> cast_ref(object &&o, make_caster<T> &caster) {
2594
    return cast_op<T>(load_type(caster, o));
2595
}
2596
template <typename T> enable_if_t<!cast_is_temporary_value_reference<T>::value, T> cast_ref(object &&, override_unused &) {
2597
2598
2599
2600
2601
2602
    pybind11_fail("Internal error: cast_ref fallback invoked"); }

// Trampoline use: Having a pybind11::cast with an invalid reference type is going to static_assert, even
// though if it's in dead code, so we provide a "trampoline" to pybind11::cast that only does anything in
// cases where pybind11::cast is valid.
template <typename T> enable_if_t<!cast_is_temporary_value_reference<T>::value, T> cast_safe(object &&o) {
2603
    return pybind11::cast<T>(std::move(o)); }
2604
2605
2606
2607
template <typename T> enable_if_t<cast_is_temporary_value_reference<T>::value, T> cast_safe(object &&) {
    pybind11_fail("Internal error: cast_safe fallback invoked"); }
template <> inline void cast_safe<void>(object &&) {}

2608
PYBIND11_NAMESPACE_END(detail)
2609

2610
2611
2612
template <return_value_policy policy = return_value_policy::automatic_reference>
tuple make_tuple() { return tuple(0); }

2613
template <return_value_policy policy = return_value_policy::automatic_reference,
Wenzel Jakob's avatar
Wenzel Jakob committed
2614
          typename... Args> tuple make_tuple(Args&&... args_) {
2615
    constexpr size_t size = sizeof...(Args);
Wenzel Jakob's avatar
Wenzel Jakob committed
2616
    std::array<object, size> args {
2617
2618
        { reinterpret_steal<object>(detail::make_caster<Args>::cast(
            std::forward<Args>(args_), policy, nullptr))... }
Wenzel Jakob's avatar
Wenzel Jakob committed
2619
    };
2620
2621
    for (size_t i = 0; i < args.size(); i++) {
        if (!args[i]) {
2622
2623
2624
#if defined(NDEBUG)
            throw cast_error("make_tuple(): unable to convert arguments to Python object (compile in debug mode for details)");
#else
Ivan Smirnov's avatar
Ivan Smirnov committed
2625
            std::array<std::string, size> argtypes { {type_id<Args>()...} };
2626
2627
            throw cast_error("make_tuple(): unable to convert argument of type '" +
                argtypes[i] + "' to Python object");
2628
2629
2630
#endif
        }
    }
2631
    tuple result(size);
Wenzel Jakob's avatar
Wenzel Jakob committed
2632
    int counter = 0;
Wenzel Jakob's avatar
Wenzel Jakob committed
2633
    for (auto &arg_value : args)
2634
2635
2636
2637
        PyTuple_SET_ITEM(result.ptr(), counter++, arg_value.release().ptr());
    return result;
}

2638
/// \ingroup annotations
2639
/// Annotation for arguments
2640
struct arg {
2641
    /// Constructs an argument with the name of the argument; if null or omitted, this is a positional argument.
2642
    constexpr explicit arg(const char *name = nullptr) : name(name), flag_noconvert(false), flag_none(true) { }
2643
    /// Assign a value to this argument
2644
    template <typename T> arg_v operator=(T &&value) const;
2645
2646
    /// Indicate that the type should not be converted in the type caster
    arg &noconvert(bool flag = true) { flag_noconvert = flag; return *this; }
2647
2648
    /// Indicates that the argument should/shouldn't allow None (e.g. for nullable pointer args)
    arg &none(bool flag = true) { flag_none = flag; return *this; }
2649

2650
2651
    const char *name; ///< If non-null, this is a named kwargs argument
    bool flag_noconvert : 1; ///< If set, do not allow conversion (requires a supporting type caster!)
2652
    bool flag_none : 1; ///< If set (the default), allow None to be passed to this argument
2653
2654
};

2655
/// \ingroup annotations
2656
/// Annotation for arguments with values
2657
struct arg_v : arg {
2658
private:
2659
    template <typename T>
2660
2661
    arg_v(arg &&base, T &&x, const char *descr = nullptr)
        : arg(base),
2662
2663
2664
          value(reinterpret_steal<object>(
              detail::make_caster<T>::cast(x, return_value_policy::automatic, {})
          )),
2665
2666
2667
2668
          descr(descr)
#if !defined(NDEBUG)
        , type(type_id<T>())
#endif
2669
2670
2671
2672
2673
2674
2675
2676
    {
        // Workaround! See:
        // https://github.com/pybind/pybind11/issues/2336
        // https://github.com/pybind/pybind11/pull/2685#issuecomment-731286700
        if (PyErr_Occurred()) {
            PyErr_Clear();
        }
    }
2677

2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
public:
    /// Direct construction with name, default, and description
    template <typename T>
    arg_v(const char *name, T &&x, const char *descr = nullptr)
        : arg_v(arg(name), std::forward<T>(x), descr) { }

    /// Called internally when invoking `py::arg("a") = value`
    template <typename T>
    arg_v(const arg &base, T &&x, const char *descr = nullptr)
        : arg_v(arg(base), std::forward<T>(x), descr) { }

    /// Same as `arg::noconvert()`, but returns *this as arg_v&, not arg&
    arg_v &noconvert(bool flag = true) { arg::noconvert(flag); return *this; }
2691
2692
2693

    /// Same as `arg::nonone()`, but returns *this as arg_v&, not arg&
    arg_v &none(bool flag = true) { arg::none(flag); return *this; }
2694
2695

    /// The default value
2696
    object value;
2697
    /// The (optional) description of the default value
2698
2699
    const char *descr;
#if !defined(NDEBUG)
2700
    /// The C++ type name of the default value (only available when compiled in debug mode)
2701
2702
2703
2704
    std::string type;
#endif
};

2705
2706
2707
/// \ingroup annotations
/// Annotation indicating that all following arguments are keyword-only; the is the equivalent of an
/// unnamed '*' argument (in Python 3)
Henry Schreiner's avatar
Henry Schreiner committed
2708
2709
2710
2711
2712
2713
struct kw_only {};

/// \ingroup annotations
/// Annotation indicating that all previous arguments are positional-only; the is the equivalent of an
/// unnamed '/' argument (in Python 3.8)
struct pos_only {};
2714

2715
template <typename T>
2716
arg_v arg::operator=(T &&value) const { return {std::move(*this), std::forward<T>(value)}; }
2717

Wenzel Jakob's avatar
Wenzel Jakob committed
2718
/// Alias for backward compatibility -- to be removed in version 2.0
2719
2720
2721
template <typename /*unused*/> using arg_t = arg_v;

inline namespace literals {
2722
2723
2724
/** \rst
    String literal version of `arg`
 \endrst */
2725
constexpr arg operator"" _a(const char *name, size_t) { return arg(name); }
2726
} // namespace literals
2727

2728
PYBIND11_NAMESPACE_BEGIN(detail)
2729

2730
// forward declaration (definition in attr.h)
2731
2732
struct function_record;

2733
2734
/// Internal data associated with a single function call
struct function_call {
2735
    function_call(const function_record &f, handle p); // Implementation in attr.h
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745

    /// The function data:
    const function_record &func;

    /// Arguments passed to the function:
    std::vector<handle> args;

    /// The `convert` value the arguments should be loaded with
    std::vector<bool> args_convert;

2746
2747
2748
2749
    /// Extra references for the optional `py::args` and/or `py::kwargs` arguments (which, if
    /// present, are also in `args` but without a reference).
    object args_ref, kwargs_ref;

2750
2751
    /// The parent, if any
    handle parent;
2752
2753
2754

    /// If this is a call to an initializer, this argument contains `self`
    handle init_self;
2755
2756
2757
};


2758
2759
2760
/// Helper class which loads arguments for C++ functions called from Python
template <typename... Args>
class argument_loader {
2761
    using indices = make_index_sequence<sizeof...(Args)>;
2762

2763
2764
2765
2766
2767
2768
2769
2770
2771
    template <typename Arg> using argument_is_args   = std::is_same<intrinsic_t<Arg>, args>;
    template <typename Arg> using argument_is_kwargs = std::is_same<intrinsic_t<Arg>, kwargs>;
    // Get args/kwargs argument positions relative to the end of the argument list:
    static constexpr auto args_pos = constexpr_first<argument_is_args, Args...>() - (int) sizeof...(Args),
                        kwargs_pos = constexpr_first<argument_is_kwargs, Args...>() - (int) sizeof...(Args);

    static constexpr bool args_kwargs_are_last = kwargs_pos >= - 1 && args_pos >= kwargs_pos - 1;

    static_assert(args_kwargs_are_last, "py::args/py::kwargs are only permitted as the last argument(s) of a function");
Jason Rhinelander's avatar
Jason Rhinelander committed
2772

2773
public:
2774
2775
    static constexpr bool has_kwargs = kwargs_pos < 0;
    static constexpr bool has_args = args_pos < 0;
2776

2777
    static constexpr auto arg_names = concat(type_descr(make_caster<Args>::name)...);
2778

2779
2780
    bool load_args(function_call &call) {
        return load_impl_sequence(call, indices{});
2781
2782
    }

Dean Moldovan's avatar
Dean Moldovan committed
2783
    template <typename Return, typename Guard, typename Func>
2784
    enable_if_t<!std::is_void<Return>::value, Return> call(Func &&f) && {
2785
        return std::move(*this).template call_impl<Return>(std::forward<Func>(f), indices{}, Guard{});
2786
2787
    }

Dean Moldovan's avatar
Dean Moldovan committed
2788
    template <typename Return, typename Guard, typename Func>
2789
2790
    enable_if_t<std::is_void<Return>::value, void_type> call(Func &&f) && {
        std::move(*this).template call_impl<Return>(std::forward<Func>(f), indices{}, Guard{});
2791
2792
2793
2794
2795
        return void_type();
    }

private:

2796
    static bool load_impl_sequence(function_call &, index_sequence<>) { return true; }
2797
2798

    template <size_t... Is>
2799
    bool load_impl_sequence(function_call &call, index_sequence<Is...>) {
2800
2801
2802
2803
#ifdef __cpp_fold_expressions
        if ((... || !std::get<Is>(argcasters).load(call.args[Is], call.args_convert[Is])))
            return false;
#else
2804
        for (bool r : {std::get<Is>(argcasters).load(call.args[Is], call.args_convert[Is])...})
2805
2806
            if (!r)
                return false;
2807
#endif
2808
2809
2810
        return true;
    }

Dean Moldovan's avatar
Dean Moldovan committed
2811
    template <typename Return, typename Func, size_t... Is, typename Guard>
2812
    Return call_impl(Func &&f, index_sequence<Is...>, Guard &&) && {
2813
        return std::forward<Func>(f)(cast_op<Args>(std::move(std::get<Is>(argcasters)))...);
2814
2815
    }

2816
    std::tuple<make_caster<Args>...> argcasters;
2817
2818
};

2819
2820
2821
2822
2823
2824
/// Helper class which collects only positional arguments for a Python function call.
/// A fancier version below can collect any argument, but this one is optimal for simple calls.
template <return_value_policy policy>
class simple_collector {
public:
    template <typename... Ts>
2825
    explicit simple_collector(Ts &&...values)
2826
2827
2828
2829
2830
2831
2832
2833
2834
        : m_args(pybind11::make_tuple<policy>(std::forward<Ts>(values)...)) { }

    const tuple &args() const & { return m_args; }
    dict kwargs() const { return {}; }

    tuple args() && { return std::move(m_args); }

    /// Call a Python function and pass the collected arguments
    object call(PyObject *ptr) const {
2835
        PyObject *result = PyObject_CallObject(ptr, m_args.ptr());
2836
2837
        if (!result)
            throw error_already_set();
2838
        return reinterpret_steal<object>(result);
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
    }

private:
    tuple m_args;
};

/// Helper class which collects positional, keyword, * and ** arguments for a Python function call
template <return_value_policy policy>
class unpacking_collector {
public:
    template <typename... Ts>
2850
    explicit unpacking_collector(Ts &&...values) {
2851
2852
2853
2854
2855
2856
        // Tuples aren't (easily) resizable so a list is needed for collection,
        // but the actual function call strictly requires a tuple.
        auto args_list = list();
        int _[] = { 0, (process(args_list, std::forward<Ts>(values)), 0)... };
        ignore_unused(_);

2857
        m_args = std::move(args_list);
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
    }

    const tuple &args() const & { return m_args; }
    const dict &kwargs() const & { return m_kwargs; }

    tuple args() && { return std::move(m_args); }
    dict kwargs() && { return std::move(m_kwargs); }

    /// Call a Python function and pass the collected arguments
    object call(PyObject *ptr) const {
2868
        PyObject *result = PyObject_Call(ptr, m_args.ptr(), m_kwargs.ptr());
2869
2870
        if (!result)
            throw error_already_set();
2871
        return reinterpret_steal<object>(result);
2872
2873
2874
2875
2876
    }

private:
    template <typename T>
    void process(list &args_list, T &&x) {
2877
        auto o = reinterpret_steal<object>(detail::make_caster<T>::cast(std::forward<T>(x), policy, {}));
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
        if (!o) {
#if defined(NDEBUG)
            argument_cast_error();
#else
            argument_cast_error(std::to_string(args_list.size()), type_id<T>());
#endif
        }
        args_list.append(o);
    }

    void process(list &args_list, detail::args_proxy ap) {
2889
        for (auto a : ap)
2890
            args_list.append(a);
2891
2892
    }

2893
    void process(list &/*args_list*/, arg_v a) {
2894
2895
2896
2897
2898
2899
2900
        if (!a.name)
#if defined(NDEBUG)
            nameless_argument_error();
#else
            nameless_argument_error(a.type);
#endif

2901
        if (m_kwargs.contains(a.name)) {
2902
2903
2904
2905
2906
2907
#if defined(NDEBUG)
            multiple_values_error();
#else
            multiple_values_error(a.name);
#endif
        }
2908
        if (!a.value) {
2909
2910
2911
#if defined(NDEBUG)
            argument_cast_error();
#else
2912
            argument_cast_error(a.name, a.type);
2913
2914
#endif
        }
2915
        m_kwargs[a.name] = a.value;
2916
2917
2918
    }

    void process(list &/*args_list*/, detail::kwargs_proxy kp) {
2919
2920
        if (!kp)
            return;
2921
        for (auto k : reinterpret_borrow<dict>(kp)) {
2922
            if (m_kwargs.contains(k.first)) {
2923
2924
2925
#if defined(NDEBUG)
                multiple_values_error();
#else
2926
                multiple_values_error(str(k.first));
2927
2928
2929
2930
2931
2932
#endif
            }
            m_kwargs[k.first] = k.second;
        }
    }

2933
2934
2935
2936
2937
2938
2939
2940
2941
    [[noreturn]] static void nameless_argument_error() {
        throw type_error("Got kwargs without a name; only named arguments "
                         "may be passed via py::arg() to a python function call. "
                         "(compile in debug mode for details)");
    }
    [[noreturn]] static void nameless_argument_error(std::string type) {
        throw type_error("Got kwargs without a name of type '" + type + "'; only named "
                         "arguments may be passed via py::arg() to a python function call. ");
    }
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
    [[noreturn]] static void multiple_values_error() {
        throw type_error("Got multiple values for keyword argument "
                         "(compile in debug mode for details)");
    }

    [[noreturn]] static void multiple_values_error(std::string name) {
        throw type_error("Got multiple values for keyword argument '" + name + "'");
    }

    [[noreturn]] static void argument_cast_error() {
        throw cast_error("Unable to convert call argument to Python object "
                         "(compile in debug mode for details)");
    }

    [[noreturn]] static void argument_cast_error(std::string name, std::string type) {
        throw cast_error("Unable to convert call argument '" + name
                         + "' of type '" + type + "' to Python object");
    }

private:
    tuple m_args;
    dict m_kwargs;
};

2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
// [workaround(intel)] Separate function required here
// We need to put this into a separate function because the Intel compiler
// fails to compile enable_if_t<!all_of<is_positional<Args>...>::value>
// (tested with ICC 2021.1 Beta 20200827).
template <typename... Args>
constexpr bool args_are_all_positional()
{
  return all_of<is_positional<Args>...>::value;
}

2976
2977
/// Collect only positional arguments for a Python function call
template <return_value_policy policy, typename... Args,
2978
          typename = enable_if_t<args_are_all_positional<Args...>()>>
2979
simple_collector<policy> collect_arguments(Args &&...args) {
2980
    return simple_collector<policy>(std::forward<Args>(args)...);
2981
2982
2983
2984
}

/// Collect all arguments, including keywords and unpacking (only instantiated when needed)
template <return_value_policy policy, typename... Args,
2985
          typename = enable_if_t<!args_are_all_positional<Args...>()>>
2986
2987
2988
2989
2990
2991
2992
2993
unpacking_collector<policy> collect_arguments(Args &&...args) {
    // Following argument order rules for generalized unpacking according to PEP 448
    static_assert(
        constexpr_last<is_positional, Args...>() < constexpr_first<is_keyword_or_ds, Args...>()
        && constexpr_last<is_s_unpacking, Args...>() < constexpr_first<is_ds_unpacking, Args...>(),
        "Invalid function call: positional args must precede keywords and ** unpacking; "
        "* unpacking must precede ** unpacking"
    );
2994
    return unpacking_collector<policy>(std::forward<Args>(args)...);
2995
2996
}

2997
template <typename Derived>
2998
template <return_value_policy policy, typename... Args>
2999
3000
object object_api<Derived>::operator()(Args &&...args) const {
    return detail::collect_arguments<policy>(std::forward<Args>(args)...).call(derived().ptr());
Wenzel Jakob's avatar
Wenzel Jakob committed
3001
3002
}

3003
3004
3005
template <typename Derived>
template <return_value_policy policy, typename... Args>
object object_api<Derived>::call(Args &&...args) const {
3006
    return operator()<policy>(std::forward<Args>(args)...);
3007
3008
}

3009
PYBIND11_NAMESPACE_END(detail)
3010

3011
3012

template<typename T>
3013
handle type::handle_of() {
3014
3015
3016
3017
    static_assert(
        detail::any_of<std::is_base_of<detail::type_caster_generic, detail::make_caster<T>>,
                       detail::is_smart_holder_type_caster<T>>::value,
        "py::type::of<T> only supports the case where T is a registered C++ types.");
3018

3019
    return detail::get_type_handle(typeid(T), true);
3020
3021
3022
}


3023
#define PYBIND11_MAKE_OPAQUE(...) \
Wenzel Jakob's avatar
Wenzel Jakob committed
3024
    namespace pybind11 { namespace detail { \
3025
        template<> class type_caster<__VA_ARGS__> : public type_caster_for_class_<__VA_ARGS__> { }; \
Wenzel Jakob's avatar
Wenzel Jakob committed
3026
3027
    }}

3028
/// Lets you pass a type containing a `,` through a macro parameter without needing a separate
3029
/// typedef, e.g.: `PYBIND11_OVERRIDE(PYBIND11_TYPE(ReturnType<A, B>), PYBIND11_TYPE(Parent<C, D>), f, arg)`
3030
3031
#define PYBIND11_TYPE(...) __VA_ARGS__

3032
PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)