New submission from Eugene Toder <elto...@gmail.com>:

Since the time 'x in set' optimization was added to peephole it has the 
following bug with set unpacking:

>>> def foo(x,y):
        a,b = {x,y}
        return a,b

>>> dis(foo)
  2           0 LOAD_FAST                0 (x) 
              3 LOAD_FAST                1 (y) 
              6 ROT_TWO              
              7 STORE_FAST               2 (a) 
             10 STORE_FAST               3 (b) 

  3          13 LOAD_FAST                2 (a) 
             16 LOAD_FAST                3 (b) 
             19 BUILD_TUPLE              2 
             22 RETURN_VALUE         

That is, unpacking of literal set of sizes 2 and 3 is changed to ROT 
instructions. This, however, changes the semantics, as construction of set 
would eliminate duplicates.

The difference can be demonstrated like this:
Python 3.1
>>> foo(1,1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
ValueError: need more than 1 value to unpack

Python 3.2
>>> foo(1,1)
(1, 1)

----------
components: Interpreter Core
messages: 130917
nosy: eltoder
priority: normal
severity: normal
status: open
title: Peephole breaks set unpacking
type: compile error
versions: Python 3.2

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue11510>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to