• Jeffrey Yasskin's avatar
    http://bugs.python.org/issue4715 · 9de7ec78
    Jeffrey Yasskin yazdı
    This patch by Antoine Pitrou optimizes the bytecode for conditional branches by
    merging the following "POP_TOP" instruction into the conditional jump.  For
    example, the list comprehension "[x for x in l if not x]" produced the
    following bytecode:
    
      1           0 BUILD_LIST               0
                  3 LOAD_FAST                0 (.0)
            >>    6 FOR_ITER                23 (to 32)
                  9 STORE_FAST               1 (x)
                 12 LOAD_FAST                1 (x)
                 15 JUMP_IF_TRUE            10 (to 28)
                 18 POP_TOP
                 19 LOAD_FAST                1 (x)
                 22 LIST_APPEND              2
                 25 JUMP_ABSOLUTE            6
            >>   28 POP_TOP
                 29 JUMP_ABSOLUTE            6
            >>   32 RETURN_VALUE
    
    but after the patch it produces the following bytecode:
    
      1           0 BUILD_LIST               0
                  3 LOAD_FAST                0 (.0)
            >>    6 FOR_ITER                18 (to 27)
                  9 STORE_FAST               1 (x)
                 12 LOAD_FAST                1 (x)
                 15 POP_JUMP_IF_TRUE         6
                 18 LOAD_FAST                1 (x)
                 21 LIST_APPEND              2
                 24 JUMP_ABSOLUTE            6
            >>   27 RETURN_VALUE
    
    Notice that not only the code is shorter, but the conditional jump
    (POP_JUMP_IF_TRUE) jumps right to the start of the loop instead of going through
    the JUMP_ABSOLUTE at the end. "continue" statements are helped
    similarly.
    
    Furthermore, the old jump opcodes (JUMP_IF_FALSE, JUMP_IF_TRUE) have been
    replaced by two new opcodes:
    - JUMP_IF_TRUE_OR_POP, which jumps if true and pops otherwise
    - JUMP_IF_FALSE_OR_POP, which jumps if false and pops otherwise
    9de7ec78
Adı
Son kayıt (commit)
Son güncelleme
..
Python-ast.h Loading commit data...
Python.h Loading commit data...
abstract.h Loading commit data...
asdl.h Loading commit data...
ast.h Loading commit data...
bitset.h Loading commit data...
boolobject.h Loading commit data...
bytearrayobject.h Loading commit data...
bytes_methods.h Loading commit data...
bytesobject.h Loading commit data...
cellobject.h Loading commit data...
ceval.h Loading commit data...
classobject.h Loading commit data...
cobject.h Loading commit data...
code.h Loading commit data...
codecs.h Loading commit data...
compile.h Loading commit data...
complexobject.h Loading commit data...
datetime.h Loading commit data...
descrobject.h Loading commit data...
dictobject.h Loading commit data...
enumobject.h Loading commit data...
errcode.h Loading commit data...
eval.h Loading commit data...
fileobject.h Loading commit data...
floatobject.h Loading commit data...
frameobject.h Loading commit data...
funcobject.h Loading commit data...
genobject.h Loading commit data...
graminit.h Loading commit data...
grammar.h Loading commit data...
import.h Loading commit data...
intobject.h Loading commit data...
intrcheck.h Loading commit data...
iterobject.h Loading commit data...
listobject.h Loading commit data...
longintrepr.h Loading commit data...
longobject.h Loading commit data...
marshal.h Loading commit data...
memoryobject.h Loading commit data...
metagrammar.h Loading commit data...
methodobject.h Loading commit data...
modsupport.h Loading commit data...
moduleobject.h Loading commit data...
node.h Loading commit data...
object.h Loading commit data...
objimpl.h Loading commit data...
opcode.h Loading commit data...
osdefs.h Loading commit data...
parsetok.h Loading commit data...
patchlevel.h Loading commit data...
pgen.h Loading commit data...
pgenheaders.h Loading commit data...
py_curses.h Loading commit data...
pyarena.h Loading commit data...
pydebug.h Loading commit data...
pyerrors.h Loading commit data...
pyexpat.h Loading commit data...
pyfpe.h Loading commit data...
pygetopt.h Loading commit data...
pymacconfig.h Loading commit data...
pymath.h Loading commit data...
pymem.h Loading commit data...
pyport.h Loading commit data...
pystate.h Loading commit data...
pystrcmp.h Loading commit data...
pystrtod.h Loading commit data...
pythonrun.h Loading commit data...
pythread.h Loading commit data...
rangeobject.h Loading commit data...
setobject.h Loading commit data...
sliceobject.h Loading commit data...
structmember.h Loading commit data...
structseq.h Loading commit data...
symtable.h Loading commit data...
sysmodule.h Loading commit data...
timefuncs.h Loading commit data...
token.h Loading commit data...
traceback.h Loading commit data...
tupleobject.h Loading commit data...
ucnhash.h Loading commit data...
unicodeobject.h Loading commit data...
warnings.h Loading commit data...
weakrefobject.h Loading commit data...