Issue 11510: Fix BUILD_SET optimizer bug.

This commit is contained in:
Raymond Hettinger 2011-03-15 15:03:36 -07:00
parent 31f218bc6b
commit 0661e91fed
2 changed files with 15 additions and 2 deletions

View File

@ -294,11 +294,23 @@ class TestTranforms(unittest.TestCase):
self.assertNotIn('BINARY_', asm, e) self.assertNotIn('BINARY_', asm, e)
self.assertNotIn('BUILD_', asm, e) self.assertNotIn('BUILD_', asm, e)
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): def test_main(verbose=None):
import sys import sys
from test import support from test import support
test_classes = (TestTranforms,) test_classes = (TestTranforms, TestBuglets)
support.run_unittest(*test_classes) support.run_unittest(*test_classes)
# verify reference counting # verify reference counting

View File

@ -535,7 +535,8 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
} }
if (codestr[i+3] != UNPACK_SEQUENCE || if (codestr[i+3] != UNPACK_SEQUENCE ||
!ISBASICBLOCK(blocks,i,6) || !ISBASICBLOCK(blocks,i,6) ||
j != GETARG(codestr, i+3)) j != GETARG(codestr, i+3) ||
opcode == BUILD_SET)
continue; continue;
if (j == 1) { if (j == 1) {
memset(codestr+i, NOP, 6); memset(codestr+i, NOP, 6);