]> granicus.if.org Git - python/commitdiff
sorted() uses METH_FASTCALL
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 17 Jan 2017 14:17:49 +0000 (15:17 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 17 Jan 2017 14:17:49 +0000 (15:17 +0100)
Python/bltinmodule.c

index 9487a5364abebe1de2d4bf2e9ec19d7076f1be32..cde2b758299c58d0492e49815f2b10b48808cf4b 100644 (file)
@@ -2121,20 +2121,20 @@ PyDoc_STRVAR(builtin_sorted__doc__,
 "reverse flag can be set to request the result in descending order.");
 
 #define BUILTIN_SORTED_METHODDEF    \
-    {"sorted", (PyCFunction)builtin_sorted, METH_VARARGS|METH_KEYWORDS, builtin_sorted__doc__},
+    {"sorted", (PyCFunction)builtin_sorted, METH_FASTCALL, builtin_sorted__doc__},
 
 static PyObject *
-builtin_sorted(PyObject *self, PyObject *args, PyObject *kwds)
+builtin_sorted(PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
 {
-    PyObject *newlist, *v, *seq, *keyfunc=NULL, **newargs;
+    PyObject *newlist, *v, *seq, *keyfunc=NULL;
     PyObject *callable;
-    static char *kwlist[] = {"iterable", "key", "reverse", 0};
+    static const char * const kwlist[] = {"iterable", "key", "reverse", 0};
+    /* args 1-3 should match listsort in Objects/listobject.c */
+    static _PyArg_Parser parser = {"O|Oi:sorted", kwlist, 0};
     int reverse;
-    Py_ssize_t nargs;
 
-    /* args 1-3 should match listsort in Objects/listobject.c */
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|Oi:sorted",
-        kwlist, &seq, &keyfunc, &reverse))
+    if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &parser,
+                                      &seq, &keyfunc, &reverse))
         return NULL;
 
     newlist = PySequence_List(seq);
@@ -2147,9 +2147,7 @@ builtin_sorted(PyObject *self, PyObject *args, PyObject *kwds)
         return NULL;
     }
 
-    newargs = &PyTuple_GET_ITEM(args, 1);
-    nargs = PyTuple_GET_SIZE(args) - 1;
-    v = _PyObject_FastCallDict(callable, newargs, nargs, kwds);
+    v = _PyObject_FastCallKeywords(callable, args + 1, nargs - 1, kwnames);
     Py_DECREF(callable);
     if (v == NULL) {
         Py_DECREF(newlist);