Kaydet (Commit) c5fe5eb8 authored tarafından Guido van Rossum's avatar Guido van Rossum

SF bug 567538: Generator can crash the interpreter (Finn Bock).

This was a simple typo.  Strange that the compiler didn't catch it!
Instead of WHY_CONTINUE, two tests used CONTINUE_LOOP, which isn't a
why_code at all, but an opcode; but even though 'why' is declared as
an enum, comparing it to an int is apparently not even worth a
warning -- not in gcc, and not in VC++. :-(

Will fix in 2.2 too.
üst 969de458
...@@ -805,6 +805,26 @@ SyntaxError: invalid syntax ...@@ -805,6 +805,26 @@ SyntaxError: invalid syntax
... yield 2 # because it's a generator ... yield 2 # because it's a generator
Traceback (most recent call last): Traceback (most recent call last):
SyntaxError: 'return' with argument inside generator (<string>, line 8) SyntaxError: 'return' with argument inside generator (<string>, line 8)
This one caused a crash (see SF bug 567538):
>>> def f():
... for i in range(3):
... try:
... continue
... finally:
... yield i
...
>>> g = f()
>>> print g.next()
0
>>> print g.next()
1
>>> print g.next()
2
>>> print g.next()
Traceback (most recent call last):
StopIteration
""" """
# conjoin is a simple backtracking generator, named in honor of Icon's # conjoin is a simple backtracking generator, named in honor of Icon's
......
...@@ -6,6 +6,9 @@ Type/class unification and new-style classes ...@@ -6,6 +6,9 @@ Type/class unification and new-style classes
Core and builtins Core and builtins
- Fixed a bug with a continue inside a try block and a yield in the
finally clause. [SF bug 567538]
- Most builtin sequences now support "extended slices", i.e. slices - Most builtin sequences now support "extended slices", i.e. slices
with a third "stride" parameter. For example, "range(10)[1:6:2]" with a third "stride" parameter. For example, "range(10)[1:6:2]"
evaluates to [1, 3, 5]. evaluates to [1, 3, 5].
......
...@@ -1543,7 +1543,7 @@ eval_frame(PyFrameObject *f) ...@@ -1543,7 +1543,7 @@ eval_frame(PyFrameObject *f)
why = (enum why_code) PyInt_AsLong(v); why = (enum why_code) PyInt_AsLong(v);
if (why == WHY_RETURN || if (why == WHY_RETURN ||
why == WHY_YIELD || why == WHY_YIELD ||
why == CONTINUE_LOOP) why == WHY_CONTINUE)
retval = POP(); retval = POP();
} }
else if (PyString_Check(v) || PyClass_Check(v)) { else if (PyString_Check(v) || PyClass_Check(v)) {
...@@ -2293,7 +2293,7 @@ eval_frame(PyFrameObject *f) ...@@ -2293,7 +2293,7 @@ eval_frame(PyFrameObject *f)
} }
else { else {
if (why == WHY_RETURN || if (why == WHY_RETURN ||
why == CONTINUE_LOOP) why == WHY_CONTINUE)
PUSH(retval); PUSH(retval);
v = PyInt_FromLong((long)why); v = PyInt_FromLong((long)why);
PUSH(v); PUSH(v);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment