contains and rich compare slots use fast call

Issue #27128. Modify slot_sq_contains() and slot_tp_richcompare() to use fast
call to avoid a temporary tuple to pass a single positional parameter.
This commit is contained in:
Victor Stinner 2016-08-19 17:48:51 +02:00
parent 8a31c82093
commit a7720f61aa
1 changed files with 4 additions and 16 deletions

View File

@ -5853,7 +5853,7 @@ slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value)
static int static int
slot_sq_contains(PyObject *self, PyObject *value) slot_sq_contains(PyObject *self, PyObject *value)
{ {
PyObject *func, *res, *args; PyObject *func, *res;
int result = -1; int result = -1;
_Py_IDENTIFIER(__contains__); _Py_IDENTIFIER(__contains__);
@ -5866,13 +5866,7 @@ slot_sq_contains(PyObject *self, PyObject *value)
return -1; return -1;
} }
if (func != NULL) { if (func != NULL) {
args = PyTuple_Pack(1, value); res = _PyObject_FastCall(func, &value, 1, NULL);
if (args == NULL)
res = NULL;
else {
res = PyObject_Call(func, args, NULL);
Py_DECREF(args);
}
Py_DECREF(func); Py_DECREF(func);
if (res != NULL) { if (res != NULL) {
result = PyObject_IsTrue(res); result = PyObject_IsTrue(res);
@ -6225,20 +6219,14 @@ static _Py_Identifier name_op[] = {
static PyObject * static PyObject *
slot_tp_richcompare(PyObject *self, PyObject *other, int op) slot_tp_richcompare(PyObject *self, PyObject *other, int op)
{ {
PyObject *func, *args, *res; PyObject *func, *res;
func = lookup_method(self, &name_op[op]); func = lookup_method(self, &name_op[op]);
if (func == NULL) { if (func == NULL) {
PyErr_Clear(); PyErr_Clear();
Py_RETURN_NOTIMPLEMENTED; Py_RETURN_NOTIMPLEMENTED;
} }
args = PyTuple_Pack(1, other); res = _PyObject_FastCall(func, &other, 1, NULL);
if (args == NULL)
res = NULL;
else {
res = PyObject_Call(func, args, NULL);
Py_DECREF(args);
}
Py_DECREF(func); Py_DECREF(func);
return res; return res;
} }