Author: Armin Rigo <ar...@tunes.org> Branch: py3.5 Changeset: r87774:59503d6feb4b Date: 2016-10-14 11:43 +0200 http://bitbucket.org/pypy/pypy/changeset/59503d6feb4b/
Log: Test and fix: the order of BUILD_MAP was wrong diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py --- a/pypy/interpreter/pyopcode.py +++ b/pypy/interpreter/pyopcode.py @@ -1333,10 +1333,11 @@ @jit.unroll_safe def BUILD_MAP(self, itemcount, next_instr): w_dict = self.space.newdict() - for i in range(itemcount): - w_key = self.popvalue() - w_value = self.popvalue() + for i in range(itemcount-1, -1, -1): + w_key = self.peekvalue(2 * i) + w_value = self.peekvalue(2 * i + 1) self.space.setitem(w_dict, w_key, w_value) + self.popvalues(2 * itemcount) self.pushvalue(w_dict) @jit.unroll_safe 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 @@ -1,6 +1,7 @@ import py import sys from pypy.interpreter import gateway, module, error +from hypothesis import given, strategies class TestInterpreter: @@ -298,7 +299,31 @@ res = self.codetest(code, 'g', []) assert "TypeError:" in res assert "'tuple' object is not a mapping" in res - + + @given(strategies.lists(strategies.one_of(strategies.none(), + strategies.lists(strategies.none())))) + def test_build_map_order(self, shape): + value = [10] + def build_expr(shape): + if shape is None: + value[0] += 1 + return '0: %d' % value[0] + else: + return '**{%s}' % (', '.join( + [build_expr(shape1) for shape1 in shape]),) + + expr = build_expr(shape)[2:] + code = """ + def f(): + return %s + """ % (expr, ) + res = self.codetest(code, 'f', []) + if value[0] == 10: + expected = {} + else: + expected = {0: value[0]} + assert res == expected, "got %r for %r" % (res, expr) + def test_build_map_unpack_with_call(self): code = """ def f(a,b,c,d): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit