Index: Python/ceval.c =================================================================== --- Python/ceval.c (Revision 55074) +++ Python/ceval.c (Arbeitskopie) @@ -477,7 +477,7 @@ }; static enum why_code do_raise(PyObject *, PyObject *, PyObject *); -static int unpack_iterable(PyObject *, int, PyObject **); +static int unpack_iterable(PyObject *, int, int, PyObject **); /* for manipulating the thread switch and periodic "stuff" - used to be per thread, now just a pair o' globals */ @@ -1656,7 +1656,7 @@ Py_INCREF(w); PUSH(w); } - } else if (unpack_iterable(v, oparg, + } else if (unpack_iterable(v, oparg, -1, stack_pointer + oparg)) { stack_pointer += oparg; } else { @@ -1666,6 +1666,21 @@ Py_DECREF(v); break; + case UNPACK_EX: + { + int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); + v = POP(); + + if (unpack_iterable(v, oparg & 0xFF, oparg >> 8, + stack_pointer + totalargs)) { + stack_pointer += totalargs; + } else { + why = WHY_EXCEPTION; + } + Py_DECREF(v); + break; + } + case STORE_ATTR: w = GETITEM(names, oparg); v = TOP(); @@ -3077,14 +3092,20 @@ } /* Iterate v argcnt times and store the results on the stack (via decreasing - sp). Return 1 for success, 0 if error. */ + sp). Return 1 for success, 0 if error. + + If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack + with a variable target. +*/ static int -unpack_iterable(PyObject *v, int argcnt, PyObject **sp) +unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp) { - int i = 0; + int i = 0, j = 0; + Py_ssize_t ll = 0; PyObject *it; /* iter(v) */ PyObject *w; + PyObject *l = NULL; /* variable list */ assert(v != NULL); @@ -3106,17 +3127,42 @@ *--sp = w; } - /* We better have exhausted the iterator now. */ - w = PyIter_Next(it); - if (w == NULL) { - if (PyErr_Occurred()) - goto Error; - Py_DECREF(it); - return 1; + if (argcntafter == -1) { + /* We better have exhausted the iterator now. */ + w = PyIter_Next(it); + if (w == NULL) { + if (PyErr_Occurred()) + goto Error; + Py_DECREF(it); + return 1; + } + Py_DECREF(w); + PyErr_SetString(PyExc_ValueError, "too many values to unpack"); + goto Error; } - Py_DECREF(w); - PyErr_SetString(PyExc_ValueError, "too many values to unpack"); - /* fall through */ + + l = PySequence_List(it); + if (l == NULL) + goto Error; + *--sp = l; + i++; + + ll = PyList_GET_SIZE(l); + if (ll < argcntafter) { + PyErr_Format(PyExc_ValueError, "need more than %d values to unpack", + argcnt + ll); + goto Error; + } + + /* Pop the "after-variable" args off the list. */ + for (j = argcntafter; j > 0; j--, i++) { + *--sp = PyList_GET_ITEM(l, ll - j); + } + /* Resize the list. */ + ((PyListObject *)l)->ob_size = ll - argcntafter; + Py_DECREF(it); + return 1; + Error: for (; i > 0; i--, sp++) Py_DECREF(*sp); Index: Python/graminit.c =================================================================== --- Python/graminit.c (Revision 55074) +++ Python/graminit.c (Arbeitskopie) @@ -1184,10 +1184,10 @@ {1, arcs_54_2}, }; static arc arcs_55_0[1] = { - {104, 1}, + {119, 1}, }; static arc arcs_55_1[2] = { - {119, 0}, + {120, 0}, {0, 1}, }; static state states_55[2] = { @@ -1195,15 +1195,15 @@ {2, arcs_55_1}, }; static arc arcs_56_0[9] = { - {120, 1}, {121, 1}, {122, 1}, {123, 1}, {124, 1}, {125, 1}, + {126, 1}, {98, 1}, {117, 2}, - {126, 3}, + {127, 3}, }; static arc arcs_56_1[1] = { {0, 1}, @@ -1221,22 +1221,26 @@ {1, arcs_56_2}, {2, arcs_56_3}, }; -static arc arcs_57_0[1] = { - {127, 1}, +static arc arcs_57_0[2] = { + {29, 1}, + {104, 2}, }; -static arc arcs_57_1[2] = { - {128, 0}, - {0, 1}, +static arc arcs_57_1[1] = { + {104, 2}, }; -static state states_57[2] = { - {1, arcs_57_0}, - {2, arcs_57_1}, +static arc arcs_57_2[1] = { + {0, 2}, }; +static state states_57[3] = { + {2, arcs_57_0}, + {1, arcs_57_1}, + {1, arcs_57_2}, +}; static arc arcs_58_0[1] = { - {129, 1}, + {128, 1}, }; static arc arcs_58_1[2] = { - {130, 0}, + {129, 0}, {0, 1}, }; static state states_58[2] = { @@ -1244,10 +1248,10 @@ {2, arcs_58_1}, }; static arc arcs_59_0[1] = { - {131, 1}, + {130, 1}, }; static arc arcs_59_1[2] = { - {132, 0}, + {131, 0}, {0, 1}, }; static state states_59[2] = { @@ -1255,23 +1259,22 @@ {2, arcs_59_1}, }; static arc arcs_60_0[1] = { - {133, 1}, + {132, 1}, }; -static arc arcs_60_1[3] = { - {134, 0}, - {135, 0}, +static arc arcs_60_1[2] = { + {133, 0}, {0, 1}, }; static state states_60[2] = { {1, arcs_60_0}, - {3, arcs_60_1}, + {2, arcs_60_1}, }; static arc arcs_61_0[1] = { - {136, 1}, + {134, 1}, }; static arc arcs_61_1[3] = { - {137, 0}, - {138, 0}, + {135, 0}, + {136, 0}, {0, 1}, }; static state states_61[2] = { @@ -1279,247 +1282,243 @@ {3, arcs_61_1}, }; static arc arcs_62_0[1] = { - {139, 1}, + {137, 1}, }; -static arc arcs_62_1[5] = { +static arc arcs_62_1[3] = { + {138, 0}, + {139, 0}, + {0, 1}, +}; +static state states_62[2] = { + {1, arcs_62_0}, + {3, arcs_62_1}, +}; +static arc arcs_63_0[1] = { + {140, 1}, +}; +static arc arcs_63_1[5] = { {29, 0}, - {140, 0}, {141, 0}, {142, 0}, + {143, 0}, {0, 1}, }; -static state states_62[2] = { - {1, arcs_62_0}, - {5, arcs_62_1}, +static state states_63[2] = { + {1, arcs_63_0}, + {5, arcs_63_1}, }; -static arc arcs_63_0[4] = { - {137, 1}, +static arc arcs_64_0[4] = { {138, 1}, - {143, 1}, - {144, 2}, + {139, 1}, + {144, 1}, + {145, 2}, }; -static arc arcs_63_1[1] = { - {139, 2}, +static arc arcs_64_1[1] = { + {140, 2}, }; -static arc arcs_63_2[1] = { +static arc arcs_64_2[1] = { {0, 2}, }; -static state states_63[3] = { - {4, arcs_63_0}, - {1, arcs_63_1}, - {1, arcs_63_2}, +static state states_64[3] = { + {4, arcs_64_0}, + {1, arcs_64_1}, + {1, arcs_64_2}, }; -static arc arcs_64_0[1] = { - {145, 1}, +static arc arcs_65_0[1] = { + {146, 1}, }; -static arc arcs_64_1[3] = { - {146, 1}, +static arc arcs_65_1[3] = { + {147, 1}, {31, 2}, {0, 1}, }; -static arc arcs_64_2[1] = { - {139, 3}, +static arc arcs_65_2[1] = { + {140, 3}, }; -static arc arcs_64_3[1] = { +static arc arcs_65_3[1] = { {0, 3}, }; -static state states_64[4] = { - {1, arcs_64_0}, - {3, arcs_64_1}, - {1, arcs_64_2}, - {1, arcs_64_3}, +static state states_65[4] = { + {1, arcs_65_0}, + {3, arcs_65_1}, + {1, arcs_65_2}, + {1, arcs_65_3}, }; -static arc arcs_65_0[7] = { +static arc arcs_66_0[7] = { {13, 1}, - {148, 2}, - {150, 3}, + {149, 2}, + {151, 3}, {19, 4}, - {153, 4}, - {154, 5}, + {154, 4}, + {155, 5}, {79, 4}, }; -static arc arcs_65_1[3] = { +static arc arcs_66_1[3] = { {48, 6}, - {147, 6}, + {148, 6}, {15, 4}, }; -static arc arcs_65_2[2] = { - {147, 7}, - {149, 4}, +static arc arcs_66_2[2] = { + {148, 7}, + {150, 4}, }; -static arc arcs_65_3[2] = { - {151, 8}, - {152, 4}, +static arc arcs_66_3[2] = { + {152, 8}, + {153, 4}, }; -static arc arcs_65_4[1] = { +static arc arcs_66_4[1] = { {0, 4}, }; -static arc arcs_65_5[2] = { - {154, 5}, +static arc arcs_66_5[2] = { + {155, 5}, {0, 5}, }; -static arc arcs_65_6[1] = { +static arc arcs_66_6[1] = { {15, 4}, }; -static arc arcs_65_7[1] = { - {149, 4}, +static arc arcs_66_7[1] = { + {150, 4}, }; -static arc arcs_65_8[1] = { - {152, 4}, +static arc arcs_66_8[1] = { + {153, 4}, }; -static state states_65[9] = { - {7, arcs_65_0}, - {3, arcs_65_1}, - {2, arcs_65_2}, - {2, arcs_65_3}, - {1, arcs_65_4}, - {2, arcs_65_5}, - {1, arcs_65_6}, - {1, arcs_65_7}, - {1, arcs_65_8}, +static state states_66[9] = { + {7, arcs_66_0}, + {3, arcs_66_1}, + {2, arcs_66_2}, + {2, arcs_66_3}, + {1, arcs_66_4}, + {2, arcs_66_5}, + {1, arcs_66_6}, + {1, arcs_66_7}, + {1, arcs_66_8}, }; -static arc arcs_66_0[1] = { +static arc arcs_67_0[1] = { {22, 1}, }; -static arc arcs_66_1[3] = { - {155, 2}, +static arc arcs_67_1[3] = { + {156, 2}, {28, 3}, {0, 1}, }; -static arc arcs_66_2[1] = { +static arc arcs_67_2[1] = { {0, 2}, }; -static arc arcs_66_3[2] = { +static arc arcs_67_3[2] = { {22, 4}, {0, 3}, }; -static arc arcs_66_4[2] = { +static arc arcs_67_4[2] = { {28, 3}, {0, 4}, }; -static state states_66[5] = { - {1, arcs_66_0}, - {3, arcs_66_1}, - {1, arcs_66_2}, - {2, arcs_66_3}, - {2, arcs_66_4}, +static state states_67[5] = { + {1, arcs_67_0}, + {3, arcs_67_1}, + {1, arcs_67_2}, + {2, arcs_67_3}, + {2, arcs_67_4}, }; -static arc arcs_67_0[3] = { +static arc arcs_68_0[3] = { {13, 1}, - {148, 2}, + {149, 2}, {78, 3}, }; -static arc arcs_67_1[2] = { +static arc arcs_68_1[2] = { {14, 4}, {15, 5}, }; -static arc arcs_67_2[1] = { - {156, 6}, +static arc arcs_68_2[1] = { + {157, 6}, }; -static arc arcs_67_3[1] = { +static arc arcs_68_3[1] = { {19, 5}, }; -static arc arcs_67_4[1] = { +static arc arcs_68_4[1] = { {15, 5}, }; -static arc arcs_67_5[1] = { +static arc arcs_68_5[1] = { {0, 5}, }; -static arc arcs_67_6[1] = { - {149, 5}, +static arc arcs_68_6[1] = { + {150, 5}, }; -static state states_67[7] = { - {3, arcs_67_0}, - {2, arcs_67_1}, - {1, arcs_67_2}, - {1, arcs_67_3}, - {1, arcs_67_4}, - {1, arcs_67_5}, - {1, arcs_67_6}, +static state states_68[7] = { + {3, arcs_68_0}, + {2, arcs_68_1}, + {1, arcs_68_2}, + {1, arcs_68_3}, + {1, arcs_68_4}, + {1, arcs_68_5}, + {1, arcs_68_6}, }; -static arc arcs_68_0[1] = { - {157, 1}, +static arc arcs_69_0[1] = { + {158, 1}, }; -static arc arcs_68_1[2] = { +static arc arcs_69_1[2] = { {28, 2}, {0, 1}, }; -static arc arcs_68_2[2] = { - {157, 1}, +static arc arcs_69_2[2] = { + {158, 1}, {0, 2}, }; -static state states_68[3] = { - {1, arcs_68_0}, - {2, arcs_68_1}, - {2, arcs_68_2}, +static state states_69[3] = { + {1, arcs_69_0}, + {2, arcs_69_1}, + {2, arcs_69_2}, }; -static arc arcs_69_0[2] = { +static arc arcs_70_0[2] = { {22, 1}, {23, 2}, }; -static arc arcs_69_1[2] = { +static arc arcs_70_1[2] = { {23, 2}, {0, 1}, }; -static arc arcs_69_2[3] = { +static arc arcs_70_2[3] = { {22, 3}, - {158, 4}, + {159, 4}, {0, 2}, }; -static arc arcs_69_3[2] = { - {158, 4}, +static arc arcs_70_3[2] = { + {159, 4}, {0, 3}, }; -static arc arcs_69_4[1] = { +static arc arcs_70_4[1] = { {0, 4}, }; -static state states_69[5] = { - {2, arcs_69_0}, - {2, arcs_69_1}, - {3, arcs_69_2}, - {2, arcs_69_3}, - {1, arcs_69_4}, -}; -static arc arcs_70_0[1] = { - {23, 1}, -}; -static arc arcs_70_1[2] = { - {22, 2}, - {0, 1}, -}; -static arc arcs_70_2[1] = { - {0, 2}, -}; -static state states_70[3] = { - {1, arcs_70_0}, +static state states_70[5] = { + {2, arcs_70_0}, {2, arcs_70_1}, - {1, arcs_70_2}, + {3, arcs_70_2}, + {2, arcs_70_3}, + {1, arcs_70_4}, }; static arc arcs_71_0[1] = { - {104, 1}, + {23, 1}, }; static arc arcs_71_1[2] = { - {28, 2}, + {22, 2}, {0, 1}, }; -static arc arcs_71_2[2] = { - {104, 1}, +static arc arcs_71_2[1] = { {0, 2}, }; static state states_71[3] = { {1, arcs_71_0}, {2, arcs_71_1}, - {2, arcs_71_2}, + {1, arcs_71_2}, }; static arc arcs_72_0[1] = { - {22, 1}, + {119, 1}, }; static arc arcs_72_1[2] = { {28, 2}, {0, 1}, }; static arc arcs_72_2[2] = { - {22, 1}, + {119, 1}, {0, 2}, }; static state states_72[3] = { @@ -1530,245 +1529,261 @@ static arc arcs_73_0[1] = { {22, 1}, }; -static arc arcs_73_1[4] = { +static arc arcs_73_1[2] = { + {28, 2}, + {0, 1}, +}; +static arc arcs_73_2[2] = { + {22, 1}, + {0, 2}, +}; +static state states_73[3] = { + {1, arcs_73_0}, + {2, arcs_73_1}, + {2, arcs_73_2}, +}; +static arc arcs_74_0[1] = { + {22, 1}, +}; +static arc arcs_74_1[4] = { {23, 2}, - {155, 3}, + {156, 3}, {28, 4}, {0, 1}, }; -static arc arcs_73_2[1] = { +static arc arcs_74_2[1] = { {22, 5}, }; -static arc arcs_73_3[1] = { +static arc arcs_74_3[1] = { {0, 3}, }; -static arc arcs_73_4[2] = { +static arc arcs_74_4[2] = { {22, 6}, {0, 4}, }; -static arc arcs_73_5[2] = { +static arc arcs_74_5[2] = { {28, 7}, {0, 5}, }; -static arc arcs_73_6[2] = { +static arc arcs_74_6[2] = { {28, 4}, {0, 6}, }; -static arc arcs_73_7[2] = { +static arc arcs_74_7[2] = { {22, 8}, {0, 7}, }; -static arc arcs_73_8[1] = { +static arc arcs_74_8[1] = { {23, 2}, }; -static state states_73[9] = { - {1, arcs_73_0}, - {4, arcs_73_1}, - {1, arcs_73_2}, - {1, arcs_73_3}, - {2, arcs_73_4}, - {2, arcs_73_5}, - {2, arcs_73_6}, - {2, arcs_73_7}, - {1, arcs_73_8}, +static state states_74[9] = { + {1, arcs_74_0}, + {4, arcs_74_1}, + {1, arcs_74_2}, + {1, arcs_74_3}, + {2, arcs_74_4}, + {2, arcs_74_5}, + {2, arcs_74_6}, + {2, arcs_74_7}, + {1, arcs_74_8}, }; -static arc arcs_74_0[1] = { - {159, 1}, +static arc arcs_75_0[1] = { + {160, 1}, }; -static arc arcs_74_1[1] = { +static arc arcs_75_1[1] = { {19, 2}, }; -static arc arcs_74_2[2] = { +static arc arcs_75_2[2] = { {13, 3}, {23, 4}, }; -static arc arcs_74_3[2] = { +static arc arcs_75_3[2] = { {14, 5}, {15, 6}, }; -static arc arcs_74_4[1] = { +static arc arcs_75_4[1] = { {24, 7}, }; -static arc arcs_74_5[1] = { +static arc arcs_75_5[1] = { {15, 6}, }; -static arc arcs_74_6[1] = { +static arc arcs_75_6[1] = { {23, 4}, }; -static arc arcs_74_7[1] = { +static arc arcs_75_7[1] = { {0, 7}, }; -static state states_74[8] = { - {1, arcs_74_0}, - {1, arcs_74_1}, - {2, arcs_74_2}, - {2, arcs_74_3}, - {1, arcs_74_4}, - {1, arcs_74_5}, - {1, arcs_74_6}, - {1, arcs_74_7}, +static state states_75[8] = { + {1, arcs_75_0}, + {1, arcs_75_1}, + {2, arcs_75_2}, + {2, arcs_75_3}, + {1, arcs_75_4}, + {1, arcs_75_5}, + {1, arcs_75_6}, + {1, arcs_75_7}, }; -static arc arcs_75_0[3] = { - {160, 1}, +static arc arcs_76_0[3] = { + {161, 1}, {29, 2}, {31, 3}, }; -static arc arcs_75_1[2] = { +static arc arcs_76_1[2] = { {28, 4}, {0, 1}, }; -static arc arcs_75_2[1] = { +static arc arcs_76_2[1] = { {22, 5}, }; -static arc arcs_75_3[1] = { +static arc arcs_76_3[1] = { {22, 6}, }; -static arc arcs_75_4[4] = { - {160, 1}, +static arc arcs_76_4[4] = { + {161, 1}, {29, 2}, {31, 3}, {0, 4}, }; -static arc arcs_75_5[2] = { +static arc arcs_76_5[2] = { {28, 7}, {0, 5}, }; -static arc arcs_75_6[1] = { +static arc arcs_76_6[1] = { {0, 6}, }; -static arc arcs_75_7[1] = { +static arc arcs_76_7[1] = { {31, 3}, }; -static state states_75[8] = { - {3, arcs_75_0}, - {2, arcs_75_1}, - {1, arcs_75_2}, - {1, arcs_75_3}, - {4, arcs_75_4}, - {2, arcs_75_5}, - {1, arcs_75_6}, - {1, arcs_75_7}, +static state states_76[8] = { + {3, arcs_76_0}, + {2, arcs_76_1}, + {1, arcs_76_2}, + {1, arcs_76_3}, + {4, arcs_76_4}, + {2, arcs_76_5}, + {1, arcs_76_6}, + {1, arcs_76_7}, }; -static arc arcs_76_0[1] = { +static arc arcs_77_0[1] = { {22, 1}, }; -static arc arcs_76_1[3] = { - {155, 2}, +static arc arcs_77_1[3] = { + {156, 2}, {27, 3}, {0, 1}, }; -static arc arcs_76_2[1] = { +static arc arcs_77_2[1] = { {0, 2}, }; -static arc arcs_76_3[1] = { +static arc arcs_77_3[1] = { {22, 2}, }; -static state states_76[4] = { - {1, arcs_76_0}, - {3, arcs_76_1}, - {1, arcs_76_2}, - {1, arcs_76_3}, +static state states_77[4] = { + {1, arcs_77_0}, + {3, arcs_77_1}, + {1, arcs_77_2}, + {1, arcs_77_3}, }; -static arc arcs_77_0[2] = { - {155, 1}, - {162, 1}, +static arc arcs_78_0[2] = { + {156, 1}, + {163, 1}, }; -static arc arcs_77_1[1] = { +static arc arcs_78_1[1] = { {0, 1}, }; -static state states_77[2] = { - {2, arcs_77_0}, - {1, arcs_77_1}, +static state states_78[2] = { + {2, arcs_78_0}, + {1, arcs_78_1}, }; -static arc arcs_78_0[1] = { +static arc arcs_79_0[1] = { {97, 1}, }; -static arc arcs_78_1[1] = { +static arc arcs_79_1[1] = { {62, 2}, }; -static arc arcs_78_2[1] = { +static arc arcs_79_2[1] = { {98, 3}, }; -static arc arcs_78_3[1] = { +static arc arcs_79_3[1] = { {108, 4}, }; -static arc arcs_78_4[2] = { - {161, 5}, +static arc arcs_79_4[2] = { + {162, 5}, {0, 4}, }; -static arc arcs_78_5[1] = { +static arc arcs_79_5[1] = { {0, 5}, }; -static state states_78[6] = { - {1, arcs_78_0}, - {1, arcs_78_1}, - {1, arcs_78_2}, - {1, arcs_78_3}, - {2, arcs_78_4}, - {1, arcs_78_5}, +static state states_79[6] = { + {1, arcs_79_0}, + {1, arcs_79_1}, + {1, arcs_79_2}, + {1, arcs_79_3}, + {2, arcs_79_4}, + {1, arcs_79_5}, }; -static arc arcs_79_0[1] = { +static arc arcs_80_0[1] = { {93, 1}, }; -static arc arcs_79_1[1] = { +static arc arcs_80_1[1] = { {110, 2}, }; -static arc arcs_79_2[2] = { - {161, 3}, +static arc arcs_80_2[2] =