diff options
Diffstat (limited to 'Python/ceval.c')
-rw-r--r-- | Python/ceval.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index b6686b6..4f4a646 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -381,6 +381,7 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals, /* Make it easier to find out where we are with a debugger */ char *filename = PyString_AsString(co->co_filename); #endif + static PyObject *nextstr; /* Code access macros */ @@ -416,6 +417,11 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals, GETLOCAL(i) = value; } while (0) /* Start of code */ + if (nextstr == NULL) { + nextstr = PyString_InternFromString("next"); + if (nextstr == NULL) + return NULL; + } #ifdef USE_STACKCHECK if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) { @@ -1875,6 +1881,41 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals, JUMPTO(oparg); continue; + case GET_ITER: + /* before: [obj]; after [getiter(obj)] */ + v = POP(); + x = PyObject_GetIter(v); + Py_DECREF(v); + if (x != NULL) { + w = x; + x = PyObject_GetAttr(w, nextstr); + Py_DECREF(w); + if (x != NULL) { + PUSH(x); + continue; + } + } + break; + + case FOR_ITER: + /* before: [iter]; after: [iter, iter()] *or* [] */ + v = TOP(); + x = PyObject_CallObject(v, NULL); + if (x == NULL) { + if (PyErr_ExceptionMatches( + PyExc_StopIteration)) + { + PyErr_Clear(); + x = v = POP(); + Py_DECREF(v); + JUMPBY(oparg); + continue; + } + break; + } + PUSH(x); + continue; + case FOR_LOOP: /* for v in s: ... On entry: stack contains s, i. |