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:
Ralf W. Grosse-Kunstleve 2021-01-27 00:08:46 -05:00 committed by GitHub
parent 87954e7a54
commit 9b7bfef833
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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());