@@ -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
@@ -487,9 +487,9 @@ struct type_caster<T, enable_if_t<std::is_arithmetic<T>::value>> {
487
487
#endif
488
488
PyErr_Clear ();
489
489
if (type_error && PyNumber_Check (src.ptr ())) {
490
- object tmp (std::is_floating_point<T>::value
491
- ? PyNumber_Float (src.ptr ())
492
- : PyNumber_Long (src.ptr ()), true );
490
+ auto tmp = reinterpret_borrow<object> (std::is_floating_point<T>::value
491
+ ? PyNumber_Float (src.ptr ())
492
+ : PyNumber_Long (src.ptr ()));
493
493
PyErr_Clear ();
494
494
return load (tmp, false );
495
495
}
@@ -544,7 +544,7 @@ template <> class type_caster<void> : public type_caster<void_type> {
544
544
545
545
/* Check if this is a capsule */
546
546
if (isinstance<capsule>(h)) {
547
- value = capsule (h, true );
547
+ value = reinterpret_borrow< capsule>(h );
548
548
return true ;
549
549
}
550
550
@@ -596,7 +596,7 @@ template <> class type_caster<std::string> {
596
596
if (!src) {
597
597
return false ;
598
598
} else if (PyUnicode_Check (load_src.ptr ())) {
599
- temp = object (PyUnicode_AsUTF8String (load_src.ptr ()), false );
599
+ temp = reinterpret_steal< object> (PyUnicode_AsUTF8String (load_src.ptr ()));
600
600
if (!temp) { PyErr_Clear (); return false ; } // UnicodeEncodeError
601
601
load_src = temp;
602
602
}
@@ -637,7 +637,7 @@ template <> class type_caster<std::wstring> {
637
637
if (!src) {
638
638
return false ;
639
639
} else if (!PyUnicode_Check (load_src.ptr ())) {
640
- temp = object (PyUnicode_FromObject (load_src.ptr ()), false );
640
+ temp = reinterpret_steal< object> (PyUnicode_FromObject (load_src.ptr ()));
641
641
if (!temp) { PyErr_Clear (); return false ; }
642
642
load_src = temp;
643
643
}
@@ -646,10 +646,10 @@ template <> class type_caster<std::wstring> {
646
646
#if PY_MAJOR_VERSION >= 3
647
647
buffer = PyUnicode_AsWideCharString (load_src.ptr (), &length);
648
648
#else
649
- temp = object (
649
+ temp = reinterpret_steal< object> (
650
650
sizeof (wchar_t ) == sizeof (short )
651
651
? PyUnicode_AsUTF16String (load_src.ptr ())
652
- : PyUnicode_AsUTF32String (load_src.ptr ()), false );
652
+ : PyUnicode_AsUTF32String (load_src.ptr ()));
653
653
if (temp) {
654
654
int err = PYBIND11_BYTES_AS_STRING_AND_SIZE (temp.ptr (), (char **) &buffer, &length);
655
655
if (err == -1 ) { buffer = nullptr ; } // TypeError
@@ -730,8 +730,8 @@ template <typename T1, typename T2> class type_caster<std::pair<T1, T2>> {
730
730
}
731
731
732
732
static handle cast (const type &src, return_value_policy policy, handle parent) {
733
- object o1 = object (make_caster<T1>::cast (src.first , policy, parent), false );
734
- object o2 = object (make_caster<T2>::cast (src.second , policy, parent), false );
733
+ auto o1 = reinterpret_steal< object> (make_caster<T1>::cast (src.first , policy, parent));
734
+ auto o2 = reinterpret_steal< object> (make_caster<T2>::cast (src.second , policy, parent));
735
735
if (!o1 || !o2)
736
736
return handle ();
737
737
tuple result (2 );
@@ -846,7 +846,7 @@ template <typename... Tuple> class type_caster<std::tuple<Tuple...>> {
846
846
/* Implementation: Convert a C++ tuple into a Python tuple */
847
847
template <size_t ... Indices> static handle cast (const type &src, return_value_policy policy, handle parent, index_sequence<Indices...>) {
848
848
std::array<object, size> entries {{
849
- object (make_caster<Tuple>::cast (std::get<Indices>(src), policy, parent), false )...
849
+ reinterpret_steal< object> (make_caster<Tuple>::cast (std::get<Indices>(src), policy, parent))...
850
850
}};
851
851
for (const auto &entry: entries)
852
852
if (!entry)
@@ -919,7 +919,7 @@ template <typename type, typename holder_type> class type_caster_holder : public
919
919
920
920
if (convert) {
921
921
for (auto &converter : typeinfo->implicit_conversions ) {
922
- temp = object (converter (src.ptr (), typeinfo->type ), false );
922
+ temp = reinterpret_steal< object> (converter (src.ptr (), typeinfo->type ));
923
923
if (load (temp, false ))
924
924
return true ;
925
925
}
@@ -1070,6 +1070,7 @@ template <typename T> make_caster<T> load_type(const handle &handle) {
1070
1070
1071
1071
NAMESPACE_END (detail)
1072
1072
1073
+ // pytype -> C++ type
1073
1074
template <typename T, detail::enable_if_t<!detail::is_pyobject<T>::value, int> = 0>
1074
1075
T cast(const handle &handle) {
1075
1076
static_assert (!detail::cast_is_temporary_value_reference<T>::value,
@@ -1078,17 +1079,19 @@ T cast(const handle &handle) {
1078
1079
return detail::load_type<T>(handle).operator typename type_caster::template cast_op_type<T>();
1079
1080
}
1080
1081
1082
+ // pytype -> pytype (calls converting constructor)
1081
1083
template <typename T, detail::enable_if_t <detail::is_pyobject<T>::value, int > = 0 >
1082
- T cast (const handle &handle) { return { handle, true } ; }
1084
+ T cast (const handle &handle) { return T (reinterpret_borrow<object>( handle)) ; }
1083
1085
1086
+ // C++ type -> py::object
1084
1087
template <typename T, detail::enable_if_t <!detail::is_pyobject<T>::value, int > = 0 >
1085
1088
object cast (const T &value, return_value_policy policy = return_value_policy::automatic_reference,
1086
1089
handle parent = handle()) {
1087
1090
if (policy == return_value_policy::automatic)
1088
1091
policy = std::is_pointer<T>::value ? return_value_policy::take_ownership : return_value_policy::copy;
1089
1092
else if (policy == return_value_policy::automatic_reference)
1090
1093
policy = std::is_pointer<T>::value ? return_value_policy::reference : return_value_policy::copy;
1091
- return object (detail::make_caster<T>::cast (value, policy, parent), false );
1094
+ return reinterpret_steal< object> (detail::make_caster<T>::cast (value, policy, parent));
1092
1095
}
1093
1096
1094
1097
template <typename T> T handle::cast () const { return pybind11::cast<T>(*this ); }
@@ -1162,8 +1165,8 @@ template <return_value_policy policy = return_value_policy::automatic_reference,
1162
1165
typename... Args> tuple make_tuple(Args&&... args_) {
1163
1166
const size_t size = sizeof ...(Args);
1164
1167
std::array<object, size> args {
1165
- { object (detail::make_caster<Args>::cast (
1166
- std::forward<Args>(args_), policy, nullptr ), false )... }
1168
+ { reinterpret_steal< object> (detail::make_caster<Args>::cast (
1169
+ std::forward<Args>(args_), policy, nullptr ))... }
1167
1170
};
1168
1171
for (auto &arg_value : args) {
1169
1172
if (!arg_value) {
@@ -1195,7 +1198,9 @@ struct arg_v : arg {
1195
1198
template <typename T>
1196
1199
arg_v (const char *name, T &&x, const char *descr = nullptr )
1197
1200
: arg(name),
1198
- value (detail::make_caster<T>::cast(x, return_value_policy::automatic, handle()), false),
1201
+ value (reinterpret_steal<object>(
1202
+ detail::make_caster<T>::cast(x, return_value_policy::automatic, {})
1203
+ )),
1199
1204
descr(descr)
1200
1205
#if !defined(NDEBUG)
1201
1206
, type(type_id<T>())
@@ -1256,10 +1261,10 @@ class simple_collector {
1256
1261
1257
1262
// / Call a Python function and pass the collected arguments
1258
1263
object call (PyObject *ptr) const {
1259
- auto result = object ( PyObject_CallObject (ptr, m_args.ptr ()), false );
1264
+ PyObject * result = PyObject_CallObject (ptr, m_args.ptr ());
1260
1265
if (!result)
1261
1266
throw error_already_set ();
1262
- return result;
1267
+ return reinterpret_steal<object>( result) ;
1263
1268
}
1264
1269
1265
1270
private:
@@ -1289,16 +1294,16 @@ class unpacking_collector {
1289
1294
1290
1295
// / Call a Python function and pass the collected arguments
1291
1296
object call (PyObject *ptr) const {
1292
- auto result = object ( PyObject_Call (ptr, m_args.ptr (), m_kwargs.ptr ()), false );
1297
+ PyObject * result = PyObject_Call (ptr, m_args.ptr (), m_kwargs.ptr ());
1293
1298
if (!result)
1294
1299
throw error_already_set ();
1295
- return result;
1300
+ return reinterpret_steal<object>( result) ;
1296
1301
}
1297
1302
1298
1303
private:
1299
1304
template <typename T>
1300
1305
void process (list &args_list, T &&x) {
1301
- auto o = object (detail::make_caster<T>::cast (std::forward<T>(x), policy, nullptr ), false );
1306
+ auto o = reinterpret_steal< object> (detail::make_caster<T>::cast (std::forward<T>(x), policy, {}) );
1302
1307
if (!o) {
1303
1308
#if defined(NDEBUG)
1304
1309
argument_cast_error ();
0 commit comments