]> granicus.if.org Git - python/commitdiff
Backed out changeset 70f88b097f60 (map_next)
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 23 Aug 2016 22:54:47 +0000 (00:54 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 23 Aug 2016 22:54:47 +0000 (00:54 +0200)
Python/bltinmodule.c

index a77dfe84c1e0a13934c42dbd412d8cf729cb3aa8..00a85b57415ad177e37e8c56cd7d557c665c0a2a 100644 (file)
@@ -1156,43 +1156,27 @@ map_traverse(mapobject *lz, visitproc visit, void *arg)
 static PyObject *
 map_next(mapobject *lz)
 {
-    PyObject *small_stack[5];
-    PyObject **stack;
-    Py_ssize_t niters, nargs, i;
-    PyObject *result = NULL;
+    PyObject *val;
+    PyObject *argtuple;
+    PyObject *result;
+    Py_ssize_t numargs, i;
 
-    niters = PyTuple_GET_SIZE(lz->iters);
-    if (niters <= (Py_ssize_t)Py_ARRAY_LENGTH(small_stack)) {
-        stack = small_stack;
-    }
-    else {
-        stack = PyMem_Malloc(niters * sizeof(PyObject*));
-        if (stack == NULL) {
-            PyErr_NoMemory();
-            return NULL;
-        }
-    }
+    numargs = PyTuple_GET_SIZE(lz->iters);
+    argtuple = PyTuple_New(numargs);
+    if (argtuple == NULL)
+        return NULL;
 
-    nargs = 0;
-    for (i=0; i < niters; i++) {
+    for (i=0 ; i<numargs ; i++) {
         PyObject *it = PyTuple_GET_ITEM(lz->iters, i);
-        PyObject *val = Py_TYPE(it)->tp_iternext(it);
+        val = Py_TYPE(it)->tp_iternext(it);
         if (val == NULL) {
-            goto exit;
+            Py_DECREF(argtuple);
+            return NULL;
         }
-        stack[i] = val;
-        nargs++;
-    }
-
-    result = _PyObject_FastCall(lz->func, stack, nargs);
-
-exit:
-    for (i=0; i < nargs; i++) {
-        Py_DECREF(stack[i]);
-    }
-    if (stack != small_stack) {
-        PyMem_Free(stack);
+        PyTuple_SET_ITEM(argtuple, i, val);
     }
+    result = PyObject_Call(lz->func, argtuple, NULL);
+    Py_DECREF(argtuple);
     return result;
 }