diff --git a/include/pybind11/detail/smart_holder_type_casters.h b/include/pybind11/detail/smart_holder_type_casters.h index c76ce9f4a..9ff79e7b1 100644 --- a/include/pybind11/detail/smart_holder_type_casters.h +++ b/include/pybind11/detail/smart_holder_type_casters.h @@ -99,7 +99,9 @@ public: } loaded_v_h = sub_caster.loaded_v_h; loaded_v_h_cpptype = cast.first; - implicit_cast = cast.second; + // the sub_caster is being discarded, so steal its vector + implicit_casts = std::move(sub_caster.implicit_casts); + implicit_casts.emplace_back(cast.second); return true; } } @@ -180,7 +182,7 @@ public: } loaded_v_h = foreign_loader->loaded_v_h; loaded_v_h_cpptype = foreign_loader->loaded_v_h_cpptype; - implicit_cast = foreign_loader->implicit_cast; + implicit_casts = foreign_loader->implicit_casts; // SMART_HOLDER_WIP: should this be a copy or move? return true; } return false; @@ -286,7 +288,7 @@ public: void *unowned_void_ptr_from_direct_conversion = nullptr; void *unowned_void_ptr_from_void_ptr_capsule = nullptr; const std::type_info *loaded_v_h_cpptype = nullptr; - void *(*implicit_cast)(void *) = nullptr; + std::vector implicit_casts; value_and_holder loaded_v_h; bool reinterpret_cast_deemed_ok = false; // Magic number intentionally hard-coded, to guard against class_ holder mixups. @@ -567,8 +569,10 @@ private: 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); + && !load_impl.reinterpret_cast_deemed_ok && !load_impl.implicit_casts.empty()) { + for (auto implicit_cast: load_impl.implicit_casts) { + void_ptr = implicit_cast(void_ptr); + } } return static_cast(void_ptr); }