summaryrefslogtreecommitdiffstats
path: root/Python/ceval.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/ceval.c')
-rw-r--r--Python/ceval.c41
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.