@@ -237,7 +237,7 @@ class type_caster_generic {
237
237
/* Perform an implicit conversion */
238
238
if (convert) {
239
239
for (auto &converter : typeinfo->implicit_conversions ) {
240
- temp = object (converter (src.ptr (), typeinfo->type ), false );
240
+ temp = reinterpret_steal< object> (converter (src.ptr (), typeinfo->type ));
241
241
if (load (temp, false ))
242
242
return true ;
243
243
}
@@ -284,7 +284,7 @@ class type_caster_generic {
284
284
return handle ((PyObject *) it_i->second ).inc_ref ();
285
285
}
286
286
287
- object inst (PyType_GenericAlloc (tinfo->type , 0 ), false );
287
+ auto inst = reinterpret_steal<object> (PyType_GenericAlloc (tinfo->type , 0 ));
288
288
289
289
auto wrapper = (instance<void > *) inst.ptr ();
290
290
@@ -474,9 +474,9 @@ struct type_caster<T, enable_if_t<std::is_arithmetic<T>::value>> {
474
474
#endif
475
475
PyErr_Clear ();
476
476
if (type_error && PyNumber_Check (src.ptr ())) {
477
- object tmp (std::is_floating_point<T>::value
478
- ? PyNumber_Float (src.ptr ())
479
- : PyNumber_Long (src.ptr ()), true );
477
+ auto tmp = reinterpret_borrow<object> (std::is_floating_point<T>::value
478
+ ? PyNumber_Float (src.ptr ())
479
+ : PyNumber_Long (src.ptr ()));
480
480
PyErr_Clear ();
481
481
return load (tmp, false );
482
482
}
@@ -529,7 +529,7 @@ template <> class type_caster<void> : public type_caster<void_type> {
529
529
530
530
/* Check if this is a capsule */
531
531
if (isinstance<capsule>(h)) {
532
- value = capsule (h, true );
532
+ value = reinterpret_borrow< capsule>(h );
533
533
return true ;
534
534
}
535
535
@@ -581,7 +581,7 @@ template <> class type_caster<std::string> {
581
581
if (!src) {
582
582
return false ;
583
583
} else if (PyUnicode_Check (load_src.ptr ())) {
584
- temp = object (PyUnicode_AsUTF8String (load_src.ptr ()), false );
584
+ temp = reinterpret_steal< object> (PyUnicode_AsUTF8String (load_src.ptr ()));
585
585
if (!temp) { PyErr_Clear (); return false ; } // UnicodeEncodeError
586
586
load_src = temp;
587
587
}
@@ -622,7 +622,7 @@ template <> class type_caster<std::wstring> {
622
622
if (!src) {
623
623
return false ;
624
624
} else if (!PyUnicode_Check (load_src.ptr ())) {
625
- temp = object (PyUnicode_FromObject (load_src.ptr ()), false );
625
+ temp = reinterpret_steal< object> (PyUnicode_FromObject (load_src.ptr ()));
626
626
if (!temp) { PyErr_Clear (); return false ; }
627
627
load_src = temp;
628
628
}
@@ -631,10 +631,10 @@ template <> class type_caster<std::wstring> {
631
631
#if PY_MAJOR_VERSION >= 3
632
632
buffer = PyUnicode_AsWideCharString (load_src.ptr (), &length);
633
633
#else
634
- temp = object (
634
+ temp = reinterpret_steal< object> (
635
635
sizeof (wchar_t ) == sizeof (short )
636
636
? PyUnicode_AsUTF16String (load_src.ptr ())
637
- : PyUnicode_AsUTF32String (load_src.ptr ()), false );
637
+ : PyUnicode_AsUTF32String (load_src.ptr ()));
638
638
if (temp) {
639
639
int err = PYBIND11_BYTES_AS_STRING_AND_SIZE (temp.ptr (), (char **) &buffer, &length);
640
640
if (err == -1 ) { buffer = nullptr ; } // TypeError
@@ -715,8 +715,8 @@ template <typename T1, typename T2> class type_caster<std::pair<T1, T2>> {
715
715
}
716
716
717
717
static handle cast (const type &src, return_value_policy policy, handle parent) {
718
- object o1 = object (make_caster<T1>::cast (src.first , policy, parent), false );
719
- object o2 = object (make_caster<T2>::cast (src.second , policy, parent), false );
718
+ auto o1 = reinterpret_steal< object> (make_caster<T1>::cast (src.first , policy, parent));
719
+ auto o2 = reinterpret_steal< object> (make_caster<T2>::cast (src.second , policy, parent));
720
720
if (!o1 || !o2)
721
721
return handle ();
722
722
tuple result (2 );
@@ -831,7 +831,7 @@ template <typename... Tuple> class type_caster<std::tuple<Tuple...>> {
831
831
/* Implementation: Convert a C++ tuple into a Python tuple */
832
832
template <size_t ... Indices> static handle cast (const type &src, return_value_policy policy, handle parent, index_sequence<Indices...>) {
833
833
std::array<object, size> entries {{
834
- object (make_caster<Tuple>::cast (std::get<Indices>(src), policy, parent), false )...
834
+ reinterpret_steal< object> (make_caster<Tuple>::cast (std::get<Indices>(src), policy, parent))...
835
835
}};
836
836
for (const auto &entry: entries)
837
837
if (!entry)
@@ -904,7 +904,7 @@ template <typename type, typename holder_type> class type_caster_holder : public
904
904
905
905
if (convert) {
906
906
for (auto &converter : typeinfo->implicit_conversions ) {
907
- temp = object (converter (src.ptr (), typeinfo->type ), false );
907
+ temp = reinterpret_steal< object> (converter (src.ptr (), typeinfo->type ));
908
908
if (load (temp, false ))
909
909
return true ;
910
910
}
@@ -1055,6 +1055,7 @@ template <typename T> make_caster<T> load_type(const handle &handle) {
1055
1055
1056
1056
NAMESPACE_END (detail)
1057
1057
1058
+ // pytype -> C++ type
1058
1059
template <typename T, detail::enable_if_t<!detail::is_pyobject<T>::value, int> = 0>
1059
1060
T cast(const handle &handle) {
1060
1061
static_assert (!detail::cast_is_temporary_value_reference<T>::value,
@@ -1063,17 +1064,19 @@ T cast(const handle &handle) {
1063
1064
return detail::load_type<T>(handle).operator typename type_caster::template cast_op_type<T>();
1064
1065
}
1065
1066
1067
+ // pytype -> pytype (calls converting constructor)
1066
1068
template <typename T, detail::enable_if_t <detail::is_pyobject<T>::value, int > = 0 >
1067
- T cast (const handle &handle) { return { handle, true } ; }
1069
+ T cast (const handle &handle) { return T (reinterpret_borrow<object>( handle)) ; }
1068
1070
1071
+ // C++ type -> py::object
1069
1072
template <typename T, detail::enable_if_t <!detail::is_pyobject<T>::value, int > = 0 >
1070
1073
object cast (const T &value, return_value_policy policy = return_value_policy::automatic_reference,
1071
1074
handle parent = handle()) {
1072
1075
if (policy == return_value_policy::automatic)
1073
1076
policy = std::is_pointer<T>::value ? return_value_policy::take_ownership : return_value_policy::copy;
1074
1077
else if (policy == return_value_policy::automatic_reference)
1075
1078
policy = std::is_pointer<T>::value ? return_value_policy::reference : return_value_policy::copy;
1076
- return object (detail::make_caster<T>::cast (value, policy, parent), false );
1079
+ return reinterpret_steal< object> (detail::make_caster<T>::cast (value, policy, parent));
1077
1080
}
1078
1081
1079
1082
template <typename T> T handle::cast () const { return pybind11::cast<T>(*this ); }
@@ -1147,8 +1150,8 @@ template <return_value_policy policy = return_value_policy::automatic_reference,
1147
1150
typename... Args> tuple make_tuple(Args&&... args_) {
1148
1151
const size_t size = sizeof ...(Args);
1149
1152
std::array<object, size> args {
1150
- { object (detail::make_caster<Args>::cast (
1151
- std::forward<Args>(args_), policy, nullptr ), false )... }
1153
+ { reinterpret_steal< object> (detail::make_caster<Args>::cast (
1154
+ std::forward<Args>(args_), policy, nullptr ))... }
1152
1155
};
1153
1156
for (auto &arg_value : args) {
1154
1157
if (!arg_value) {
@@ -1180,7 +1183,9 @@ struct arg_v : arg {
1180
1183
template <typename T>
1181
1184
arg_v (const char *name, T &&x, const char *descr = nullptr )
1182
1185
: arg(name),
1183
- value (detail::make_caster<T>::cast(x, return_value_policy::automatic, handle()), false),
1186
+ value (reinterpret_steal<object>(
1187
+ detail::make_caster<T>::cast(x, return_value_policy::automatic, {})
1188
+ )),
1184
1189
descr(descr)
1185
1190
#if !defined(NDEBUG)
1186
1191
, type(type_id<T>())
@@ -1241,10 +1246,10 @@ class simple_collector {
1241
1246
1242
1247
// / Call a Python function and pass the collected arguments
1243
1248
object call (PyObject *ptr) const {
1244
- auto result = object ( PyObject_CallObject (ptr, m_args.ptr ()), false );
1249
+ PyObject * result = PyObject_CallObject (ptr, m_args.ptr ());
1245
1250
if (!result)
1246
1251
throw error_already_set ();
1247
- return result;
1252
+ return reinterpret_steal<object>( result) ;
1248
1253
}
1249
1254
1250
1255
private:
@@ -1274,16 +1279,16 @@ class unpacking_collector {
1274
1279
1275
1280
// / Call a Python function and pass the collected arguments
1276
1281
object call (PyObject *ptr) const {
1277
- auto result = object ( PyObject_Call (ptr, m_args.ptr (), m_kwargs.ptr ()), false );
1282
+ PyObject * result = PyObject_Call (ptr, m_args.ptr (), m_kwargs.ptr ());
1278
1283
if (!result)
1279
1284
throw error_already_set ();
1280
- return result;
1285
+ return reinterpret_steal<object>( result) ;
1281
1286
}
1282
1287
1283
1288
private:
1284
1289
template <typename T>
1285
1290
void process (list &args_list, T &&x) {
1286
- auto o = object (detail::make_caster<T>::cast (std::forward<T>(x), policy, nullptr ), false );
1291
+ auto o = reinterpret_steal< object> (detail::make_caster<T>::cast (std::forward<T>(x), policy, {}) );
1287
1292
if (!o) {
1288
1293
#if defined(NDEBUG)
1289
1294
argument_cast_error ();
0 commit comments