diff options
author | Thomas Wouters <thomas@python.org> | 2001-09-26 12:43:39 (GMT) |
---|---|---|
committer | Thomas Wouters <thomas@python.org> | 2001-09-26 12:43:39 (GMT) |
commit | 80d373cbd0eb5c84ca857152a388a7c3056cb362 (patch) | |
tree | 905d385a237682d53a8e584e97e331034a37c671 /Lib/test | |
parent | 65279d024262695b4f49e83649f84901f0cb991a (diff) | |
download | cpython-80d373cbd0eb5c84ca857152a388a7c3056cb362.zip cpython-80d373cbd0eb5c84ca857152a388a7c3056cb362.tar.gz cpython-80d373cbd0eb5c84ca857152a388a7c3056cb362.tar.bz2 |
Test case for SF bugs #463359 and #462937, added to test_grammar for lack of
a better place. Excessively fragile code, but at least it breaks when
something in this area changes!
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/output/test_grammar | 1 | ||||
-rw-r--r-- | Lib/test/test_grammar.py | 27 |
2 files changed, 28 insertions, 0 deletions
diff --git a/Lib/test/output/test_grammar b/Lib/test/output/test_grammar index 5d0c177..5240bed 100644 --- a/Lib/test/output/test_grammar +++ b/Lib/test/output/test_grammar @@ -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 diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py index e5ba73e..7ce8a79 100644 --- a/Lib/test/test_grammar.py +++ b/Lib/test/test_grammar.py @@ -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 |