mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
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.
This commit is contained in:
parent
969de458aa
commit
c5fe5eb8d2
3 changed files with 25 additions and 2 deletions
|
@ -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
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue