Skip to content

Commit 529e3d8

Browse files
committed
Factoring out find_registered_python_instance() from type_caster_generic::cast.
1 parent 8e5d3d2 commit 529e3d8

File tree

1 file changed

+16
-7
lines changed

1 file changed

+16
-7
lines changed

include/pybind11/cast.h

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,19 @@ PYBIND11_NOINLINE inline handle get_type_handle(const std::type_info &tp, bool t
207207
return handle(type_info ? ((PyObject *) type_info->type) : nullptr);
208208
}
209209

210+
// Searches all_type_info for a registered instance, i.e. moving up the inheritance hierarchy.
211+
PYBIND11_NOINLINE inline handle find_registered_python_instance(void *src,
212+
const detail::type_info *tinfo) {
213+
auto it_instances = get_internals().registered_instances.equal_range(src);
214+
for (auto it_i = it_instances.first; it_i != it_instances.second; ++it_i) {
215+
for (auto instance_type : detail::all_type_info(Py_TYPE(it_i->second))) {
216+
if (instance_type && same_type(*instance_type->cpptype, *tinfo->cpptype))
217+
return handle((PyObject *) it_i->second).inc_ref();
218+
}
219+
}
220+
return handle();
221+
}
222+
210223
struct value_and_holder {
211224
instance *inst = nullptr;
212225
size_t index = 0u;
@@ -508,13 +521,9 @@ class type_caster_generic {
508521
if (src == nullptr)
509522
return none().release();
510523

511-
auto it_instances = get_internals().registered_instances.equal_range(src);
512-
for (auto it_i = it_instances.first; it_i != it_instances.second; ++it_i) {
513-
for (auto instance_type : detail::all_type_info(Py_TYPE(it_i->second))) {
514-
if (instance_type && same_type(*instance_type->cpptype, *tinfo->cpptype))
515-
return handle((PyObject *) it_i->second).inc_ref();
516-
}
517-
}
524+
handle registered_inst = find_registered_python_instance(src, tinfo);
525+
if (registered_inst)
526+
return registered_inst;
518527

519528
auto inst = reinterpret_steal<object>(make_new_instance(tinfo->type));
520529
auto wrapper = reinterpret_cast<instance *>(inst.ptr());

0 commit comments

Comments
 (0)