From 3d4bf091f37dc0f2d5757e8095139664b6618a7c Mon Sep 17 00:00:00 2001 From: "Ralf W. Grosse-Kunstleve" Date: Wed, 20 Jan 2021 19:11:10 -0800 Subject: [PATCH] Decoupling generic_type from type_caster_generic. --- include/pybind11/classh.h | 2 +- include/pybind11/pybind11.h | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/include/pybind11/classh.h b/include/pybind11/classh.h index a23468f6f..15b6e8ab9 100644 --- a/include/pybind11/classh.h +++ b/include/pybind11/classh.h @@ -60,7 +60,7 @@ public: /* Process optional arguments, if any */ process_attributes::init(extra..., &record); - generic_type::initialize(record); + generic_type::initialize(record, &modified_type_caster_generic_load_impl::local_load); if (has_alias) { auto &instances = record.module_local ? registered_local_types_cpp() : get_internals().registered_types_cpp; diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h index 941d4f3c0..9c8e5f0d1 100644 --- a/include/pybind11/pybind11.h +++ b/include/pybind11/pybind11.h @@ -1082,7 +1082,8 @@ class generic_type : public object { public: PYBIND11_OBJECT_DEFAULT(generic_type, object, PyType_Check) protected: - void initialize(const type_record &rec) { + void initialize(const type_record &rec, + void *(*type_caster_module_local_load)(PyObject *, const type_info *)) { if (rec.scope && hasattr(rec.scope, "__dict__") && rec.scope.attr("__dict__").contains(rec.name)) pybind11_fail("generic_type: cannot initialize type \"" + std::string(rec.name) + "\": an object with that name is already defined"); @@ -1128,7 +1129,7 @@ protected: if (rec.module_local) { // Stash the local typeinfo and loader so that external modules can access it. - tinfo->module_local_load = &type_caster_generic::local_load; // TODO classh_type_casters local_load + tinfo->module_local_load = type_caster_module_local_load; setattr(m_ptr, PYBIND11_MODULE_LOCAL_ID, capsule(tinfo)); } } @@ -1295,7 +1296,7 @@ public: /* Process optional arguments, if any */ process_attributes::init(extra..., &record); - generic_type::initialize(record); + generic_type::initialize(record, &type_caster_generic::local_load); if (has_alias) { auto &instances = record.module_local ? registered_local_types_cpp() : get_internals().registered_types_cpp;