[Python-checkins] cpython: keyobject_richcompare() now uses fast call

victor.stinner python-checkins at python.org
Fri Aug 19 12:53:54 EDT 2016


https://hg.python.org/cpython/rev/71c22e592a9b
changeset:   102780:71c22e592a9b
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Fri Aug 19 18:52:35 2016 +0200
summary:
  keyobject_richcompare() now uses fast call

Issue #27128: keyobject_richcompare() now calls _PyObject_FastCall() using a
small stack allocated on the C stack to avoid a temporary tuple.

files:
  Modules/_functoolsmodule.c |  18 +++++++-----------
  1 files changed, 7 insertions(+), 11 deletions(-)


diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c
--- a/Modules/_functoolsmodule.c
+++ b/Modules/_functoolsmodule.c
@@ -461,12 +461,12 @@
 keyobject_richcompare(PyObject *ko, PyObject *other, int op)
 {
     PyObject *res;
-    PyObject *args;
     PyObject *x;
     PyObject *y;
     PyObject *compare;
     PyObject *answer;
     static PyObject *zero;
+    PyObject* stack[2];
 
     if (zero == NULL) {
         zero = PyLong_FromLong(0);
@@ -490,17 +490,13 @@
     /* Call the user's comparison function and translate the 3-way
      * result into true or false (or error).
      */
-    args = PyTuple_New(2);
-    if (args == NULL)
+    stack[0] = x;
+    stack[1] = y;
+    res = _PyObject_FastCall(compare, stack, 2, NULL);
+    if (res == NULL) {
         return NULL;
-    Py_INCREF(x);
-    Py_INCREF(y);
-    PyTuple_SET_ITEM(args, 0, x);
-    PyTuple_SET_ITEM(args, 1, y);
-    res = PyObject_Call(compare, args, NULL);
-    Py_DECREF(args);
-    if (res == NULL)
-        return NULL;
+    }
+
     answer = PyObject_RichCompare(res, zero, op);
     Py_DECREF(res);
     return answer;

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list