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.
... yield 2 # because it's a generator
Traceback (most recent call last):
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
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
with a third "stride" parameter. For example, "range(10)[1:6:2]"
evaluates to [1, 3, 5].
why = (enum why_code) PyInt_AsLong(v);
if (why == WHY_RETURN ||
why == WHY_YIELD ||
- why == CONTINUE_LOOP)
+ why == WHY_CONTINUE)
retval = POP();
}
else if (PyString_Check(v) || PyClass_Check(v)) {
}
else {
if (why == WHY_RETURN ||
- why == CONTINUE_LOOP)
+ why == WHY_CONTINUE)
PUSH(retval);
v = PyInt_FromLong((long)why);
PUSH(v);