]> granicus.if.org Git - python/commitdiff
Test case for SF bugs #463359 and #462937, added to test_grammar for lack of
authorThomas Wouters <thomas@python.org>
Wed, 26 Sep 2001 12:43:39 +0000 (12:43 +0000)
committerThomas Wouters <thomas@python.org>
Wed, 26 Sep 2001 12:43:39 +0000 (12:43 +0000)
a better place. Excessively fragile code, but at least it breaks when
something in this area changes!

Lib/test/output/test_grammar
Lib/test/test_grammar.py

index 5d0c17707dd91ccc713a3d78b4037d9c226a8123..5240bedfd31eb2a9bb6ee15c11fd552bdf77444f 100644 (file)
@@ -32,6 +32,7 @@ break_stmt
 continue_stmt
 continue + try/except ok
 continue + try/finally ok
+testing continue and break in try/except in loop
 return_stmt
 raise_stmt
 import_stmt
index e5ba73e6d6a0b6e13a5827ca54414e6c7c3e2b76..7ce8a79e51133bd13a971ae0ac77b205894748e3 100644 (file)
@@ -358,6 +358,33 @@ while not msg:
         msg = "continue + try/finally ok"
 print msg
 
+
+# This test warrants an explanation. It is a test specifically for SF bugs
+# #463359 and #462937. The bug is that a 'break' statement executed or
+# exception raised inside a try/except inside a loop, *after* a continue
+# statement has been executed in that loop, will cause the wrong number of
+# arguments to be popped off the stack and the instruction pointer reset to
+# a very small number (usually 0.) Because of this, the following test
+# *must* written as a function, and the tracking vars *must* be function
+# arguments with default values. Otherwise, the test will loop and loop.
+
+print "testing continue and break in try/except in loop"
+def test_break_continue_loop(extra_burning_oil = 1, count=0):
+    big_hippo = 2
+    while big_hippo:
+        count += 1
+        try:
+            if extra_burning_oil and big_hippo == 1:
+                extra_burning_oil -= 1
+                break
+            big_hippo -= 1
+            continue
+        except:
+            raise
+    if count > 2 or big_hippo <> 1:
+        print "continue then break in try/except in loop broken!"
+test_break_continue_loop()
+
 print 'return_stmt' # 'return' [testlist]
 def g1(): return
 def g2(): return 1