From 91f97ca401dbf7686ef4e1bc94b7236d5ba766ff Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Fri, 28 May 2021 15:35:50 +0200 Subject: [PATCH] smart_holder fixups (#3012) * Drop constraints on casting of std::shared_ptr std::shared_ptrs can be shared across python and C++ by design. * Correctly report casting error It is important to return an empty handle. Simply returning None, would skip the error handling in simple_collector / unpacking_collector, although a python exception is set. A function call would then be processed with a (wrong) None argument! * Return None for nullptr * Revert "Drop constraints on casting of std::shared_ptr" This reverts commit 7cf53ae8b4f99c0382845acf8bc63b64924dc891. --- .../pybind11/detail/smart_holder_type_casters.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/include/pybind11/detail/smart_holder_type_casters.h b/include/pybind11/detail/smart_holder_type_casters.h index 22758e101..15ab81c58 100644 --- a/include/pybind11/detail/smart_holder_type_casters.h +++ b/include/pybind11/detail/smart_holder_type_casters.h @@ -624,15 +624,18 @@ struct smart_holder_type_caster> : smart_holder_type_caster_l static handle cast(const std::shared_ptr &src, return_value_policy policy, handle parent) { if (policy != return_value_policy::automatic - && policy != return_value_policy::reference_internal) { + && policy != return_value_policy::reference_internal + && policy != return_value_policy::automatic_reference) { // SMART_HOLDER_WIP: IMPROVABLE: Error message. throw cast_error("Invalid return_value_policy for shared_ptr."); } + if (!src) + return none().release(); auto src_raw_ptr = src.get(); auto st = type_caster_base::src_and_type(src_raw_ptr); - if (st.first == nullptr) - return none().release(); // PyErr was set already. + if (st.second == nullptr) + return handle(); // no type info: error will be set already void *src_raw_void_ptr = static_cast(src_raw_ptr); const detail::type_info *tinfo = st.second; @@ -693,11 +696,13 @@ struct smart_holder_type_caster> : smart_holder_type_caste // SMART_HOLDER_WIP: IMPROVABLE: Error message. throw cast_error("Invalid return_value_policy for unique_ptr."); } + if (!src) + return none().release(); auto src_raw_ptr = src.get(); auto st = type_caster_base::src_and_type(src_raw_ptr); - if (st.first == nullptr) - return none().release(); // PyErr was set already. + if (st.second == nullptr) + return handle(); // no type info: error will be set already void *src_raw_void_ptr = static_cast(src_raw_ptr); const detail::type_info *tinfo = st.second;