Kaydet (Commit) 29dcaad6 authored tarafından Raymond Hettinger's avatar Raymond Hettinger

Issue 11510: Fix BUILD_SET optimizer bug.

üst 729c5e20
...@@ -267,11 +267,23 @@ class TestTranforms(unittest.TestCase): ...@@ -267,11 +267,23 @@ class TestTranforms(unittest.TestCase):
asm = disassemble(f) asm = disassemble(f)
self.assertNotIn('BINARY_ADD', asm) 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): 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
......
...@@ -10,6 +10,8 @@ What's New in Python 3.2.1? ...@@ -10,6 +10,8 @@ What's New in Python 3.2.1?
Core and Builtins 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 - 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 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. file descriptor would raise an exception. webbrowser.open would fail. fixed.
......
...@@ -475,7 +475,8 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, ...@@ -475,7 +475,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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment