New submission from Eugene Toder <elto...@gmail.com>:

If statement without else part generates unnecessary JUMP_FORWARD insn with 
jumps right to the next insn:

>>> def foo(x):
        if x: x = 1

>>> dis(foo)
  2           0 LOAD_FAST                0 (x) 
              3 POP_JUMP_IF_FALSE       15 
              6 LOAD_CONST               1 (1) 
              9 STORE_FAST               0 (x) 
             12 JUMP_FORWARD             0 (to 15) 
        >>   15 LOAD_CONST               0 (None) 
             18 RETURN_VALUE         

This patch suppresses generation of this jump.

Testing revealed another issue: when AST is produced from string empty 'orelse' 
sequences are represented with NULLs. However when AST is converted from Python 
AST objects empty 'orelse' is a pointer to 0-length sequence. I've changed this 
to produce NULL pointers, like in the string case. This uses less memory and 
doesn't introduce different code path in compiler. Without this change 
test_compile failed with my first change.

make test passes.

----------
components: Interpreter Core
files: if_no_else.patch
keywords: patch
messages: 130623
nosy: eltoder
priority: normal
severity: normal
status: open
title: If without else generates redundant jump
type: performance
versions: Python 3.3
Added file: http://bugs.python.org/file21091/if_no_else.patch

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue11471>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to