From 491a4cb8d934572b037c83faf30252c96cf6a3ee Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 27 May 2009 11:19:02 +0000 Subject: Fix TODO: do the sort by just the key, not the key/value pair. --- Modules/_json.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/Modules/_json.c b/Modules/_json.c index f33503b..a012560 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -1339,6 +1339,8 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss PyObject *item = NULL; int skipkeys; Py_ssize_t idx; + PyObject *mapping; + static PyObject *code = NULL; if (open_dict == NULL || close_dict == NULL || empty_dict == NULL) { open_dict = PyUnicode_InternFromString("{"); @@ -1379,25 +1381,28 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss */ } - items = PyObject_CallMethod(dct, "items", ""); /* XXX key=itemgetter(0) */ - if (items == NULL) - goto bail; if (PyObject_IsTrue(s->sort_keys)) { - PyObject *rv; - PyObject *itemlist; - - itemlist = PySequence_List(items); - Py_DECREF(items); - if (itemlist == NULL) - goto bail; + if (code == NULL) { + code = Py_CompileString("sorted(d.items(), key=lambda kv: kv[0])", + "_json.c", Py_eval_input); + if (code == NULL) + goto bail; + } - rv = PyObject_CallMethod(itemlist, "sort", ""); - if (rv == NULL) { - Py_DECREF(itemlist); + mapping = PyDict_New(); + if (mapping == NULL) + goto bail; + if (PyDict_SetItemString(mapping, "d", dct) == -1) { + Py_DECREF(mapping); goto bail; } - items = itemlist; - } + items = PyEval_EvalCode((PyCodeObject *)code, PyEval_GetGlobals(), mapping); + Py_DECREF(mapping); + } else { + items = PyMapping_Items(dct); + } + if (items == NULL) + goto bail; it = PyObject_GetIter(items); Py_DECREF(items); if (it == NULL) -- cgit v0.12