]> granicus.if.org Git - python/commitdiff
import_name() now uses fast call
authorVictor Stinner <victor.stinner@gmail.com>
Fri, 19 Aug 2016 22:44:42 +0000 (00:44 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Fri, 19 Aug 2016 22:44:42 +0000 (00:44 +0200)
Issue #27128: import_name() now calls _PyObject_FastCall() to avoid the
creation of a temporary tuple.

Python/ceval.c

index 905859ef3b611c254a36afe0d6abc749d3e6bffc..d16e93207ae9caa59736026b6a59526bb14da4a7 100644 (file)
@@ -5247,7 +5247,8 @@ static PyObject *
 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 @@ import_name(PyFrameObject *f, PyObject *name, PyObject *fromlist, PyObject *leve
     }
 
     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;
 }