NRT_adapt_ndarray_from_python(PyObject *obj, arystruct_t* arystruct) { PyArrayObject *ndary; int i, ndim; npy_intp *p; void *data; if (!PyArray_Check(obj)) { return -1; } ndary = (PyArrayObject*)obj; ndim = PyArray_NDIM(ndary); data = PyArray_DATA(ndary); arystruct->meminfo = meminfo_new_from_pyobject((void*)data, obj); arystruct->data = data; arystruct->nitems = PyArray_SIZE(ndary); arystruct->itemsize = PyArray_ITEMSIZE(ndary); arystruct->parent = obj; p = arystruct->shape_and_strides; for (i = 0; i < ndim; i++, p++) { *p = PyArray_DIM(ndary, i); } for (i = 0; i < ndim; i++, p++) { *p = PyArray_STRIDE(ndary, i); } NRT_Debug(nrt_debug_print("NRT_adapt_ndarray_from_python %p\n", arystruct->meminfo)); return 0; }
static void NRT_adapt_buffer_from_python(Py_buffer *buf, arystruct_t *arystruct) { int i; npy_intp *p; if (buf->obj) { /* Allocate new MemInfo only if the buffer has a parent */ arystruct->meminfo = meminfo_new_from_pyobject((void*)buf->buf, buf->obj); NRT_MemInfo_acquire(arystruct->meminfo); } arystruct->data = buf->buf; arystruct->itemsize = buf->itemsize; arystruct->parent = buf->obj; arystruct->nitems = 1; p = arystruct->shape_and_strides; for (i = 0; i < buf->ndim; i++, p++) { *p = buf->shape[i]; arystruct->nitems *= buf->shape[i]; } for (i = 0; i < buf->ndim; i++, p++) { *p = buf->strides[i]; } }
/* * Create a new MemInfo with a owner PyObject */ static PyObject * meminfo_new(PyObject *self, PyObject *args) { PyObject *addr_data_obj; void *addr_data; PyObject *ownerobj; NRT_MemInfo *mi; if (!PyArg_ParseTuple(args, "OO", &addr_data_obj, &ownerobj)) { return NULL; } addr_data = PyLong_AsVoidPtr(addr_data_obj); if (PyErr_Occurred()) return NULL; mi = meminfo_new_from_pyobject(addr_data, ownerobj); return PyLong_FromVoidPtr(mi); }