mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-30 00:47:12 +00:00
Incref descriptors properly when creating arrays
This commit is contained in:
parent
669e14269d
commit
2a7acb6d55
@ -29,12 +29,10 @@ for func, dtype in [(create_rec_simple, simple_dtype), (create_rec_packed, packe
|
|||||||
check_eq(arr, [(False, 0, 0.0), (True, 1, 1.5), (False, 2, 3.0)], simple_dtype)
|
check_eq(arr, [(False, 0, 0.0), (True, 1, 1.5), (False, 2, 3.0)], simple_dtype)
|
||||||
check_eq(arr, [(False, 0, 0.0), (True, 1, 1.5), (False, 2, 3.0)], packed_dtype)
|
check_eq(arr, [(False, 0, 0.0), (True, 1, 1.5), (False, 2, 3.0)], packed_dtype)
|
||||||
|
|
||||||
# uncomment lines below to cause a segfault upon exit in Py_Finalize :(
|
if dtype == simple_dtype:
|
||||||
|
print_rec_simple(arr)
|
||||||
# if dtype == simple_dtype:
|
else:
|
||||||
# print_rec_simple(arr)
|
print_rec_packed(arr)
|
||||||
# else:
|
|
||||||
# print_rec_packed(arr)
|
|
||||||
|
|
||||||
nested_dtype = np.dtype([('a', simple_dtype), ('b', packed_dtype)])
|
nested_dtype = np.dtype([('a', simple_dtype), ('b', packed_dtype)])
|
||||||
|
|
||||||
@ -47,4 +45,4 @@ assert arr.dtype == nested_dtype
|
|||||||
check_eq(arr, [((False, 0, 0.0), (True, 1, 1.5)),
|
check_eq(arr, [((False, 0, 0.0), (True, 1, 1.5)),
|
||||||
((True, 1, 1.5), (False, 2, 3.0)),
|
((True, 1, 1.5), (False, 2, 3.0)),
|
||||||
((False, 2, 3.0), (True, 3, 4.5))], nested_dtype)
|
((False, 2, 3.0), (True, 3, 4.5))], nested_dtype)
|
||||||
# print_rec_nested(arr)
|
print_rec_nested(arr)
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
T{?:x:xxxI:y:f:z:}
|
T{?:x:xxxI:y:f:z:}
|
||||||
T{?:x:=I:y:f:z:}
|
T{?:x:=I:y:f:z:}
|
||||||
T{T{?:x:xxxI:y:f:z:}:a:T{?:x:=I:y:f:z:}:b:}
|
T{T{?:x:xxxI:y:f:z:}:a:T{?:x:=I:y:f:z:}:b:}
|
||||||
|
0,0,0
|
||||||
|
1,1,1.5
|
||||||
|
0,2,3
|
||||||
|
0,0,0
|
||||||
|
1,1,1.5
|
||||||
|
0,2,3
|
||||||
|
0,0,0|1,1,1.5
|
||||||
|
1,1,1.5|0,2,3
|
||||||
|
0,2,3|1,3,4.5
|
||||||
|
@ -96,7 +96,7 @@ public:
|
|||||||
|
|
||||||
template <typename Type> array(size_t size, const Type *ptr) {
|
template <typename Type> array(size_t size, const Type *ptr) {
|
||||||
API& api = lookup_api();
|
API& api = lookup_api();
|
||||||
PyObject *descr = detail::npy_format_descriptor<Type>::descr();
|
PyObject *descr = object(detail::npy_format_descriptor<Type>::descr(), true).release().ptr();
|
||||||
Py_intptr_t shape = (Py_intptr_t) size;
|
Py_intptr_t shape = (Py_intptr_t) size;
|
||||||
object tmp = object(api.PyArray_NewFromDescr_(
|
object tmp = object(api.PyArray_NewFromDescr_(
|
||||||
api.PyArray_Type_, descr, 1, &shape, nullptr, (void *) ptr, 0, nullptr), false);
|
api.PyArray_Type_, descr, 1, &shape, nullptr, (void *) ptr, 0, nullptr), false);
|
||||||
@ -147,7 +147,7 @@ public:
|
|||||||
if (ptr == nullptr)
|
if (ptr == nullptr)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
API &api = lookup_api();
|
API &api = lookup_api();
|
||||||
PyObject *descr = detail::npy_format_descriptor<T>::descr();
|
PyObject *descr = object(detail::npy_format_descriptor<T>::descr(), true).release().ptr();
|
||||||
PyObject *result = api.PyArray_FromAny_(ptr, descr, 0, 0, API::NPY_ENSURE_ARRAY_ | ExtraFlags, nullptr);
|
PyObject *result = api.PyArray_FromAny_(ptr, descr, 0, 0, API::NPY_ENSURE_ARRAY_ | ExtraFlags, nullptr);
|
||||||
if (!result)
|
if (!result)
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
|
Loading…
Reference in New Issue
Block a user