2
* This module corresponds to the `Special functions for PyArray_OBJECT`
3
* section in the numpy reference for C-API.
6
#define PY_SSIZE_T_CLEAN
8
#include "structmember.h"
10
#define _MULTIARRAYMODULE
12
#include "numpy/arrayobject.h"
13
#include "numpy/arrayscalars.h"
15
#include "npy_config.h"
18
_fillobject(char *optr, PyObject *obj, PyArray_Descr *dtype);
20
/* Incref all objects found at this record */
24
PyArray_Item_INCREF(char *data, PyArray_Descr *descr)
28
if (!PyDataType_REFCHK(descr)) {
31
if (descr->type_num == PyArray_OBJECT) {
32
NPY_COPY_PYOBJECT_PTR(&temp, data);
35
else if (PyDescr_HASFIELDS(descr)) {
36
PyObject *key, *value, *title = NULL;
41
while (PyDict_Next(descr->fields, &pos, &key, &value)) {
42
if NPY_TITLE_KEY(key, value) {
45
if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset,
49
PyArray_Item_INCREF(data + offset, new);
55
/* XDECREF all objects found at this record */
59
PyArray_Item_XDECREF(char *data, PyArray_Descr *descr)
63
if (!PyDataType_REFCHK(descr)) {
67
if (descr->type_num == PyArray_OBJECT) {
68
NPY_COPY_PYOBJECT_PTR(&temp, data);
71
else if PyDescr_HASFIELDS(descr) {
72
PyObject *key, *value, *title = NULL;
77
while (PyDict_Next(descr->fields, &pos, &key, &value)) {
78
if NPY_TITLE_KEY(key, value) {
81
if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset,
85
PyArray_Item_XDECREF(data + offset, new);
91
/* Used for arrays of python objects to increment the reference count of */
92
/* every python object in the array. */
94
For object arrays, increment all internal references.
97
PyArray_INCREF(PyArrayObject *mp)
102
PyArrayIterObject *it;
104
if (!PyDataType_REFCHK(mp->descr)) {
107
if (mp->descr->type_num != PyArray_OBJECT) {
108
it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);
112
while(it->index < it->size) {
113
PyArray_Item_INCREF(it->dataptr, mp->descr);
114
PyArray_ITER_NEXT(it);
120
if (PyArray_ISONESEGMENT(mp)) {
121
data = (PyObject **)mp->data;
122
n = PyArray_SIZE(mp);
123
if (PyArray_ISALIGNED(mp)) {
124
for (i = 0; i < n; i++, data++) {
129
for( i = 0; i < n; i++, data++) {
130
NPY_COPY_PYOBJECT_PTR(&temp, data);
135
else { /* handles misaligned data too */
136
it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);
140
while(it->index < it->size) {
141
NPY_COPY_PYOBJECT_PTR(&temp, it->dataptr);
143
PyArray_ITER_NEXT(it);
151
Decrement all internal references for object arrays.
152
(or arrays with object fields)
155
PyArray_XDECREF(PyArrayObject *mp)
160
PyArrayIterObject *it;
162
if (!PyDataType_REFCHK(mp->descr)) {
165
if (mp->descr->type_num != PyArray_OBJECT) {
166
it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);
170
while(it->index < it->size) {
171
PyArray_Item_XDECREF(it->dataptr, mp->descr);
172
PyArray_ITER_NEXT(it);
178
if (PyArray_ISONESEGMENT(mp)) {
179
data = (PyObject **)mp->data;
180
n = PyArray_SIZE(mp);
181
if (PyArray_ISALIGNED(mp)) {
182
for (i = 0; i < n; i++, data++) Py_XDECREF(*data);
185
for (i = 0; i < n; i++, data++) {
186
NPY_COPY_PYOBJECT_PTR(&temp, data);
191
else { /* handles misaligned data too */
192
it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);
196
while(it->index < it->size) {
197
NPY_COPY_PYOBJECT_PTR(&temp, it->dataptr);
199
PyArray_ITER_NEXT(it);
210
PyArray_FillObjectArray(PyArrayObject *arr, PyObject *obj)
213
n = PyArray_SIZE(arr);
214
if (arr->descr->type_num == PyArray_OBJECT) {
216
optr = (PyObject **)(arr->data);
217
n = PyArray_SIZE(arr);
219
for (i = 0; i < n; i++) {
224
for (i = 0; i < n; i++) {
233
for (i = 0; i < n; i++) {
234
_fillobject(optr, obj, arr->descr);
235
optr += arr->descr->elsize;
241
_fillobject(char *optr, PyObject *obj, PyArray_Descr *dtype)
243
if (!PyDataType_FLAGCHK(dtype, NPY_ITEM_REFCOUNT)) {
244
if ((obj == Py_None) || (PyInt_Check(obj) && PyInt_AsLong(obj)==0)) {
250
arr = PyArray_NewFromDescr(&PyArray_Type, dtype,
254
dtype->f->setitem(obj, optr, arr);
259
else if (PyDescr_HASFIELDS(dtype)) {
260
PyObject *key, *value, *title = NULL;
265
while (PyDict_Next(dtype->fields, &pos, &key, &value)) {
266
if NPY_TITLE_KEY(key, value) {
269
if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset, &title)) {
272
_fillobject(optr + offset, obj, new);
277
NPY_COPY_PYOBJECT_PTR(optr, &obj);