mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-25 14:45:12 +00:00
Factoring out find_registered_python_instance() from type_caster_generic::cast. (#2822)
Factoring out find_registered_python_instance() from type_caster_generic::cast.
This commit is contained in:
parent
87954e7a54
commit
9b7bfef833
@ -207,6 +207,19 @@ PYBIND11_NOINLINE inline handle get_type_handle(const std::type_info &tp, bool t
|
|||||||
return handle(type_info ? ((PyObject *) type_info->type) : nullptr);
|
return handle(type_info ? ((PyObject *) type_info->type) : nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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();
|
||||||
|
}
|
||||||
|
|
||||||
struct value_and_holder {
|
struct value_and_holder {
|
||||||
instance *inst = nullptr;
|
instance *inst = nullptr;
|
||||||
size_t index = 0u;
|
size_t index = 0u;
|
||||||
@ -508,13 +521,8 @@ public:
|
|||||||
if (src == nullptr)
|
if (src == nullptr)
|
||||||
return none().release();
|
return none().release();
|
||||||
|
|
||||||
auto it_instances = get_internals().registered_instances.equal_range(src);
|
if (handle registered_inst = find_registered_python_instance(src, tinfo))
|
||||||
for (auto it_i = it_instances.first; it_i != it_instances.second; ++it_i) {
|
return registered_inst;
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
auto inst = reinterpret_steal<object>(make_new_instance(tinfo->type));
|
auto inst = reinterpret_steal<object>(make_new_instance(tinfo->type));
|
||||||
auto wrapper = reinterpret_cast<instance *>(inst.ptr());
|
auto wrapper = reinterpret_cast<instance *>(inst.ptr());
|
||||||
|
Loading…
Reference in New Issue
Block a user