Author: Carl Friedrich Bolz-Tereick <[email protected]>
Branch: py3.5
Changeset: r94691:26a7e1a30293
Date: 2018-05-27 17:27 +0200
http://bitbucket.org/pypy/pypy/changeset/26a7e1a30293/
Log: fix issue #2838: don't swallow exceptions in BUILD_SET_UNPACK
(the bytecode was quite badly broken in other ways too: the JIT
would unroll the set generation completely}
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -1433,21 +1433,12 @@
@jit.unroll_safe
def BUILD_SET_UNPACK(self, itemcount, next_instr):
space = self.space
- w_sum = space.newset()
+ w_set = space.newset()
for i in range(itemcount, 0, -1):
w_item = self.peekvalue(i-1)
- # cannot use w_sum.update, w_item might not be a set
- iterator = space.iter(w_item)
- while True:
- try:
- w_value = space.next(iterator)
- except OperationError:
- break
- w_sum.add(w_value)
- while itemcount != 0:
- self.popvalue()
- itemcount -= 1
- self.pushvalue(w_sum)
+ space.call_method(w_set, "update", w_item)
+ self.popvalues(itemcount)
+ self.pushvalue(w_set)
@jit.unroll_safe
def list_unpack_helper(frame, itemcount):
diff --git a/pypy/interpreter/test/test_interpreter.py
b/pypy/interpreter/test/test_interpreter.py
--- a/pypy/interpreter/test/test_interpreter.py
+++ b/pypy/interpreter/test/test_interpreter.py
@@ -265,7 +265,7 @@
return a, b, c, d
"""
assert self.codetest(code, "f", [1, 2], {"d" : 4, "c" : 3}) == (1, 2,
3, 4)
-
+
def test_build_set_unpack(self):
code = """ def f():
return {*range(4), 4, *(5, 6, 7)}
@@ -274,13 +274,28 @@
res = self.codetest(code, "f", [])
l_res = space.call_function(space.w_list, res)
assert space.unwrap(l_res) == [0, 1, 2, 3, 4, 5, 6, 7]
-
+
+ def test_build_set_unpack_exception(self):
+ code = """ if 1:
+ def g():
+ yield 1
+ yield 2
+ raise TypeError
+ def f():
+ try:
+ {*g(), 1, 2}
+ except TypeError:
+ return True
+ return False
+ """
+ assert self.codetest(code, "f", [])
+
def test_build_tuple_unpack(self):
code = """ def f():
return (*range(4), 4)
"""
assert self.codetest(code, "f", []) == (0, 1, 2, 3, 4)
-
+
def test_build_list_unpack(self):
code = """ def f():
return [*range(4), 4]
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit