diff options
author | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2008-01-24 23:42:08 +0000 |
---|---|---|
committer | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2008-01-24 23:42:08 +0000 |
commit | f1a7178cd569383cbce3aba22bd7b1d5950e7c20 (patch) | |
tree | 9e575034a9f6eed2ccb84329ea47414330c7caf9 | |
parent | d933e0a7d3656a0d08bedb1eddb6347fb7dda4ec (diff) | |
download | cpython-git-f1a7178cd569383cbce3aba22bd7b1d5950e7c20.tar.gz |
#1920: when considering a block starting by "while 0", the compiler optimized the
whole construct away, even when an 'else' clause is present::
while 0:
print("no")
else:
print("yes")
did not generate any code at all.
Now the compiler emits the 'else' block, like it already does for 'if' statements.
Backport of r60265.
-rw-r--r-- | Lib/test/test_grammar.py | 9 | ||||
-rw-r--r-- | Misc/NEWS | 5 | ||||
-rw-r--r-- | Python/compile.c | 5 |
3 files changed, 18 insertions, 1 deletions
diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py index 76483f676a..89e9e67895 100644 --- a/Lib/test/test_grammar.py +++ b/Lib/test/test_grammar.py @@ -511,6 +511,15 @@ while 0: pass while 0: pass else: pass +# Issue1920: "while 0" is optimized away, +# ensure that the "else" clause is still present. +x = 0 +while 0: + x = 1 +else: + x = 2 +assert x == 2 + print 'for_stmt' # 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] for i in 1, 2, 3: pass for i, j, k in (): pass @@ -12,6 +12,11 @@ What's New in Python 2.5.2c1? Core and builtins ----------------- +- Issue #1920: "while 0" statements were completely removed by the compiler, + even in the presence of an "else" clause, which is supposed to be run when + the condition is false. Now the compiler correctly emits bytecode for the + "else" suite. + - A few crashers fixed: weakref_in_del.py (issue #1377858); loosing_dict_ref.py (issue #1303614, test67.py); borrowed_ref_[34].py (not in tracker). diff --git a/Python/compile.c b/Python/compile.c index 0e824caabd..8e96ddfa62 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -2256,8 +2256,11 @@ compiler_while(struct compiler *c, stmt_ty s) basicblock *loop, *orelse, *end, *anchor = NULL; int constant = expr_constant(s->v.While.test); - if (constant == 0) + if (constant == 0) { + if (s->v.While.orelse) + VISIT_SEQ(c, stmt, s->v.While.orelse); return 1; + } loop = compiler_new_block(c); end = compiler_new_block(c); if (constant == -1) { |