]> granicus.if.org Git - python/commitdiff
SF bug 1442442: LIST_APPEND optimization got lost in the AST merge.
authorNeal Norwitz <nnorwitz@gmail.com>
Fri, 3 Mar 2006 20:29:11 +0000 (20:29 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Fri, 3 Mar 2006 20:29:11 +0000 (20:29 +0000)
Add it back.

Lib/compiler/pyassem.py
Lib/test/test_dis.py
Python/compile.c

index 5932ffe6d0f3b59af233b9d6790efa59cf8af6c5..b59661f4e15cceea8821ffb02adac91123c14666 100644 (file)
@@ -744,6 +744,7 @@ class StackDepthTracker:
     effect = {
         'POP_TOP': -1,
         'DUP_TOP': 1,
+        'LIST_APPEND': -2,
         'SLICE+1': -1,
         'SLICE+2': -1,
         'SLICE+3': -2,
index d8d53cd3b2ff03fe061953a730f6958fb8ce9457..081941dafbe9c975b808a06e534c677e23c2db3d 100644 (file)
@@ -54,31 +54,29 @@ def bug1333982(x=[]):
 
 dis_bug1333982 = """\
  %-4d         0 LOAD_CONST               1 (0)
-              3 JUMP_IF_TRUE            47 (to 53)
+              3 JUMP_IF_TRUE            41 (to 47)
               6 POP_TOP
               7 LOAD_GLOBAL              0 (AssertionError)
              10 BUILD_LIST               0
              13 DUP_TOP
-             14 LOAD_ATTR                1 (append)
-             17 STORE_FAST               1 (_[1])
-             20 LOAD_FAST                0 (x)
-             23 GET_ITER
-        >>   24 FOR_ITER                16 (to 43)
-             27 STORE_FAST               2 (s)
-             30 LOAD_FAST                1 (_[1])
-             33 LOAD_FAST                2 (s)
-             36 CALL_FUNCTION            1
-             39 POP_TOP
-             40 JUMP_ABSOLUTE           24
-        >>   43 DELETE_FAST              1 (_[1])
-
- %-4d        46 LOAD_CONST               2 (1)
-             49 BINARY_ADD
-             50 RAISE_VARARGS            2
-        >>   53 POP_TOP
-
- %-4d        54 LOAD_CONST               0 (None)
-             57 RETURN_VALUE
+             14 STORE_FAST               1 (_[1])
+             17 LOAD_FAST                0 (x)
+             20 GET_ITER
+        >>   21 FOR_ITER                13 (to 37)
+             24 STORE_FAST               2 (s)
+             27 LOAD_FAST                1 (_[1])
+             30 LOAD_FAST                2 (s)
+             33 LIST_APPEND
+             34 JUMP_ABSOLUTE           21
+        >>   37 DELETE_FAST              1 (_[1])
+
+ %-4d        40 LOAD_CONST               2 (1)
+             43 BINARY_ADD
+             44 RAISE_VARARGS            2
+        >>   47 POP_TOP
+
+ %-4d        48 LOAD_CONST               0 (None)
+             51 RETURN_VALUE
 """%(bug1333982.func_code.co_firstlineno + 1,
      bug1333982.func_code.co_firstlineno + 2,
      bug1333982.func_code.co_firstlineno + 3)
index 7abc11777dc8056a71eb2e622116abf88191e29c..c07b6d346da38797fb136c4c1b0c988abd8241d1 100644 (file)
@@ -1297,6 +1297,9 @@ opcode_stack_effect(int opcode, int oparg)
                case UNARY_INVERT:
                        return 0;
 
+               case LIST_APPEND:
+                       return -2;
+
                case BINARY_POWER:
                case BINARY_MULTIPLY:
                case BINARY_DIVIDE:
@@ -3149,8 +3152,7 @@ compiler_listcomp_generator(struct compiler *c, PyObject *tmpname,
            if (!compiler_nameop(c, tmpname, Load))
                return 0;
            VISIT(c, expr, elt);
-           ADDOP_I(c, CALL_FUNCTION, 1);
-           ADDOP(c, POP_TOP);
+           ADDOP(c, LIST_APPEND);
 
            compiler_use_next_block(c, skip);
        }
@@ -3189,7 +3191,6 @@ compiler_listcomp(struct compiler *c, expr_ty e)
                return 0;
        ADDOP_I(c, BUILD_LIST, 0);
        ADDOP(c, DUP_TOP);
-       ADDOP_O(c, LOAD_ATTR, append, names);
        if (compiler_nameop(c, tmp, Store))
            rc = compiler_listcomp_generator(c, tmp, generators, 0, 
                                             e->v.ListComp.elt);