[Python-checkins] cpython (3.2): Issue 11510: Fix BUILD_SET optimizer bug.

raymond.hettinger python-checkins at python.org
Tue Mar 15 22:50:33 CET 2011


http://hg.python.org/cpython/rev/912eb87946e0
changeset:   68563:912eb87946e0
branch:      3.2
parent:      68561:4d25b9d2aa05
user:        Raymond Hettinger <python at rcn.com>
date:        Tue Mar 15 14:50:16 2011 -0700
summary:
  Issue 11510: Fix BUILD_SET optimizer bug.

files:
  Lib/test/test_peepholer.py
  Misc/NEWS
  Python/peephole.c

diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py
--- a/Lib/test/test_peepholer.py
+++ b/Lib/test/test_peepholer.py
@@ -267,11 +267,23 @@
         asm = disassemble(f)
         self.assertNotIn('BINARY_ADD', asm)
 
+class TestBuglets(unittest.TestCase):
+
+    def test_bug_11510(self):
+        # folded constant set optimization was commingled with the tuple
+        # unpacking optimization which would fail if the set had duplicate
+        # elements so that the set length was unexpected
+        def f():
+            x, y = {1, 1}
+            return x, y
+        with self.assertRaises(ValueError):
+            f()
+
 
 def test_main(verbose=None):
     import sys
     from test import support
-    test_classes = (TestTranforms,)
+    test_classes = (TestTranforms, TestBuglets)
     support.run_unittest(*test_classes)
 
     # verify reference counting
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,8 @@
 Core and Builtins
 -----------------
 
+- Issue #11510: Fixed optimizer bug which turned "a,b={1,1}" into "a,b=(1,1)".
+
 - Issue #11432: A bug was introduced in subprocess.Popen on posix systems with
   3.2.0 where the stdout or stderr file descriptor being the same as the stdin
   file descriptor would raise an exception. webbrowser.open would fail. fixed.
diff --git a/Python/peephole.c b/Python/peephole.c
--- a/Python/peephole.c
+++ b/Python/peephole.c
@@ -475,7 +475,8 @@
                 }
                 if (codestr[i+3] != UNPACK_SEQUENCE  ||
                     !ISBASICBLOCK(blocks,i,6) ||
-                    j != GETARG(codestr, i+3))
+                    j != GETARG(codestr, i+3) ||
+                    opcode == BUILD_SET)
                     continue;
                 if (j == 1) {
                     memset(codestr+i, NOP, 6);

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list