From: Victor Stinner <victor.stinner@gmail.com>
Date: Thu, 1 Dec 2016 13:45:31 +0000 (+0100)
Subject: WITH_CLEANUP_START uses fastcall
X-Git-Tag: v3.7.0a1~1860
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=842cfff3215aaebf788d782e40a61fe421fb2a5d;p=python

WITH_CLEANUP_START uses fastcall

Modify WITH_CLEANUP_START bytecode: replace PyObject_CallFunctionObjArgs() with
_PyObject_FastCall().
---

diff --git a/Python/ceval.c b/Python/ceval.c
index d4a90c4fc9..b615bd9455 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -3135,8 +3135,12 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
                gotos should still be resumed.)
             */
 
+            PyObject* stack[3];
             PyObject *exit_func;
-            PyObject *exc = TOP(), *val = Py_None, *tb = Py_None, *res;
+            PyObject *exc, *val, *tb, *res;
+
+            val = tb = Py_None;
+            exc = TOP();
             if (exc == Py_None) {
                 (void)POP();
                 exit_func = TOP();
@@ -3180,8 +3184,11 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
                 assert(block->b_type == EXCEPT_HANDLER);
                 block->b_level--;
             }
-            /* XXX Not the fastest way to call it... */
-            res = PyObject_CallFunctionObjArgs(exit_func, exc, val, tb, NULL);
+
+            stack[0] = exc;
+            stack[1] = val;
+            stack[2] = tb;
+            res = _PyObject_FastCall(exit_func, stack, 3);
             Py_DECREF(exit_func);
             if (res == NULL)
                 goto error;