@@ -11,15 +11,13 @@ PyObject *NA_OBJ = NULL;
11
11
* Internal helper to create new instances
12
12
*/
13
13
StringDTypeObject *
14
- new_stringdtype_instance (PyObject * na_object )
14
+ new_stringdtype_instance (void )
15
15
{
16
16
StringDTypeObject * new = (StringDTypeObject * )PyArrayDescr_Type .tp_new (
17
17
(PyTypeObject * )& StringDType , NULL , NULL );
18
18
if (new == NULL ) {
19
19
return NULL ;
20
20
}
21
- Py_INCREF (na_object );
22
- new -> na_object = na_object ;
23
21
new -> base .elsize = sizeof (ss );
24
22
new -> base .alignment = _Alignof(ss );
25
23
new -> base .flags |= NPY_NEEDS_INIT ;
@@ -74,7 +72,7 @@ string_discover_descriptor_from_pyobject(PyArray_DTypeMeta *NPY_UNUSED(cls),
74
72
return NULL ;
75
73
}
76
74
77
- PyArray_Descr * ret = (PyArray_Descr * )new_stringdtype_instance (NA_OBJ );
75
+ PyArray_Descr * ret = (PyArray_Descr * )new_stringdtype_instance ();
78
76
if (ret == NULL ) {
79
77
return NULL ;
80
78
}
@@ -132,7 +130,9 @@ get_value(PyObject *scalar, PyObject *na_object)
132
130
static int
133
131
stringdtype_setitem (StringDTypeObject * descr , PyObject * obj , char * * dataptr )
134
132
{
135
- PyObject * val_obj = get_value (obj , descr -> na_object );
133
+ PyObject * na_object =
134
+ PyDict_GetItemString (Py_TYPE (descr )-> tp_dict , "na_object" );
135
+ PyObject * val_obj = get_value (obj , na_object );
136
136
137
137
if (val_obj == NULL ) {
138
138
return -1 ;
@@ -146,7 +146,7 @@ stringdtype_setitem(StringDTypeObject *descr, PyObject *obj, char **dataptr)
146
146
147
147
// setting NA *must* check pointer equality since NA types might not
148
148
// allow equality
149
- if (val_obj == descr -> na_object ) {
149
+ if (val_obj == na_object ) {
150
150
// do nothing, ssfree already NULLed the struct ssdata points to
151
151
// so it already contains a NA value
152
152
}
@@ -186,8 +186,10 @@ stringdtype_getitem(StringDTypeObject *descr, char **dataptr)
186
186
ss * sdata = (ss * )dataptr ;
187
187
188
188
if (ss_isnull (sdata )) {
189
- Py_INCREF (descr -> na_object );
190
- val_obj = descr -> na_object ;
189
+ PyObject * na_object =
190
+ PyDict_GetItemString (Py_TYPE (descr )-> tp_dict , "na_object" );
191
+ Py_INCREF (na_object );
192
+ val_obj = na_object ;
191
193
}
192
194
else {
193
195
char * data = sdata -> buf ;
@@ -354,43 +356,35 @@ static PyType_Slot StringDType_Slots[] = {
354
356
static PyObject *
355
357
stringdtype_new (PyTypeObject * NPY_UNUSED (cls ), PyObject * args , PyObject * kwds )
356
358
{
357
- static char * kwargs_strs [] = {"size" , "na_object" , NULL };
359
+ static char * kwargs_strs [] = {"size" , NULL };
358
360
359
361
long size = 0 ;
360
- PyObject * na_object = NULL ;
361
362
362
- if (!PyArg_ParseTupleAndKeywords (args , kwds , "|lO :StringDType" ,
363
- kwargs_strs , & size , & na_object )) {
363
+ if (!PyArg_ParseTupleAndKeywords (args , kwds , "|l :StringDType" , kwargs_strs ,
364
+ & size )) {
364
365
return NULL ;
365
366
}
366
367
367
- if (na_object == NULL ) {
368
- na_object = NA_OBJ ;
369
- }
370
-
371
- Py_INCREF (na_object );
372
-
373
- PyObject * ret = (PyObject * )new_stringdtype_instance (na_object );
374
-
375
- Py_DECREF (na_object );
368
+ PyObject * ret = (PyObject * )new_stringdtype_instance ();
376
369
377
370
return ret ;
378
371
}
379
372
380
373
static void
381
374
stringdtype_dealloc (StringDTypeObject * self )
382
375
{
383
- Py_DECREF (self -> na_object );
384
376
PyArrayDescr_Type .tp_dealloc ((PyObject * )self );
385
377
}
386
378
387
379
static PyObject *
388
380
stringdtype_repr (StringDTypeObject * self )
389
381
{
390
382
PyObject * ret = NULL ;
391
- if (self -> na_object != NA_OBJ ) {
392
- ret = PyUnicode_FromFormat ("StringDType(na_object=%R)" ,
393
- self -> na_object );
383
+ PyObject * na_object =
384
+ PyDict_GetItemString (Py_TYPE (self )-> tp_dict , "na_object" );
385
+
386
+ if (na_object != NA_OBJ ) {
387
+ ret = PyUnicode_FromString ("PandasStringDType()" );
394
388
}
395
389
else {
396
390
ret = PyUnicode_FromString ("StringDType()" );
@@ -471,7 +465,7 @@ static PyMethodDef StringDType_methods[] = {
471
465
METH_O ,
472
466
"Unpickle an StringDType object" ,
473
467
},
474
- {NULL },
468
+ {NULL , NULL , 0 , NULL },
475
469
};
476
470
477
471
/*
@@ -509,6 +503,9 @@ init_string_dtype(void)
509
503
/* Loaded dynamically, so may need to be set here: */
510
504
((PyObject * )& StringDType )-> ob_type = & PyArrayDTypeMeta_Type ;
511
505
((PyTypeObject * )& StringDType )-> tp_base = & PyArrayDescr_Type ;
506
+ ((PyTypeObject * )& StringDType )-> tp_dict = PyDict_New ();
507
+ PyDict_SetItemString (((PyTypeObject * )& StringDType )-> tp_dict , "na_object" ,
508
+ NA_OBJ );
512
509
if (PyType_Ready ((PyTypeObject * )& StringDType ) < 0 ) {
513
510
return -1 ;
514
511
}
0 commit comments