diff options
-rw-r--r-- | Python/sysmodule.c | 29 |
1 files changed, 10 insertions, 19 deletions
diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 56175d9..74b8560 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -368,34 +368,25 @@ static PyObject * call_trampoline(PyObject* callback, PyFrameObject *frame, int what, PyObject *arg) { - PyObject *args; - PyObject *whatstr; PyObject *result; + PyObject *stack[3]; - args = PyTuple_New(3); - if (args == NULL) - return NULL; - if (PyFrame_FastToLocalsWithError(frame) < 0) + if (PyFrame_FastToLocalsWithError(frame) < 0) { return NULL; + } - Py_INCREF(frame); - whatstr = whatstrings[what]; - Py_INCREF(whatstr); - if (arg == NULL) - arg = Py_None; - Py_INCREF(arg); - PyTuple_SET_ITEM(args, 0, (PyObject *)frame); - PyTuple_SET_ITEM(args, 1, whatstr); - PyTuple_SET_ITEM(args, 2, arg); + stack[0] = (PyObject *)frame; + stack[1] = whatstrings[what]; + stack[2] = (arg != NULL) ? arg : Py_None; /* call the Python-level function */ - result = PyEval_CallObject(callback, args); + result = _PyObject_FastCall(callback, stack, 3, NULL); + PyFrame_LocalsToFast(frame, 1); - if (result == NULL) + if (result == NULL) { PyTraceBack_Here(frame); + } - /* cleanup */ - Py_DECREF(args); return result; } |