]> granicus.if.org Git - python/commitdiff
Refactor and optimize code for UNPACK_SEQUENCE.
authorRaymond Hettinger <python@rcn.com>
Mon, 8 Mar 2004 23:25:30 +0000 (23:25 +0000)
committerRaymond Hettinger <python@rcn.com>
Mon, 8 Mar 2004 23:25:30 +0000 (23:25 +0000)
* Defer error handling for wrong number of arguments to the
  unpack_iterable() function.  Cuts the code size almost in half.

* Replace function calls to PyList_Size() and PyTuple_Size() with
  their smaller and faster macro counterparts.

* Move the constant structure references outside of the inner loops.

Python/ceval.c

index b20934c0573712630ced018130bbd6fb53a20327..1e724c5968b78c0113f2429d210232928a2dcaba 100644 (file)
@@ -1721,35 +1721,21 @@ eval_frame(PyFrameObject *f)
                PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
                case UNPACK_SEQUENCE:
                        v = POP();
-                       if (PyTuple_CheckExact(v)) {
-                               if (PyTuple_Size(v) != oparg) {
-                                       PyErr_SetString(PyExc_ValueError,
-                                                "unpack tuple of wrong size");
-                                       why = WHY_EXCEPTION;
-                               }
-                               else {
-                                       for (; --oparg >= 0; ) {
-                                               w = PyTuple_GET_ITEM(v, oparg);
-                                               Py_INCREF(w);
-                                               PUSH(w);
-                                       }
-                               }
-                       }
-                       else if (PyList_CheckExact(v)) {
-                               if (PyList_Size(v) != oparg) {
-                                       PyErr_SetString(PyExc_ValueError,
-                                                 "unpack list of wrong size");
-                                       why = WHY_EXCEPTION;
+                       if (PyTuple_CheckExact(v) && PyTuple_GET_SIZE(v) == oparg) {
+                               PyObject **items = ((PyTupleObject *)v)->ob_item;
+                               while (oparg--) {
+                                       w = items[oparg];
+                                       Py_INCREF(w);
+                                       PUSH(w);
                                }
-                               else {
-                                       for (; --oparg >= 0; ) {
-                                               w = PyList_GET_ITEM(v, oparg);
-                                               Py_INCREF(w);
-                                               PUSH(w);
-                                       }
+                       } else if (PyList_CheckExact(v) && PyList_GET_SIZE(v) == oparg) {
+                               PyObject **items = ((PyListObject *)v)->ob_item;
+                               while (oparg--) {
+                                       w = items[oparg];
+                                       Py_INCREF(w);
+                                       PUSH(w);
                                }
-                       }
-                       else if (unpack_iterable(v, oparg,
+                       } else if (unpack_iterable(v, oparg,
                                                 stack_pointer + oparg))
                                stack_pointer += oparg;
                        else {