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

victor.stinner python-checkins at python.org
Fri Aug 19 19:50:39 EDT 2016


https://hg.python.org/cpython/rev/0da1ce362d15
changeset:   102783:0da1ce362d15
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Sat Aug 20 00:44:42 2016 +0200
summary:
  import_name() now uses fast call

Issue #27128: import_name() now calls _PyObject_FastCall() to avoid the
creation of a temporary tuple.

files:
  Python/ceval.c |  22 +++++++++-------------
  1 files changed, 9 insertions(+), 13 deletions(-)


diff --git a/Python/ceval.c b/Python/ceval.c
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -5247,7 +5247,8 @@
 import_name(PyFrameObject *f, PyObject *name, PyObject *fromlist, PyObject *level)
 {
     _Py_IDENTIFIER(__import__);
-    PyObject *import_func, *args, *res;
+    PyObject *import_func, *res;
+    PyObject* stack[5];
 
     import_func = _PyDict_GetItemId(f->f_builtins, &PyId___import__);
     if (import_func == NULL) {
@@ -5271,18 +5272,13 @@
     }
 
     Py_INCREF(import_func);
-    args = PyTuple_Pack(5,
-                        name,
-                        f->f_globals,
-                        f->f_locals == NULL ? Py_None : f->f_locals,
-                        fromlist,
-                        level);
-    if (args == NULL) {
-        Py_DECREF(import_func);
-        return NULL;
-    }
-    res = PyEval_CallObject(import_func, args);
-    Py_DECREF(args);
+
+    stack[0] = name;
+    stack[1] = f->f_globals;
+    stack[2] = f->f_locals == NULL ? Py_None : f->f_locals;
+    stack[3] = fromlist;
+    stack[4] = level;
+    res = _PyObject_FastCall(import_func, stack, 5, NULL);
     Py_DECREF(import_func);
     return res;
 }

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


More information about the Python-checkins mailing list