@@ -385,42 +385,8 @@ static PyObject *get_item(PyObject *obj, Py_ssize_t i) {
385
385
return ret ;
386
386
}
387
387
388
- static void * CDouble (JSOBJ obj , JSONTypeContext * tc , void * outValue ,
389
- size_t * _outLen ) {
390
- PRINTMARK ();
391
- * ((double * )outValue ) = GET_TC (tc )-> doubleValue ;
392
- return NULL ;
393
- }
394
-
395
- static void * CLong (JSOBJ obj , JSONTypeContext * tc , void * outValue ,
396
- size_t * _outLen ) {
397
- PRINTMARK ();
398
- * ((JSINT64 * )outValue ) = GET_TC (tc )-> longValue ;
399
- return NULL ;
400
- }
401
-
402
- static void * PyLongToINT64 (JSOBJ _obj , JSONTypeContext * tc , void * outValue ,
403
- size_t * _outLen ) {
404
- * ((JSINT64 * )outValue ) = GET_TC (tc )-> longValue ;
405
- return NULL ;
406
- }
407
-
408
- static void * NpyFloatToDOUBLE (JSOBJ _obj , JSONTypeContext * tc , void * outValue ,
409
- size_t * _outLen ) {
410
- PyObject * obj = (PyObject * )_obj ;
411
- PyArray_CastScalarToCtype (obj , outValue , PyArray_DescrFromType (NPY_DOUBLE ));
412
- return NULL ;
413
- }
414
-
415
- static void * PyFloatToDOUBLE (JSOBJ _obj , JSONTypeContext * tc , void * outValue ,
416
- size_t * _outLen ) {
417
- PyObject * obj = (PyObject * )_obj ;
418
- * ((double * )outValue ) = PyFloat_AsDouble (obj );
419
- return NULL ;
420
- }
421
-
422
388
static void * PyBytesToUTF8 (JSOBJ _obj , JSONTypeContext * tc , void * outValue ,
423
- size_t * _outLen ) {
389
+ size_t * _outLen ) {
424
390
PyObject * obj = (PyObject * )_obj ;
425
391
* _outLen = PyBytes_GET_SIZE (obj );
426
392
return PyBytes_AS_STRING (obj );
@@ -571,7 +537,6 @@ static int NpyTypeToJSONType(PyObject *obj, JSONTypeContext *tc, int npyType,
571
537
return JT_NULL ;
572
538
}
573
539
GET_TC (tc )-> doubleValue = (double )doubleVal ;
574
- GET_TC (tc )-> PyTypeToJSON = CDouble ;
575
540
return JT_DOUBLE ;
576
541
}
577
542
@@ -588,10 +553,32 @@ static int NpyTypeToJSONType(PyObject *obj, JSONTypeContext *tc, int npyType,
588
553
PRINTMARK ();
589
554
return JT_NULL ;
590
555
}
591
- GET_TC (tc )-> longValue = (JSINT64 )longVal ;
592
- GET_TC (tc )-> PyTypeToJSON = NpyDatetime64ToJSON ;
593
- return ((PyObjectEncoder * )tc -> encoder )-> datetimeIso ? JT_UTF8
594
- : JT_LONG ;
556
+
557
+ if (((PyObjectEncoder * )tc -> encoder )-> datetimeIso ) {
558
+ GET_TC (tc )-> longValue = (JSINT64 )longVal ;
559
+ GET_TC (tc )-> PyTypeToJSON = NpyDatetime64ToJSON ;
560
+ return JT_UTF8 ;
561
+ } else {
562
+
563
+ // TODO: consolidate uses of this switch
564
+ switch (((PyObjectEncoder * )tc -> encoder )-> datetimeUnit ) {
565
+ case NPY_FR_ns :
566
+ break ;
567
+ case NPY_FR_us :
568
+ longVal /= 1000LL ;
569
+ break ;
570
+ case NPY_FR_ms :
571
+ longVal /= 1000000LL ;
572
+ break ;
573
+ case NPY_FR_s :
574
+ longVal /= 1000000000LL ;
575
+ break ;
576
+ default :
577
+ break ; // TODO: should raise error
578
+ }
579
+ GET_TC (tc )-> longValue = longVal ;
580
+ return JT_LONG ;
581
+ }
595
582
}
596
583
597
584
if (PyTypeNum_ISINTEGER (npyType )) {
@@ -604,7 +591,6 @@ static int NpyTypeToJSONType(PyObject *obj, JSONTypeContext *tc, int npyType,
604
591
}
605
592
castfunc (value , & longVal , 1 , NULL , NULL );
606
593
GET_TC (tc )-> longValue = (JSINT64 )longVal ;
607
- GET_TC (tc )-> PyTypeToJSON = CLong ;
608
594
return JT_LONG ;
609
595
}
610
596
@@ -1829,7 +1815,6 @@ void Object_beginTypeContext(JSOBJ _obj, JSONTypeContext *tc) {
1829
1815
1830
1816
if (PyLong_Check (obj )) {
1831
1817
PRINTMARK ();
1832
- pc -> PyTypeToJSON = PyLongToINT64 ;
1833
1818
tc -> type = JT_LONG ;
1834
1819
GET_TC (tc )-> longValue = PyLong_AsLongLong (obj );
1835
1820
@@ -1847,7 +1832,7 @@ void Object_beginTypeContext(JSOBJ _obj, JSONTypeContext *tc) {
1847
1832
if (npy_isnan (val ) || npy_isinf (val )) {
1848
1833
tc -> type = JT_NULL ;
1849
1834
} else {
1850
- pc -> PyTypeToJSON = PyFloatToDOUBLE ;
1835
+ GET_TC ( tc ) -> doubleValue = val ;
1851
1836
tc -> type = JT_DOUBLE ;
1852
1837
}
1853
1838
return ;
@@ -1863,7 +1848,7 @@ void Object_beginTypeContext(JSOBJ _obj, JSONTypeContext *tc) {
1863
1848
return ;
1864
1849
} else if (PyObject_TypeCheck (obj , type_decimal )) {
1865
1850
PRINTMARK ();
1866
- pc -> PyTypeToJSON = PyFloatToDOUBLE ;
1851
+ GET_TC ( tc ) -> doubleValue = PyFloat_AsDouble ( obj ) ;
1867
1852
tc -> type = JT_DOUBLE ;
1868
1853
return ;
1869
1854
} else if (PyDateTime_Check (obj ) || PyDate_Check (obj )) {
@@ -1874,12 +1859,15 @@ void Object_beginTypeContext(JSOBJ _obj, JSONTypeContext *tc) {
1874
1859
}
1875
1860
1876
1861
PRINTMARK ();
1877
- pc -> PyTypeToJSON = PyDateTimeToJSON ;
1878
1862
if (enc -> datetimeIso ) {
1879
1863
PRINTMARK ();
1864
+ pc -> PyTypeToJSON = PyDateTimeToJSON ;
1880
1865
tc -> type = JT_UTF8 ;
1881
1866
} else {
1882
1867
PRINTMARK ();
1868
+ // TODO: last argument here is unused; should decouple string
1869
+ // from long datetimelike conversion routines
1870
+ PyDateTimeToJSON (obj , tc , & (GET_TC (tc )-> longValue ), 0 );
1883
1871
tc -> type = JT_LONG ;
1884
1872
}
1885
1873
return ;
@@ -1940,12 +1928,10 @@ void Object_beginTypeContext(JSOBJ _obj, JSONTypeContext *tc) {
1940
1928
GET_TC (tc )-> longValue = value ;
1941
1929
1942
1930
PRINTMARK ();
1943
- pc -> PyTypeToJSON = PyLongToINT64 ;
1944
1931
tc -> type = JT_LONG ;
1945
1932
return ;
1946
1933
} else if (PyArray_IsScalar (obj , Integer )) {
1947
1934
PRINTMARK ();
1948
- pc -> PyTypeToJSON = PyLongToINT64 ;
1949
1935
tc -> type = JT_LONG ;
1950
1936
PyArray_CastScalarToCtype (obj , & (GET_TC (tc )-> longValue ),
1951
1937
PyArray_DescrFromType (NPY_INT64 ));
@@ -1966,7 +1952,8 @@ void Object_beginTypeContext(JSOBJ _obj, JSONTypeContext *tc) {
1966
1952
return ;
1967
1953
} else if (PyArray_IsScalar (obj , Float ) || PyArray_IsScalar (obj , Double )) {
1968
1954
PRINTMARK ();
1969
- pc -> PyTypeToJSON = NpyFloatToDOUBLE ;
1955
+ PyArray_CastScalarToCtype (obj , & (GET_TC (tc )-> doubleValue ),
1956
+ PyArray_DescrFromType (NPY_DOUBLE ));
1970
1957
tc -> type = JT_DOUBLE ;
1971
1958
return ;
1972
1959
} else if (PyArray_Check (obj ) && PyArray_CheckScalar (obj )) {
@@ -2315,21 +2302,11 @@ const char *Object_getStringValue(JSOBJ obj, JSONTypeContext *tc,
2315
2302
}
2316
2303
2317
2304
JSINT64 Object_getLongValue (JSOBJ obj , JSONTypeContext * tc ) {
2318
- JSINT64 ret ;
2319
- GET_TC (tc )-> PyTypeToJSON (obj , tc , & ret , NULL );
2320
- return ret ;
2321
- }
2322
-
2323
- JSINT32 Object_getIntValue (JSOBJ obj , JSONTypeContext * tc ) {
2324
- JSINT32 ret ;
2325
- GET_TC (tc )-> PyTypeToJSON (obj , tc , & ret , NULL );
2326
- return ret ;
2305
+ return GET_TC (tc )-> longValue ;
2327
2306
}
2328
2307
2329
2308
double Object_getDoubleValue (JSOBJ obj , JSONTypeContext * tc ) {
2330
- double ret ;
2331
- GET_TC (tc )-> PyTypeToJSON (obj , tc , & ret , NULL );
2332
- return ret ;
2309
+ return GET_TC (tc )-> doubleValue ;
2333
2310
}
2334
2311
2335
2312
static void Object_releaseObject (JSOBJ _obj ) { Py_DECREF ((PyObject * )_obj ); }
@@ -2384,7 +2361,7 @@ PyObject *objToJSON(PyObject *self, PyObject *args, PyObject *kwargs) {
2384
2361
Object_endTypeContext ,
2385
2362
Object_getStringValue ,
2386
2363
Object_getLongValue ,
2387
- Object_getIntValue ,
2364
+ NULL , // getIntValue is unused
2388
2365
Object_getDoubleValue ,
2389
2366
Object_iterBegin ,
2390
2367
Object_iterNext ,
0 commit comments