[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