]> granicus.if.org Git - python/commitdiff
Maintain peepholer's cumlc invariant by updating the running total
authorRaymond Hettinger <python@rcn.com>
Tue, 2 Nov 2004 04:20:10 +0000 (04:20 +0000)
committerRaymond Hettinger <python@rcn.com>
Tue, 2 Nov 2004 04:20:10 +0000 (04:20 +0000)
everytime a LOAD_CONSTANT is encountered, created, or overwritten.

Added two tests to cover cases affected by the patch.

Lib/test/test_peepholer.py
Python/compile.c

index 934b57c1e8d238fcb688535db7315b7db153550a..f58fe03c7eb3484fedb3cd45b1326697d9da198f 100644 (file)
@@ -75,9 +75,11 @@ class TestTranforms(unittest.TestCase):
 
     def test_folding_of_tuples_of_constants(self):
         for line, elem in (
-            ('a = 1,2,3', '((1, 2, 3))',),
-            ('("a","b","c")', "(('a', 'b', 'c'))",),
-            ('a,b,c = 1,2,3', '((1, 2, 3))',),
+            ('a = 1,2,3', '((1, 2, 3))'),
+            ('("a","b","c")', "(('a', 'b', 'c'))"),
+            ('a,b,c = 1,2,3', '((1, 2, 3))'),
+            ('(None, 1, None)', '((None, 1, None))'),
+            ('((1, 2), 3, 4)', '(((1, 2), 3, 4))'),
             ):
             asm = dis_single(line)
             self.assert_(elem in asm)
index d47f8d53fe4519c8af68b853dab5fde7ef568094..be81ba0b1abb93484e2b13b983a8e485c912cb8f 100644 (file)
@@ -586,6 +586,7 @@ optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *linen
                                if (PyList_GET_ITEM(consts, j) == Py_None) {
                                        codestr[i] = LOAD_CONST;
                                        SETARG(codestr, i, j);
+                                       cumlc = lastlc + 1;
                                        break;
                                }
                        }
@@ -601,6 +602,7 @@ optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *linen
                            !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
                                continue;
                        memset(codestr+i, NOP, 7);
+                       cumlc = 0;
                        break;
 
                /* Try to fold tuples of constants.
@@ -615,6 +617,8 @@ optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *linen
                            codestr[h] == LOAD_CONST  && 
                            ISBASICBLOCK(blocks, h, 3*(j+1))  &&
                            tuple_of_constants(&codestr[h], j, consts)) {
+                               assert(codestr[i] == LOAD_CONST);
+                               cumlc = 1;
                                break;
                        }
                        /* Intentional fallthrough */