summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorHameer Abbasi <einstein.edison@gmail.com>2021-05-31 14:32:48 +0200
committermattip <matti.picus@gmail.com>2021-11-02 11:34:40 +0200
commita4cc97abdc4e347b293886f4847d1ddd5a9bfaa7 (patch)
treedd01d13266381f4466a0456d599aace7fcda3835 /numpy
parente167da747b53baed13a5148750c9c82746ffcb30 (diff)
downloadnumpy-a4cc97abdc4e347b293886f4847d1ddd5a9bfaa7.tar.gz
BUG: Offset not properly stored/computed.
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/src/multiarray/methods.c37
-rw-r--r--numpy/core/src/multiarray/multiarraymodule.c2
2 files changed, 29 insertions, 10 deletions
diff --git a/numpy/core/src/multiarray/methods.c b/numpy/core/src/multiarray/methods.c
index 9a16adecd..d3162e549 100644
--- a/numpy/core/src/multiarray/methods.c
+++ b/numpy/core/src/multiarray/methods.c
@@ -2792,7 +2792,7 @@ array_dlpack_deleter(DLManagedTensor *self)
}
/* This is exactly as mandated by dlpack */
-static void dlpack_capsule_deleter(PyObject *self){
+static void dlpack_capsule_deleter(PyObject *self) {
if (PyCapsule_IsValid(self, "used_dltensor")) {
return;
}
@@ -2827,7 +2827,7 @@ array_get_dl_device(PyArrayObject *self) {
ret.device_id = 0;
PyObject *base = PyArray_BASE(self);
// The outer if is due to the fact that NumPy arrays are on the CPU
- // by default.
+ // by default (if not created from DLPack).
if (PyCapsule_IsValid(base, NPY_DLPACK_INTERNAL_CAPSULE_NAME)) {
DLManagedTensor *managed = PyCapsule_GetPointer(
base, NPY_DLPACK_INTERNAL_CAPSULE_NAME);
@@ -2839,6 +2839,20 @@ array_get_dl_device(PyArrayObject *self) {
return ret;
}
+static char *
+array_get_dl_data(PyArrayObject *self) {
+ PyObject *base = PyArray_BASE(self);
+ if (PyCapsule_IsValid(base, NPY_DLPACK_INTERNAL_CAPSULE_NAME)) {
+ DLManagedTensor *managed = PyCapsule_GetPointer(
+ base, NPY_DLPACK_INTERNAL_CAPSULE_NAME);
+ if (managed == NULL) {
+ return NULL;
+ }
+ return managed->dl_tensor.data;
+ }
+ return PyArray_DATA(self);
+}
+
static PyObject *
array_dlpack(PyArrayObject *self,
PyObject *const *args, Py_ssize_t len_args, PyObject *kwnames)
@@ -2913,18 +2927,23 @@ array_dlpack(PyArrayObject *self,
return NULL;
}
+ DLDevice device = array_get_dl_device(self);
+ if (PyErr_Occurred()) {
+ return NULL;
+ }
+ char *data = array_get_dl_data(self);
+ if (data == NULL) {
+ return NULL;
+ }
+
DLManagedTensor *managed = PyMem_Malloc(sizeof(DLManagedTensor));
if (managed == NULL) {
PyErr_NoMemory();
return NULL;
}
- managed->dl_tensor.data = PyArray_DATA(self);
- managed->dl_tensor.device = array_get_dl_device(self);
- if (PyErr_Occurred()) {
- PyMem_Free(managed);
- return NULL;
- }
+ managed->dl_tensor.data = data;
+ managed->dl_tensor.device = device;
managed->dl_tensor.dtype = managed_dtype;
@@ -2949,7 +2968,7 @@ array_dlpack(PyArrayObject *self,
if (PyArray_SIZE(self) != 1 && !PyArray_IS_C_CONTIGUOUS(self)) {
managed->dl_tensor.strides = managed_strides;
}
- managed->dl_tensor.byte_offset = 0;
+ managed->dl_tensor.byte_offset = (char *)PyArray_DATA(self) - data;
managed->manager_ctx = self;
managed->deleter = array_dlpack_deleter;
diff --git a/numpy/core/src/multiarray/multiarraymodule.c b/numpy/core/src/multiarray/multiarraymodule.c
index b04debe10..60e3875fc 100644
--- a/numpy/core/src/multiarray/multiarraymodule.c
+++ b/numpy/core/src/multiarray/multiarraymodule.c
@@ -4384,7 +4384,7 @@ from_dlpack(PyObject *NPY_UNUSED(self), PyObject *obj) {
Py_XDECREF(ret);
return NULL;
}
-
+
Py_XDECREF(capsule);
return ret;
}