Skip to content

Reduce Loosely Typed Functions in objToJSON #29954

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Dec 7, 2019

Conversation

WillAyd
Copy link
Member

@WillAyd WillAyd commented Dec 2, 2019

Part of my perpetual goal to simplify this. Right now we override the built-in capabilities of the JSON encoder and use multiple layers of loosely typed functions. I think this is pretty confusing, so I am trying to reduce the callbacks and set native values directly during iteration

This isn't a full solve - rather just numeric values. I plan on tackling string representations in a follow up; just stopping here because the code movement gets large fast.

In addition to less code, note that this also reduces the amount of compiler warnings from 68 down to 60 when compiling with -Wextra

master:

 pandas/_libs/src/ujson/python/objToJSON.c:388:28: warning: unused parameter 'obj' [-Wunused-parameter]
static void *CDouble(JSOBJ obj, JSONTypeContext *tc, void *outValue,
                           ^
pandas/_libs/src/ujson/python/objToJSON.c:389:30: warning: unused parameter '_outLen' [-Wunused-parameter]
                     size_t *_outLen) {
                             ^
pandas/_libs/src/ujson/python/objToJSON.c:395:26: warning: unused parameter 'obj' [-Wunused-parameter]
static void *CLong(JSOBJ obj, JSONTypeContext *tc, void *outValue,
                         ^
pandas/_libs/src/ujson/python/objToJSON.c:396:28: warning: unused parameter '_outLen' [-Wunused-parameter]
                   size_t *_outLen) {
                           ^
pandas/_libs/src/ujson/python/objToJSON.c:402:34: warning: unused parameter '_obj' [-Wunused-parameter]
static void *PyLongToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue,
                                 ^
pandas/_libs/src/ujson/python/objToJSON.c:403:36: warning: unused parameter '_outLen' [-Wunused-parameter]
                           size_t *_outLen) {
                                   ^
pandas/_libs/src/ujson/python/objToJSON.c:408:60: warning: unused parameter 'tc' [-Wunused-parameter]
static void *NpyFloatToDOUBLE(JSOBJ _obj, JSONTypeContext *tc, void *outValue,
                                                           ^
pandas/_libs/src/ujson/python/objToJSON.c:409:39: warning: unused parameter '_outLen' [-Wunused-parameter]
                              size_t *_outLen) {
                                      ^
pandas/_libs/src/ujson/python/objToJSON.c:415:59: warning: unused parameter 'tc' [-Wunused-parameter]
static void *PyFloatToDOUBLE(JSOBJ _obj, JSONTypeContext *tc, void *outValue,
                                                          ^
pandas/_libs/src/ujson/python/objToJSON.c:416:38: warning: unused parameter '_outLen' [-Wunused-parameter]
                             size_t *_outLen) {
                                     ^
pandas/_libs/src/ujson/python/objToJSON.c:422:57: warning: unused parameter 'tc' [-Wunused-parameter]
static void *PyBytesToUTF8(JSOBJ _obj, JSONTypeContext *tc, void *outValue,
                                                        ^
pandas/_libs/src/ujson/python/objToJSON.c:422:67: warning: unused parameter 'outValue' [-Wunused-parameter]
static void *PyBytesToUTF8(JSOBJ _obj, JSONTypeContext *tc, void *outValue,
                                                                  ^
pandas/_libs/src/ujson/python/objToJSON.c:429:69: warning: unused parameter 'outValue' [-Wunused-parameter]
static void *PyUnicodeToUTF8(JSOBJ _obj, JSONTypeContext *tc, void *outValue,
                                                                    ^
pandas/_libs/src/ujson/python/objToJSON.c:515:40: warning: unused parameter '_obj' [-Wunused-parameter]
static void *NpyDatetime64ToJSON(JSOBJ _obj, JSONTypeContext *tc,
                                       ^
pandas/_libs/src/ujson/python/objToJSON.c:554:40: warning: unused parameter 'obj' [-Wunused-parameter]
static int NpyTypeToJSONType(PyObject *obj, JSONTypeContext *tc, int npyType,
                                       ^
pandas/_libs/src/ujson/python/objToJSON.c:624:40: warning: unused parameter '_obj' [-Wunused-parameter]
static void NpyArr_freeItemValue(JSOBJ _obj, JSONTypeContext *tc) {
                                       ^
pandas/_libs/src/ujson/python/objToJSON.c:633:31: warning: unused parameter '_obj' [-Wunused-parameter]
int NpyArr_iterNextNone(JSOBJ _obj, JSONTypeContext *tc) { return 0; }
                              ^
pandas/_libs/src/ujson/python/objToJSON.c:633:54: warning: unused parameter 'tc' [-Wunused-parameter]
int NpyArr_iterNextNone(JSOBJ _obj, JSONTypeContext *tc) { return 0; }
                                                     ^
pandas/_libs/src/ujson/python/objToJSON.c:690:37: warning: unused parameter 'obj' [-Wunused-parameter]
void NpyArrPassThru_iterBegin(JSOBJ obj, JSONTypeContext *tc) { PRINTMARK(); }
                                    ^
pandas/_libs/src/ujson/python/objToJSON.c:690:59: warning: unused parameter 'tc' [-Wunused-parameter]
void NpyArrPassThru_iterBegin(JSOBJ obj, JSONTypeContext *tc) { PRINTMARK(); }
                                                          ^
pandas/_libs/src/ujson/python/objToJSON.c:769:33: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ NpyArr_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                                ^
pandas/_libs/src/ujson/python/objToJSON.c:774:32: warning: unused parameter 'obj' [-Wunused-parameter]
char *NpyArr_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                               ^
pandas/_libs/src/ujson/python/objToJSON.c:828:33: warning: unused parameter 'obj' [-Wunused-parameter]
char *PdBlock_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                ^
pandas/_libs/src/ujson/python/objToJSON.c:850:43: warning: unused parameter 'obj' [-Wunused-parameter]
char *PdBlock_iterGetName_Transpose(JSOBJ obj, JSONTypeContext *tc,
                                          ^
pandas/_libs/src/ujson/python/objToJSON.c:896:38: warning: unused parameter 'obj' [-Wunused-parameter]
void PdBlockPassThru_iterBegin(JSOBJ obj, JSONTypeContext *tc) {
                                     ^
pandas/_libs/src/ujson/python/objToJSON.c:1128:26: warning: unused parameter 'obj' [-Wunused-parameter]
void Tuple_iterEnd(JSOBJ obj, JSONTypeContext *tc) {}
                         ^
pandas/_libs/src/ujson/python/objToJSON.c:1128:48: warning: unused parameter 'tc' [-Wunused-parameter]
void Tuple_iterEnd(JSOBJ obj, JSONTypeContext *tc) {}
                                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1130:32: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ Tuple_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1134:31: warning: unused parameter 'obj' [-Wunused-parameter]
char *Tuple_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                              ^
pandas/_libs/src/ujson/python/objToJSON.c:1134:53: warning: unused parameter 'tc' [-Wunused-parameter]
char *Tuple_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                                    ^
pandas/_libs/src/ujson/python/objToJSON.c:1134:65: warning: unused parameter 'outLen' [-Wunused-parameter]
char *Tuple_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                                                ^
pandas/_libs/src/ujson/python/objToJSON.c:1147:25: warning: unused parameter 'obj' [-Wunused-parameter]
int Iter_iterNext(JSOBJ obj, JSONTypeContext *tc) {
                        ^
pandas/_libs/src/ujson/python/objToJSON.c:1165:25: warning: unused parameter 'obj' [-Wunused-parameter]
void Iter_iterEnd(JSOBJ obj, JSONTypeContext *tc) {
                        ^
pandas/_libs/src/ujson/python/objToJSON.c:1177:31: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ Iter_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                              ^
pandas/_libs/src/ujson/python/objToJSON.c:1181:30: warning: unused parameter 'obj' [-Wunused-parameter]
char *Iter_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                             ^
pandas/_libs/src/ujson/python/objToJSON.c:1181:52: warning: unused parameter 'tc' [-Wunused-parameter]
char *Iter_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                                   ^
pandas/_libs/src/ujson/python/objToJSON.c:1181:64: warning: unused parameter 'outLen' [-Wunused-parameter]
char *Iter_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1197:24: warning: unused parameter 'obj' [-Wunused-parameter]
void Dir_iterEnd(JSOBJ obj, JSONTypeContext *tc) {
                       ^
pandas/_libs/src/ujson/python/objToJSON.c:1283:30: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ Dir_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                             ^
pandas/_libs/src/ujson/python/objToJSON.c:1288:29: warning: unused parameter 'obj' [-Wunused-parameter]
char *Dir_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                            ^
pandas/_libs/src/ujson/python/objToJSON.c:1314:25: warning: unused parameter 'obj' [-Wunused-parameter]
void List_iterEnd(JSOBJ obj, JSONTypeContext *tc) {}
                        ^
pandas/_libs/src/ujson/python/objToJSON.c:1314:47: warning: unused parameter 'tc' [-Wunused-parameter]
void List_iterEnd(JSOBJ obj, JSONTypeContext *tc) {}
                                              ^
pandas/_libs/src/ujson/python/objToJSON.c:1316:31: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ List_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                              ^
pandas/_libs/src/ujson/python/objToJSON.c:1320:30: warning: unused parameter 'obj' [-Wunused-parameter]
char *List_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                             ^
pandas/_libs/src/ujson/python/objToJSON.c:1320:52: warning: unused parameter 'tc' [-Wunused-parameter]
char *List_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                                   ^
pandas/_libs/src/ujson/python/objToJSON.c:1320:64: warning: unused parameter 'outLen' [-Wunused-parameter]
char *List_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1327:28: warning: unused parameter 'obj' [-Wunused-parameter]
void Index_iterBegin(JSOBJ obj, JSONTypeContext *tc) {
                           ^
pandas/_libs/src/ujson/python/objToJSON.c:1363:26: warning: unused parameter 'obj' [-Wunused-parameter]
void Index_iterEnd(JSOBJ obj, JSONTypeContext *tc) { PRINTMARK(); }
                         ^
pandas/_libs/src/ujson/python/objToJSON.c:1363:48: warning: unused parameter 'tc' [-Wunused-parameter]
void Index_iterEnd(JSOBJ obj, JSONTypeContext *tc) { PRINTMARK(); }
                                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1365:32: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ Index_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1369:31: warning: unused parameter 'obj' [-Wunused-parameter]
char *Index_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                              ^
pandas/_libs/src/ujson/python/objToJSON.c:1377:29: warning: unused parameter 'obj' [-Wunused-parameter]
void Series_iterBegin(JSOBJ obj, JSONTypeContext *tc) {
                            ^
pandas/_libs/src/ujson/python/objToJSON.c:1418:27: warning: unused parameter 'obj' [-Wunused-parameter]
void Series_iterEnd(JSOBJ obj, JSONTypeContext *tc) {
                          ^
pandas/_libs/src/ujson/python/objToJSON.c:1424:33: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ Series_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                                ^
pandas/_libs/src/ujson/python/objToJSON.c:1428:32: warning: unused parameter 'obj' [-Wunused-parameter]
char *Series_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1436:32: warning: unused parameter 'obj' [-Wunused-parameter]
void DataFrame_iterBegin(JSOBJ obj, JSONTypeContext *tc) {
                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1482:30: warning: unused parameter 'obj' [-Wunused-parameter]
void DataFrame_iterEnd(JSOBJ obj, JSONTypeContext *tc) {
                             ^
pandas/_libs/src/ujson/python/objToJSON.c:1488:36: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ DataFrame_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                                   ^
pandas/_libs/src/ujson/python/objToJSON.c:1492:35: warning: unused parameter 'obj' [-Wunused-parameter]
char *DataFrame_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                  ^
pandas/_libs/src/ujson/python/objToJSON.c:1502:27: warning: unused parameter 'obj' [-Wunused-parameter]
void Dict_iterBegin(JSOBJ obj, JSONTypeContext *tc) {
                          ^
pandas/_libs/src/ujson/python/objToJSON.c:1507:25: warning: unused parameter 'obj' [-Wunused-parameter]
int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc) {
                        ^
pandas/_libs/src/ujson/python/objToJSON.c:1535:25: warning: unused parameter 'obj' [-Wunused-parameter]
void Dict_iterEnd(JSOBJ obj, JSONTypeContext *tc) {
                        ^
pandas/_libs/src/ujson/python/objToJSON.c:1544:31: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ Dict_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                              ^
pandas/_libs/src/ujson/python/objToJSON.c:1548:30: warning: unused parameter 'obj' [-Wunused-parameter]
char *Dict_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                             ^
pandas/_libs/src/ujson/python/objToJSON.c:2291:34: warning: unused parameter 'obj' [-Wunused-parameter]
void Object_endTypeContext(JSOBJ obj, JSONTypeContext *tc) {
                                 ^
pandas/_libs/src/ujson/python/objToJSON.c:2403:5: warning: missing field 'errorMsg' initializer [-Wmissing-field-initializers]
    }};
    ^
pandas/_libs/src/ujson/python/objToJSON.c:2403:6: warning: missing field 'npyCtxtPassthru' initializer [-Wmissing-field-initializers]
    }};
     ^
pandas/_libs/src/ujson/python/objToJSON.c:2357:31: warning: unused parameter 'self' [-Wunused-parameter]
PyObject *objToJSON(PyObject *self, PyObject *args, PyObject *kwargs) {
                              ^
68 warnings generated.

This PR

pandas/_libs/src/ujson/python/objToJSON.c:388:57: warning: unused parameter 'tc' [-Wunused-parameter]
static void *PyBytesToUTF8(JSOBJ _obj, JSONTypeContext *tc, void *outValue,
                                                        ^
pandas/_libs/src/ujson/python/objToJSON.c:388:67: warning: unused parameter 'outValue' [-Wunused-parameter]
static void *PyBytesToUTF8(JSOBJ _obj, JSONTypeContext *tc, void *outValue,
                                                                  ^
pandas/_libs/src/ujson/python/objToJSON.c:395:69: warning: unused parameter 'outValue' [-Wunused-parameter]
static void *PyUnicodeToUTF8(JSOBJ _obj, JSONTypeContext *tc, void *outValue,
                                                                    ^
pandas/_libs/src/ujson/python/objToJSON.c:481:40: warning: unused parameter '_obj' [-Wunused-parameter]
static void *NpyDatetime64ToJSON(JSOBJ _obj, JSONTypeContext *tc,
                                       ^
pandas/_libs/src/ujson/python/objToJSON.c:520:40: warning: unused parameter 'obj' [-Wunused-parameter]
static int NpyTypeToJSONType(PyObject *obj, JSONTypeContext *tc, int npyType,
                                       ^
pandas/_libs/src/ujson/python/objToJSON.c:610:40: warning: unused parameter '_obj' [-Wunused-parameter]
static void NpyArr_freeItemValue(JSOBJ _obj, JSONTypeContext *tc) {
                                       ^
pandas/_libs/src/ujson/python/objToJSON.c:619:31: warning: unused parameter '_obj' [-Wunused-parameter]
int NpyArr_iterNextNone(JSOBJ _obj, JSONTypeContext *tc) { return 0; }
                              ^
pandas/_libs/src/ujson/python/objToJSON.c:619:54: warning: unused parameter 'tc' [-Wunused-parameter]
int NpyArr_iterNextNone(JSOBJ _obj, JSONTypeContext *tc) { return 0; }
                                                     ^
pandas/_libs/src/ujson/python/objToJSON.c:676:37: warning: unused parameter 'obj' [-Wunused-parameter]
void NpyArrPassThru_iterBegin(JSOBJ obj, JSONTypeContext *tc) { PRINTMARK(); }
                                    ^
pandas/_libs/src/ujson/python/objToJSON.c:676:59: warning: unused parameter 'tc' [-Wunused-parameter]
void NpyArrPassThru_iterBegin(JSOBJ obj, JSONTypeContext *tc) { PRINTMARK(); }
                                                          ^
pandas/_libs/src/ujson/python/objToJSON.c:755:33: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ NpyArr_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                                ^
pandas/_libs/src/ujson/python/objToJSON.c:760:32: warning: unused parameter 'obj' [-Wunused-parameter]
char *NpyArr_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                               ^
pandas/_libs/src/ujson/python/objToJSON.c:814:33: warning: unused parameter 'obj' [-Wunused-parameter]
char *PdBlock_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                ^
pandas/_libs/src/ujson/python/objToJSON.c:836:43: warning: unused parameter 'obj' [-Wunused-parameter]
char *PdBlock_iterGetName_Transpose(JSOBJ obj, JSONTypeContext *tc,
                                          ^
pandas/_libs/src/ujson/python/objToJSON.c:882:38: warning: unused parameter 'obj' [-Wunused-parameter]
void PdBlockPassThru_iterBegin(JSOBJ obj, JSONTypeContext *tc) {
                                     ^
pandas/_libs/src/ujson/python/objToJSON.c:1114:26: warning: unused parameter 'obj' [-Wunused-parameter]
void Tuple_iterEnd(JSOBJ obj, JSONTypeContext *tc) {}
                         ^
pandas/_libs/src/ujson/python/objToJSON.c:1114:48: warning: unused parameter 'tc' [-Wunused-parameter]
void Tuple_iterEnd(JSOBJ obj, JSONTypeContext *tc) {}
                                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1116:32: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ Tuple_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1120:31: warning: unused parameter 'obj' [-Wunused-parameter]
char *Tuple_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                              ^
pandas/_libs/src/ujson/python/objToJSON.c:1120:53: warning: unused parameter 'tc' [-Wunused-parameter]
char *Tuple_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                                    ^
pandas/_libs/src/ujson/python/objToJSON.c:1120:65: warning: unused parameter 'outLen' [-Wunused-parameter]
char *Tuple_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                                                ^
pandas/_libs/src/ujson/python/objToJSON.c:1133:25: warning: unused parameter 'obj' [-Wunused-parameter]
int Iter_iterNext(JSOBJ obj, JSONTypeContext *tc) {
                        ^
pandas/_libs/src/ujson/python/objToJSON.c:1151:25: warning: unused parameter 'obj' [-Wunused-parameter]
void Iter_iterEnd(JSOBJ obj, JSONTypeContext *tc) {
                        ^
pandas/_libs/src/ujson/python/objToJSON.c:1163:31: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ Iter_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                              ^
pandas/_libs/src/ujson/python/objToJSON.c:1167:30: warning: unused parameter 'obj' [-Wunused-parameter]
char *Iter_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                             ^
pandas/_libs/src/ujson/python/objToJSON.c:1167:52: warning: unused parameter 'tc' [-Wunused-parameter]
char *Iter_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                                   ^
pandas/_libs/src/ujson/python/objToJSON.c:1167:64: warning: unused parameter 'outLen' [-Wunused-parameter]
char *Iter_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1183:24: warning: unused parameter 'obj' [-Wunused-parameter]
void Dir_iterEnd(JSOBJ obj, JSONTypeContext *tc) {
                       ^
pandas/_libs/src/ujson/python/objToJSON.c:1269:30: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ Dir_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                             ^
pandas/_libs/src/ujson/python/objToJSON.c:1274:29: warning: unused parameter 'obj' [-Wunused-parameter]
char *Dir_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                            ^
pandas/_libs/src/ujson/python/objToJSON.c:1300:25: warning: unused parameter 'obj' [-Wunused-parameter]
void List_iterEnd(JSOBJ obj, JSONTypeContext *tc) {}
                        ^
pandas/_libs/src/ujson/python/objToJSON.c:1300:47: warning: unused parameter 'tc' [-Wunused-parameter]
void List_iterEnd(JSOBJ obj, JSONTypeContext *tc) {}
                                              ^
pandas/_libs/src/ujson/python/objToJSON.c:1302:31: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ List_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                              ^
pandas/_libs/src/ujson/python/objToJSON.c:1306:30: warning: unused parameter 'obj' [-Wunused-parameter]
char *List_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                             ^
pandas/_libs/src/ujson/python/objToJSON.c:1306:52: warning: unused parameter 'tc' [-Wunused-parameter]
char *List_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                                   ^
pandas/_libs/src/ujson/python/objToJSON.c:1306:64: warning: unused parameter 'outLen' [-Wunused-parameter]
char *List_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1313:28: warning: unused parameter 'obj' [-Wunused-parameter]
void Index_iterBegin(JSOBJ obj, JSONTypeContext *tc) {
                           ^
pandas/_libs/src/ujson/python/objToJSON.c:1349:26: warning: unused parameter 'obj' [-Wunused-parameter]
void Index_iterEnd(JSOBJ obj, JSONTypeContext *tc) { PRINTMARK(); }
                         ^
pandas/_libs/src/ujson/python/objToJSON.c:1349:48: warning: unused parameter 'tc' [-Wunused-parameter]
void Index_iterEnd(JSOBJ obj, JSONTypeContext *tc) { PRINTMARK(); }
                                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1351:32: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ Index_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1355:31: warning: unused parameter 'obj' [-Wunused-parameter]
char *Index_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                              ^
pandas/_libs/src/ujson/python/objToJSON.c:1363:29: warning: unused parameter 'obj' [-Wunused-parameter]
void Series_iterBegin(JSOBJ obj, JSONTypeContext *tc) {
                            ^
pandas/_libs/src/ujson/python/objToJSON.c:1404:27: warning: unused parameter 'obj' [-Wunused-parameter]
void Series_iterEnd(JSOBJ obj, JSONTypeContext *tc) {
                          ^
pandas/_libs/src/ujson/python/objToJSON.c:1410:33: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ Series_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                                ^
pandas/_libs/src/ujson/python/objToJSON.c:1414:32: warning: unused parameter 'obj' [-Wunused-parameter]
char *Series_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1422:32: warning: unused parameter 'obj' [-Wunused-parameter]
void DataFrame_iterBegin(JSOBJ obj, JSONTypeContext *tc) {
                               ^
pandas/_libs/src/ujson/python/objToJSON.c:1468:30: warning: unused parameter 'obj' [-Wunused-parameter]
void DataFrame_iterEnd(JSOBJ obj, JSONTypeContext *tc) {
                             ^
pandas/_libs/src/ujson/python/objToJSON.c:1474:36: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ DataFrame_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                                   ^
pandas/_libs/src/ujson/python/objToJSON.c:1478:35: warning: unused parameter 'obj' [-Wunused-parameter]
char *DataFrame_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                                  ^
pandas/_libs/src/ujson/python/objToJSON.c:1488:27: warning: unused parameter 'obj' [-Wunused-parameter]
void Dict_iterBegin(JSOBJ obj, JSONTypeContext *tc) {
                          ^
pandas/_libs/src/ujson/python/objToJSON.c:1493:25: warning: unused parameter 'obj' [-Wunused-parameter]
int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc) {
                        ^
pandas/_libs/src/ujson/python/objToJSON.c:1521:25: warning: unused parameter 'obj' [-Wunused-parameter]
void Dict_iterEnd(JSOBJ obj, JSONTypeContext *tc) {
                        ^
pandas/_libs/src/ujson/python/objToJSON.c:1530:31: warning: unused parameter 'obj' [-Wunused-parameter]
JSOBJ Dict_iterGetValue(JSOBJ obj, JSONTypeContext *tc) {
                              ^
pandas/_libs/src/ujson/python/objToJSON.c:1534:30: warning: unused parameter 'obj' [-Wunused-parameter]
char *Dict_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) {
                             ^
pandas/_libs/src/ujson/python/objToJSON.c:2278:34: warning: unused parameter 'obj' [-Wunused-parameter]
void Object_endTypeContext(JSOBJ obj, JSONTypeContext *tc) {
                                 ^
pandas/_libs/src/ujson/python/objToJSON.c:2304:35: warning: unused parameter 'obj' [-Wunused-parameter]
JSINT64 Object_getLongValue(JSOBJ obj, JSONTypeContext *tc) {
                                  ^
pandas/_libs/src/ujson/python/objToJSON.c:2308:36: warning: unused parameter 'obj' [-Wunused-parameter]
double Object_getDoubleValue(JSOBJ obj, JSONTypeContext *tc) {
                                   ^
pandas/_libs/src/ujson/python/objToJSON.c:2380:5: warning: missing field 'errorMsg' initializer [-Wmissing-field-initializers]
    }};
    ^
pandas/_libs/src/ujson/python/objToJSON.c:2380:6: warning: missing field 'npyCtxtPassthru' initializer [-Wmissing-field-initializers]
    }};
     ^
pandas/_libs/src/ujson/python/objToJSON.c:2334:31: warning: unused parameter 'self' [-Wunused-parameter]
PyObject *objToJSON(PyObject *self, PyObject *args, PyObject *kwargs) {
                              ^
60 warnings generated.

@WillAyd WillAyd added Refactor Internal refactoring of code IO JSON read_json, to_json, json_normalize labels Dec 2, 2019
@WillAyd
Copy link
Member Author

WillAyd commented Dec 2, 2019

FWIW the reduction of anonymous functions here gives a little boost to performance

       before           after         ratio
     [6ffbc4ef]       [86a575f2]
     <master>         <consistent-json>
-         140±3ms          121±3ms     0.87  io.json.ToJSONLines.time_delta_int_tstamp_lines
-        90.3±2ms         73.1±3ms     0.81  io.json.ToJSON.time_to_json('split', 'df_td_int_ts')
-        80.9±2ms         63.6±2ms     0.79  io.json.ToJSON.time_to_json('values', 'df_td_int_ts')
-         105±2ms         82.0±2ms     0.78  io.json.ToJSON.time_to_json('records', 'df_td_int_ts')

SOME BENCHMARKS HAVE CHANGED SIGNIFICANTLY.
PERFORMANCE INCREASED.

@jbrockmendel
Copy link
Member

tentatively looks nice; will take a look in the AM

@WillAyd WillAyd changed the title Reduce Loosely Typed Callbacks in objToJSON Reduce Loosely Typed Functions in objToJSON Dec 2, 2019
@@ -571,7 +537,6 @@ static int NpyTypeToJSONType(PyObject *obj, JSONTypeContext *tc, int npyType,
return JT_NULL;
}
GET_TC(tc)->doubleValue = (double)doubleVal;
GET_TC(tc)->PyTypeToJSON = CDouble;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To make sure i understatnd, Foo._PyTypeToJSON are the callbacks you're referring to?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep that's right - anything getting assigned to PyTypeToJSON (side note - not technically callbacks but void pointer functions; edited appropriately)

In the end we might be able to get rid of the custom PyEncoder altogether and just use more built-in ujson functionality by assigning the native types and returning JT_<TYPE> where appropriate

GET_TC(tc)->longValue = (JSINT64)longVal;
GET_TC(tc)->PyTypeToJSON = NpyDatetime64ToJSON;
return ((PyObjectEncoder *)tc->encoder)->datetimeIso ? JT_UTF8
: JT_LONG;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

im not so familiar with this syntax. is the ?:; here equivalent to the if/else you've changed this to?

There is still GET_TC(tc)->PyTypeToJSON = NpyDatetime64ToJSON on 559. You're not getting rid of this one?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is the ternary operator, so basically <EXPRESSION> ? <VALUE_IF_TRUE> : <VALUE_IF_FALSE>

This is used elsewhere in the module; just copying over

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think i get it, thanks

@jbrockmendel
Copy link
Member

pending green (Azure fail looks unrelated) LGTM, but someone with stronger C-fu should take a look. @chris-b1 ?

@jreback jreback added this to the 1.0 milestone Dec 4, 2019
@jreback
Copy link
Contributor

jreback commented Dec 4, 2019

lgtm. will wait for @chris-b1 look.

@WillAyd
Copy link
Member Author

WillAyd commented Dec 7, 2019

Merging to continue on this one. Happy to address any comments that come up later

@WillAyd WillAyd merged commit f7b3dec into pandas-dev:master Dec 7, 2019
@WillAyd WillAyd deleted the consistent-json branch December 7, 2019 22:28
proost pushed a commit to proost/pandas that referenced this pull request Dec 19, 2019
proost pushed a commit to proost/pandas that referenced this pull request Dec 19, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
IO JSON read_json, to_json, json_normalize Refactor Internal refactoring of code
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants