@@ -39,6 +39,16 @@ SampleDTypeObject *new_sampledtype_instance(PyObject *sample_scalar) {
39
39
return NULL ;
40
40
}
41
41
42
+ attr = PyObject_GetAttrString (sample_scalar , "hasobject" );
43
+ if (attr == NULL ) {
44
+ return NULL ;
45
+ }
46
+ int hasobject = PyObject_IsTrue (attr );
47
+ Py_DECREF (attr );
48
+ if (hasobject == -1 && PyErr_Occurred ()) {
49
+ return NULL ;
50
+ }
51
+
42
52
// Allocate final DType bject
43
53
SampleDTypeObject * new = (SampleDTypeObject * )PyArrayDescr_Type .tp_new (
44
54
(PyTypeObject * )& SampleDType , NULL , NULL );
@@ -48,6 +58,10 @@ SampleDTypeObject *new_sampledtype_instance(PyObject *sample_scalar) {
48
58
49
59
Py_INCREF (sample_scalar );
50
60
new -> sample_scalar = sample_scalar ;
61
+ if (hasobject ) {
62
+ // TODO: Other flags from NPY_OBJECT_DTYPE_FLAGS
63
+ new -> base .flags |= NPY_ITEM_HASOBJECT | NPY_NEEDS_INIT ;
64
+ }
51
65
new -> base .elsize = elsize ;
52
66
new -> base .alignment = alignment ;
53
67
@@ -105,7 +119,7 @@ sampledtype_ensure_canonical(SampleDTypeObject *self) {
105
119
106
120
static int sampledtype_setitem (SampleDTypeObject * descr , PyObject * obj ,
107
121
char * dataptr ) {
108
- printf ("%s, target elsise %lld , type_num %d\n" , __func__ , descr -> base .elsize ,
122
+ printf ("%s, target elsise %zd , type_num %d\n" , __func__ , descr -> base .elsize ,
109
123
descr -> base .type_num );
110
124
111
125
if (Py_TYPE (obj ) != SampleScalar_Type ) {
@@ -125,13 +139,51 @@ static int sampledtype_setitem(SampleDTypeObject *descr, PyObject *obj,
125
139
}
126
140
127
141
static PyObject * sampledtype_getitem (SampleDTypeObject * descr , char * dataptr ) {
128
- printf ("%s, source elsize %lld , type_num %d\n" , __func__ , descr -> base .elsize ,
142
+ printf ("%s, source elsize %zd , type_num %d\n" , __func__ , descr -> base .elsize ,
129
143
descr -> base .type_num );
130
144
131
145
return PyObject_CallMethod (descr -> sample_scalar , "getitem" , "n" ,
132
146
(Py_ssize_t )dataptr );
133
147
}
134
148
149
+ static int sampledtype_clear_loop (void * NPY_UNUSED (traverse_context ),
150
+ const PyArray_Descr * _descr , char * data ,
151
+ npy_intp size , npy_intp stride ,
152
+ NpyAuxData * NPY_UNUSED (auxdata )) {
153
+ const SampleDTypeObject * descr = (const SampleDTypeObject * )_descr ;
154
+ printf ("%s, source elsize %zd, type_num %d, data %p, size %zd, stride %zd\n" ,
155
+ __func__ , descr -> base .elsize , descr -> base .type_num , data , size ,
156
+ stride );
157
+
158
+ PyObject * res = PyObject_CallMethod (descr -> sample_scalar , "clear_loop" , "nnn" ,
159
+ (Py_ssize_t )data , size , stride );
160
+ if (res == NULL ) {
161
+ return -1 ;
162
+ }
163
+ int ret = PyLong_AsLong (res );
164
+ Py_DECREF (res );
165
+ if (ret == -1 && PyErr_Occurred ()) {
166
+ return -1 ;
167
+ }
168
+
169
+ return ret ;
170
+ }
171
+
172
+ static int sampledtype_get_clear_loop (void * NPY_UNUSED (traverse_context ),
173
+ const SampleDTypeObject * descr ,
174
+ int aligned , npy_intp fixed_stride ,
175
+ PyArrayMethod_TraverseLoop * * out_loop ,
176
+ NpyAuxData * * NPY_UNUSED (out_auxdata ),
177
+ NPY_ARRAYMETHOD_FLAGS * flags ) {
178
+ printf ("%s, source elsize %zd, type_num %d, aligned %d, fixed_stride %zd\n" ,
179
+ __func__ , descr -> base .elsize , descr -> base .type_num , aligned ,
180
+ fixed_stride );
181
+
182
+ * out_loop = & sampledtype_clear_loop ;
183
+ * flags = NPY_METH_NO_FLOATINGPOINT_ERRORS ;
184
+ return 0 ;
185
+ }
186
+
135
187
static PyType_Slot SampleDType_Slots [] = {
136
188
{NPY_DT_discover_descr_from_pyobject ,
137
189
& sampledtype_discover_descriptor_from_pyobject },
@@ -140,6 +192,7 @@ static PyType_Slot SampleDType_Slots[] = {
140
192
{NPY_DT_ensure_canonical , & sampledtype_ensure_canonical },
141
193
{NPY_DT_setitem , & sampledtype_setitem },
142
194
{NPY_DT_getitem , & sampledtype_getitem },
195
+ {NPY_DT_get_clear_loop , & sampledtype_get_clear_loop },
143
196
{0 , NULL }};
144
197
145
198
static PyObject * sampledtype_new (PyTypeObject * NPY_UNUSED (cls ), PyObject * args ,
0 commit comments