static int dump_data(char **string, Py_ssize_t *n, Py_ssize_t *max_n, char *data, int nd, npy_intp *dimensions, npy_intp *strides, PyArrayObject* self) { PyObject *op = NULL, *sp = NULL; char *ostring; npy_intp i, N, ret = 0; #define CHECK_MEMORY do { \ if (extend(string, *n, max_n) == NULL) { \ ret = -1; \ goto end; \ } \ } while (0) if (nd == 0) { if ((op = PyArray_GETITEM(self, data)) == NULL) { return -1; } sp = PyObject_Repr(op); if (sp == NULL) { ret = -1; goto end; } ostring = PyString_AsString(sp); N = PyString_Size(sp)*sizeof(char); *n += N; CHECK_MEMORY; memmove(*string + (*n - N), ostring, N); } else { CHECK_MEMORY; (*string)[*n] = '['; *n += 1; for (i = 0; i < dimensions[0]; i++) { if (dump_data(string, n, max_n, data + (*strides)*i, nd - 1, dimensions + 1, strides + 1, self) < 0) { return -1; } CHECK_MEMORY; if (i < dimensions[0] - 1) { (*string)[*n] = ','; (*string)[*n+1] = ' '; *n += 2; } } CHECK_MEMORY; (*string)[*n] = ']'; *n += 1; } #undef CHECK_MEMORY end: Py_XDECREF(op); Py_XDECREF(sp); return ret; }
static PyObject * array_index(PyArrayObject *v) { if (!PyArray_ISINTEGER(v) || PyArray_NDIM(v) != 0) { PyErr_SetString(PyExc_TypeError, "only integer scalar arrays can be converted to a scalar index"); return NULL; } return PyArray_GETITEM(v, PyArray_DATA(v)); }
NPY_NO_EXPORT PyObject * array_int(PyArrayObject *v) { PyObject *pv, *pv2; if (PyArray_SIZE(v) != 1) { PyErr_SetString(PyExc_TypeError, "only length-1 arrays can be"\ " converted to Python scalars"); return NULL; } pv = PyArray_GETITEM(v, PyArray_DATA(v)); if (pv == NULL) { return NULL; } if (Py_TYPE(pv)->tp_as_number == 0) { PyErr_SetString(PyExc_TypeError, "cannot convert to an int; "\ "scalar object is not a number"); Py_DECREF(pv); return NULL; } if (Py_TYPE(pv)->tp_as_number->nb_int == 0) { PyErr_SetString(PyExc_TypeError, "don't know how to convert "\ "scalar number to int"); Py_DECREF(pv); return NULL; } /* * If we still got an array which can hold references, stop * because it could point back at 'v'. */ if (PyArray_Check(pv) && PyDataType_REFCHK(PyArray_DESCR((PyArrayObject *)pv))) { PyErr_SetString(PyExc_TypeError, "object array may be self-referencing"); Py_DECREF(pv); return NULL; } pv2 = Py_TYPE(pv)->tp_as_number->nb_int(pv); Py_DECREF(pv); return pv2; }
/* * Convert the array to a scalar if allowed, and apply the builtin function * to it. The where argument is passed onto Py_EnterRecursiveCall when the * array contains python objects. */ NPY_NO_EXPORT PyObject * array_scalar_forward(PyArrayObject *v, PyObject *(*builtin_func)(PyObject *), const char *where) { PyObject *scalar; if (PyArray_SIZE(v) != 1) { PyErr_SetString(PyExc_TypeError, "only size-1 arrays can be"\ " converted to Python scalars"); return NULL; } scalar = PyArray_GETITEM(v, PyArray_DATA(v)); if (scalar == NULL) { return NULL; } /* Need to guard against recursion if our array holds references */ if (PyDataType_REFCHK(PyArray_DESCR(v))) { PyObject *res; if (Npy_EnterRecursiveCall(where) != 0) { Py_DECREF(scalar); return NULL; } res = builtin_func(scalar); Py_DECREF(scalar); Py_LeaveRecursiveCall(); return res; } else { PyObject *res; res = builtin_func(scalar); Py_DECREF(scalar); return res; } }