Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 491a4cb

Browse files
committed
Fix TODO: do the sort by just the key, not the key/value pair.
1 parent bcf6f92 commit 491a4cb

1 file changed

Lines changed: 20 additions & 15 deletions

File tree

Modules/_json.c

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1339,6 +1339,8 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss
13391339
PyObject *item = NULL;
13401340
int skipkeys;
13411341
Py_ssize_t idx;
1342+
PyObject *mapping;
1343+
static PyObject *code = NULL;
13421344

13431345
if (open_dict == NULL || close_dict == NULL || empty_dict == NULL) {
13441346
open_dict = PyUnicode_InternFromString("{");
@@ -1379,25 +1381,28 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss
13791381
*/
13801382
}
13811383

1382-
items = PyObject_CallMethod(dct, "items", ""); /* XXX key=itemgetter(0) */
1383-
if (items == NULL)
1384-
goto bail;
13851384
if (PyObject_IsTrue(s->sort_keys)) {
1386-
PyObject *rv;
1387-
PyObject *itemlist;
1388-
1389-
itemlist = PySequence_List(items);
1390-
Py_DECREF(items);
1391-
if (itemlist == NULL)
1392-
goto bail;
1385+
if (code == NULL) {
1386+
code = Py_CompileString("sorted(d.items(), key=lambda kv: kv[0])",
1387+
"_json.c", Py_eval_input);
1388+
if (code == NULL)
1389+
goto bail;
1390+
}
13931391

1394-
rv = PyObject_CallMethod(itemlist, "sort", "");
1395-
if (rv == NULL) {
1396-
Py_DECREF(itemlist);
1392+
mapping = PyDict_New();
1393+
if (mapping == NULL)
1394+
goto bail;
1395+
if (PyDict_SetItemString(mapping, "d", dct) == -1) {
1396+
Py_DECREF(mapping);
13971397
goto bail;
13981398
}
1399-
items = itemlist;
1400-
}
1399+
items = PyEval_EvalCode((PyCodeObject *)code, PyEval_GetGlobals(), mapping);
1400+
Py_DECREF(mapping);
1401+
} else {
1402+
items = PyMapping_Items(dct);
1403+
}
1404+
if (items == NULL)
1405+
goto bail;
14011406
it = PyObject_GetIter(items);
14021407
Py_DECREF(items);
14031408
if (it == NULL)

0 commit comments

Comments
 (0)