From f00e3c4b9a8a5243a6bac5d670207448d95adec4 Mon Sep 17 00:00:00 2001 From: WilliamBinquet Date: Mon, 8 Jun 2026 15:49:57 +0200 Subject: [PATCH 1/6] Testing Re-adding PyDate handling --- src/ujson/python/objToJSON.c | 57 ++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/src/ujson/python/objToJSON.c b/src/ujson/python/objToJSON.c index 247e1402..ed60915e 100644 --- a/src/ujson/python/objToJSON.c +++ b/src/ujson/python/objToJSON.c @@ -113,6 +113,48 @@ static void *PyStringToUTF8(JSOBJ _obj, JSONTypeContext *tc, void *outValue, siz return PyBytes_AS_STRING(obj); } +static void *PyDateTimeToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue, size_t *_outLen) +{ + PyObject *obj = (PyObject *) _obj; + PyObject *date, *ord; + int y, m, d, h, mn, s, days; + + y = PyDateTime_GET_YEAR(obj); + m = PyDateTime_GET_MONTH(obj); + d = PyDateTime_GET_DAY(obj); + h = PyDateTime_DATE_GET_HOUR(obj); + mn = PyDateTime_DATE_GET_MINUTE(obj); + s = PyDateTime_DATE_GET_SECOND(obj); + + date = PyDate_FromDate(y, m, 1); + ord = PyObject_CallMethod(date, "toordinal", NULL); + days = PyInt_AS_LONG(ord) - EPOCH_ORD + d - 1; + Py_DECREF(date); + Py_DECREF(ord); + *( (JSINT64 *) outValue) = (((JSINT64) ((days * 24 + h) * 60 + mn)) * 60 + s) * 1000; + return NULL; +} + +static void *PyDateToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue, size_t *_outLen) +{ + PyObject *obj = (PyObject *) _obj; + PyObject *date, *ord; + int y, m, d, days; + + y = PyDateTime_GET_YEAR(obj); + m = PyDateTime_GET_MONTH(obj); + d = PyDateTime_GET_DAY(obj); + + date = PyDate_FromDate(y, m, 1); + ord = PyObject_CallMethod(date, "toordinal", NULL); + days = PyInt_AS_LONG(ord) - EPOCH_ORD + d - 1; + Py_DECREF(date); + Py_DECREF(ord); + *( (JSINT64 *) outValue) = ((JSINT64) days * 86400000); + + return NULL; +} + static char *PyUnicodeToUTF8Raw(JSOBJ _obj, size_t *_outLen, PyObject **pBytesObj) { /* @@ -458,6 +500,21 @@ static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObject pc->PyTypeToJSON = PyFloatToDOUBLE; tc->type = JT_DOUBLE; return; } + else + if (PyDateTime_Check(obj)) + { + PRINTMARK(); + pc->PyTypeToJSON = PyDateTimeToINT64; tc->type = JT_LONG; + return; + } + else + if (PyDate_Check(obj)) + { + PRINTMARK(); + pc->PyTypeToJSON = PyDateToINT64; tc->type = JT_LONG; + return; + } + ISITERABLE: if (PyDict_Check(obj)) From 30525fbf08b8e9a5760d58b700b02283e95dc1a3 Mon Sep 17 00:00:00 2001 From: WilliamBinquet Date: Mon, 8 Jun 2026 15:59:09 +0200 Subject: [PATCH 2/6] Include datetime.h --- src/ujson/python/objToJSON.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ujson/python/objToJSON.c b/src/ujson/python/objToJSON.c index ed60915e..ae9b6617 100644 --- a/src/ujson/python/objToJSON.c +++ b/src/ujson/python/objToJSON.c @@ -39,6 +39,7 @@ Numeric decoder derived from from TCL library #include #include #include +#include #define EPOCH_ORD 719163 From 132333fee8e4bbb1c4e50b9a973a4a2ac9d0eeae Mon Sep 17 00:00:00 2001 From: WilliamBinquet Date: Mon, 8 Jun 2026 16:25:46 +0200 Subject: [PATCH 3/6] Test removal of PyInt_AS_LONG --- src/ujson/python/objToJSON.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ujson/python/objToJSON.c b/src/ujson/python/objToJSON.c index ae9b6617..a4d1b104 100644 --- a/src/ujson/python/objToJSON.c +++ b/src/ujson/python/objToJSON.c @@ -129,7 +129,7 @@ static void *PyDateTimeToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue, date = PyDate_FromDate(y, m, 1); ord = PyObject_CallMethod(date, "toordinal", NULL); - days = PyInt_AS_LONG(ord) - EPOCH_ORD + d - 1; + days = ord - EPOCH_ORD + d - 1; Py_DECREF(date); Py_DECREF(ord); *( (JSINT64 *) outValue) = (((JSINT64) ((days * 24 + h) * 60 + mn)) * 60 + s) * 1000; @@ -148,7 +148,7 @@ static void *PyDateToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue, size date = PyDate_FromDate(y, m, 1); ord = PyObject_CallMethod(date, "toordinal", NULL); - days = PyInt_AS_LONG(ord) - EPOCH_ORD + d - 1; + days = ord - EPOCH_ORD + d - 1; Py_DECREF(date); Py_DECREF(ord); *( (JSINT64 *) outValue) = ((JSINT64) days * 86400000); From af605250c9410a50649dd4877ae10943e13f3e99 Mon Sep 17 00:00:00 2001 From: WilliamBinquet Date: Mon, 8 Jun 2026 16:31:53 +0200 Subject: [PATCH 4/6] Changed PyInt_AS_LONG as PyLong_AsLong --- src/ujson/python/objToJSON.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ujson/python/objToJSON.c b/src/ujson/python/objToJSON.c index a4d1b104..b777c00d 100644 --- a/src/ujson/python/objToJSON.c +++ b/src/ujson/python/objToJSON.c @@ -38,8 +38,8 @@ Numeric decoder derived from from TCL library #include #include -#include #include +#include #define EPOCH_ORD 719163 @@ -129,7 +129,7 @@ static void *PyDateTimeToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue, date = PyDate_FromDate(y, m, 1); ord = PyObject_CallMethod(date, "toordinal", NULL); - days = ord - EPOCH_ORD + d - 1; + days = PyLong_AsLong(ord) - EPOCH_ORD + d - 1; Py_DECREF(date); Py_DECREF(ord); *( (JSINT64 *) outValue) = (((JSINT64) ((days * 24 + h) * 60 + mn)) * 60 + s) * 1000; @@ -148,7 +148,7 @@ static void *PyDateToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue, size date = PyDate_FromDate(y, m, 1); ord = PyObject_CallMethod(date, "toordinal", NULL); - days = ord - EPOCH_ORD + d - 1; + days = PyLong_AsLong(ord) - EPOCH_ORD + d - 1; Py_DECREF(date); Py_DECREF(ord); *( (JSINT64 *) outValue) = ((JSINT64) days * 86400000); From 4f781868f2ee869658d9f2afca7a0e7c3846c057 Mon Sep 17 00:00:00 2001 From: WilliamBinquet Date: Mon, 8 Jun 2026 17:03:56 +0200 Subject: [PATCH 5/6] Test PyInt_AsLong --- src/ujson/python/objToJSON.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ujson/python/objToJSON.c b/src/ujson/python/objToJSON.c index b777c00d..ef4bd40e 100644 --- a/src/ujson/python/objToJSON.c +++ b/src/ujson/python/objToJSON.c @@ -129,7 +129,7 @@ static void *PyDateTimeToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue, date = PyDate_FromDate(y, m, 1); ord = PyObject_CallMethod(date, "toordinal", NULL); - days = PyLong_AsLong(ord) - EPOCH_ORD + d - 1; + days = PyInt_AsLong(ord) - EPOCH_ORD + d - 1; Py_DECREF(date); Py_DECREF(ord); *( (JSINT64 *) outValue) = (((JSINT64) ((days * 24 + h) * 60 + mn)) * 60 + s) * 1000; @@ -148,7 +148,7 @@ static void *PyDateToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue, size date = PyDate_FromDate(y, m, 1); ord = PyObject_CallMethod(date, "toordinal", NULL); - days = PyLong_AsLong(ord) - EPOCH_ORD + d - 1; + days = PyInt_AsLong(ord) - EPOCH_ORD + d - 1; Py_DECREF(date); Py_DECREF(ord); *( (JSINT64 *) outValue) = ((JSINT64) days * 86400000); From 359db4ddbfc1e0dbf35f8df405ce340713e470bf Mon Sep 17 00:00:00 2001 From: WilliamBinquet Date: Mon, 8 Jun 2026 17:19:06 +0200 Subject: [PATCH 6/6] Changed back to PyLong_AsLong --- src/ujson/python/objToJSON.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ujson/python/objToJSON.c b/src/ujson/python/objToJSON.c index ef4bd40e..b777c00d 100644 --- a/src/ujson/python/objToJSON.c +++ b/src/ujson/python/objToJSON.c @@ -129,7 +129,7 @@ static void *PyDateTimeToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue, date = PyDate_FromDate(y, m, 1); ord = PyObject_CallMethod(date, "toordinal", NULL); - days = PyInt_AsLong(ord) - EPOCH_ORD + d - 1; + days = PyLong_AsLong(ord) - EPOCH_ORD + d - 1; Py_DECREF(date); Py_DECREF(ord); *( (JSINT64 *) outValue) = (((JSINT64) ((days * 24 + h) * 60 + mn)) * 60 + s) * 1000; @@ -148,7 +148,7 @@ static void *PyDateToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue, size date = PyDate_FromDate(y, m, 1); ord = PyObject_CallMethod(date, "toordinal", NULL); - days = PyInt_AsLong(ord) - EPOCH_ORD + d - 1; + days = PyLong_AsLong(ord) - EPOCH_ORD + d - 1; Py_DECREF(date); Py_DECREF(ord); *( (JSINT64 *) outValue) = ((JSINT64) days * 86400000);