@@ -393,6 +393,9 @@ struct smart_holder_type_caster_load {
393
393
throw_if_uninitialized_or_disowned_holder ();
394
394
holder_type &hld = holder ();
395
395
hld.ensure_is_not_disowned (" loaded_as_shared_ptr" );
396
+ if (hld.vptr_is_using_noop_deleter ) {
397
+ throw std::runtime_error (" Non-owning holder (loaded_as_shared_ptr)." );
398
+ }
396
399
auto void_raw_ptr = hld.template as_raw_ptr_unowned <void >();
397
400
auto type_raw_ptr = convert_type (void_raw_ptr);
398
401
if (hld.pointee_depends_on_holder_owner ) {
@@ -407,12 +410,26 @@ struct smart_holder_type_caster_load {
407
410
vptr_gd_ptr->released_ptr = to_be_released;
408
411
return to_be_released;
409
412
}
413
+ if (std::get_deleter<shared_ptr_dec_ref_deleter>(hld.vptr ) != nullptr ) {
414
+ // SMART_HOLDER_WIP: unit test coverage.
415
+ std::shared_ptr<void > void_shd_ptr = hld.template as_shared_ptr <void >();
416
+ return std::shared_ptr<T>(void_shd_ptr, type_raw_ptr);
417
+ }
418
+ if (!pybindit::memory::type_has_shared_from_this (type_raw_ptr)) {
419
+ // SMART_HOLDER_WIP: unit test coverage.
420
+ // SMART_HOLDER_WIP: keep weak_ref?
421
+ auto self = reinterpret_cast <PyObject *>(load_impl.loaded_v_h .inst );
422
+ Py_INCREF (self);
423
+ return std::shared_ptr<T>(type_raw_ptr, shared_ptr_dec_ref_deleter{self});
424
+ }
425
+ if (hld.vptr_is_external_shared_ptr ) {
426
+ // SMART_HOLDER_WIP: unit test coverage.
427
+ pybind11_fail (" smart_holder_type_casters loaded_as_shared_ptr failure: external "
428
+ " shared_ptr for type with shared_from_this." );
429
+ }
410
430
pybind11_fail (" smart_holder_type_casters: loaded_as_shared_ptr failure: internal "
411
431
" inconsistency." );
412
432
}
413
- if (hld.vptr_is_using_noop_deleter ) {
414
- throw std::runtime_error (" Non-owning holder (loaded_as_shared_ptr)." );
415
- }
416
433
std::shared_ptr<void > void_shd_ptr = hld.template as_shared_ptr <void >();
417
434
return std::shared_ptr<T>(void_shd_ptr, type_raw_ptr);
418
435
}
0 commit comments