Author: Armin Rigo <ar...@tunes.org> Branch: py3.5 Changeset: r88827:d61704606472 Date: 2016-12-02 17:29 +0100 http://bitbucket.org/pypy/pypy/changeset/d61704606472/
Log: hg merge default diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst --- a/pypy/doc/whatsnew-head.rst +++ b/pypy/doc/whatsnew-head.rst @@ -5,6 +5,15 @@ .. this is a revision shortly after release-pypy2.7-v5.6 .. startrev: 7e9787939641 + +Since a while now, PyPy preserves the order of dictionaries and sets. +However, the set literal syntax ``{x, y, z}`` would by mistake build a +set with the opposite order: ``set([z, y, x])``. This has been fixed. +Note that CPython is inconsistent too: in 2.7.12, ``{5, 5.0}`` would be +``set([5.0])``, but in 2.7.trunk it is ``set([5])``. PyPy's behavior +changed in exactly the same way because of this fix. + + .. branch: mappingproxy .. branch: py3k-finish_time .. branch: py3k-kwonly-builtin diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py --- a/pypy/interpreter/pyopcode.py +++ b/pypy/interpreter/pyopcode.py @@ -1376,9 +1376,10 @@ @jit.unroll_safe def BUILD_SET(self, itemcount, next_instr): w_set = self.space.newset() - for i in range(itemcount): - w_item = self.popvalue() + for i in range(itemcount-1, -1, -1): + w_item = self.peekvalue(i) self.space.call_method(w_set, 'add', w_item) + self.popvalues(itemcount) self.pushvalue(w_set) @jit.unroll_safe diff --git a/pypy/interpreter/test/test_compiler.py b/pypy/interpreter/test/test_compiler.py --- a/pypy/interpreter/test/test_compiler.py +++ b/pypy/interpreter/test/test_compiler.py @@ -806,6 +806,8 @@ def setup_class(cls): cls.w_runappdirect = cls.space.wrap(cls.runappdirect) + cls.w_host_is_pypy = cls.space.wrap( + '__pypy__' in sys.builtin_module_names) def w_is_pypy(self): import sys @@ -952,6 +954,18 @@ else: assert False, "Expected SyntaxError" + def test_dict_and_set_literal_order(self): + x = 1 + l1 = list({1:'a', 3:'b', 2:'c', 4:'d'}) + l2 = list({1, 3, 2, 4}) + l3 = list({x:'a', 3:'b', 2:'c', 4:'d'}) + l4 = list({x, 3, 2, 4}) + if not self.host_is_pypy: + # the full test relies on the host Python providing ordered dicts + assert set(l1) == set(l2) == set(l3) == set(l4) == {1, 3, 2, 4} + else: + assert l1 == l2 == l3 == l4 == [1, 3, 2, 4] + def test_ast_equality(self): import _ast sample_code = [ diff --git a/pypy/interpreter/test/test_special.py b/pypy/interpreter/test/test_special.py --- a/pypy/interpreter/test/test_special.py +++ b/pypy/interpreter/test/test_special.py @@ -4,9 +4,11 @@ def test_Ellipsis(self): assert Ellipsis == Ellipsis assert repr(Ellipsis) == 'Ellipsis' + assert Ellipsis.__class__.__name__ == 'ellipsis' def test_NotImplemented(self): def f(): return NotImplemented assert f() == NotImplemented assert repr(NotImplemented) == 'NotImplemented' + assert NotImplemented.__class__.__name__ == 'NotImplementedType' diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py --- a/pypy/interpreter/typedef.py +++ b/pypy/interpreter/typedef.py @@ -860,13 +860,13 @@ ) assert not Cell.typedef.acceptable_as_base_class # no __new__ -Ellipsis.typedef = TypeDef("Ellipsis", +Ellipsis.typedef = TypeDef("ellipsis", __new__ = interp2app(Ellipsis.descr_new_ellipsis), __repr__ = interp2app(Ellipsis.descr__repr__), ) Ellipsis.typedef.acceptable_as_base_class = False -NotImplemented.typedef = TypeDef("NotImplemented", +NotImplemented.typedef = TypeDef("NotImplementedType", __new__ = interp2app(NotImplemented.descr_new_notimplemented), __repr__ = interp2app(NotImplemented.descr__repr__), ) diff --git a/pypy/module/micronumpy/test/test_zjit.py b/pypy/module/micronumpy/test/test_zjit.py --- a/pypy/module/micronumpy/test/test_zjit.py +++ b/pypy/module/micronumpy/test/test_zjit.py @@ -374,17 +374,7 @@ def test_sum(self): result = self.run("sum") assert result == sum(range(30)) - self.check_vectorized(1, 1) - - def define_sum(): - return """ - a = |30| - sum(a) - """ - def test_sum(self): - result = self.run("sum") - assert result == sum(range(30)) - self.check_vectorized(1, 1) + self.check_vectorized(1, 0) def define_sum_int(): return """ @@ -408,7 +398,7 @@ def test_sum_multi(self): result = self.run("sum_multi") assert result == sum(range(30)) + sum(range(60)) - self.check_vectorized(1, 1) + self.check_vectorized(1, 0) def define_sum_float_to_int16(): return """ @@ -490,7 +480,7 @@ assert retval == sum(range(1,11)) # check that we got only one loop assert len(get_stats().loops) == 1 - self.check_vectorized(2, 1) + self.check_vectorized(2, 0) def test_reduce_axis_compile_only_once(self): self.compile_graph() @@ -501,7 +491,7 @@ retval = self.interp.eval_graph(self.graph, [i]) # check that we got only one loop assert len(get_stats().loops) == 1 - self.check_vectorized(3, 1) + self.check_vectorized(3, 0) def define_prod(): return """ diff --git a/pypy/module/pypyjit/test_pypy_c/test_micronumpy.py b/pypy/module/pypyjit/test_pypy_c/test_micronumpy.py --- a/pypy/module/pypyjit/test_pypy_c/test_micronumpy.py +++ b/pypy/module/pypyjit/test_pypy_c/test_micronumpy.py @@ -76,7 +76,6 @@ arith_comb = [ ('sum','int', 1742, 1742, 1), - ('sum','float', 2581, 2581, 1), ('prod','int', 1, 3178, 1), ('any','int', 1, 2239, 1), ('any','int', 0, 4912, 0), diff --git a/rpython/jit/metainterp/optimizeopt/schedule.py b/rpython/jit/metainterp/optimizeopt/schedule.py --- a/rpython/jit/metainterp/optimizeopt/schedule.py +++ b/rpython/jit/metainterp/optimizeopt/schedule.py @@ -978,9 +978,7 @@ self.right is other.right class AccumPack(Pack): - SUPPORTED = { rop.FLOAT_ADD: '+', - rop.INT_ADD: '+', - } + SUPPORTED = { rop.INT_ADD: '+', } def __init__(self, nodes, operator, position): Pack.__init__(self, nodes) diff --git a/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py b/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py --- a/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py @@ -197,7 +197,7 @@ f13 = float_add(f12, f11) """) savings = self.savings(loop1) - assert savings == 2 + assert savings == -2 @py.test.mark.parametrize("bytes,s", [(4,0),(8,0)]) def test_sum_float_to_int(self, bytes, s): diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py b/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py --- a/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py @@ -1162,32 +1162,32 @@ vopt = self.vectorize(loop,1) self.assert_equal(loop, self.parse_loop(opt)) - def test_accumulate_basic(self): - trace = """ - [p0, i0, f0] - f1 = raw_load_f(p0, i0, descr=floatarraydescr) - f2 = float_add(f0, f1) - i1 = int_add(i0, 8) - i2 = int_lt(i1, 100) - guard_true(i2) [p0, i0, f2] - jump(p0, i1, f2) - """ - trace_opt = """ - [p0, i0, f0] - v6[0xf64] = vec_f() - v7[2xf64] = vec_float_xor(v6[0xf64], v6[0xf64]) - v2[2xf64] = vec_pack_f(v7[2xf64], f0, 0, 1) - label(p0, i0, v2[2xf64]) - i1 = int_add(i0, 16) - i2 = int_lt(i1, 100) - guard_true(i2) [p0, i0, v2[2xf64]] - v1[2xf64] = vec_load_f(p0, i0, 1, 0, descr=floatarraydescr) - v3[2xf64] = vec_float_add(v2[2xf64], v1[2xf64]) - jump(p0, i1, v3[2xf64]) - """ - loop = self.parse_loop(trace) - opt = self.vectorize(loop) - self.assert_equal(loop, self.parse_loop(trace_opt)) + #def test_accumulate_basic(self): + # trace = """ + # [p0, i0, f0] + # f1 = raw_load_f(p0, i0, descr=floatarraydescr) + # f2 = float_add(f0, f1) + # i1 = int_add(i0, 8) + # i2 = int_lt(i1, 100) + # guard_true(i2) [p0, i0, f2] + # jump(p0, i1, f2) + # """ + # trace_opt = """ + # [p0, i0, f0] + # v6[0xf64] = vec_f() + # v7[2xf64] = vec_float_xor(v6[0xf64], v6[0xf64]) + # v2[2xf64] = vec_pack_f(v7[2xf64], f0, 0, 1) + # label(p0, i0, v2[2xf64]) + # i1 = int_add(i0, 16) + # i2 = int_lt(i1, 100) + # guard_true(i2) [p0, i0, v2[2xf64]] + # v1[2xf64] = vec_load_f(p0, i0, 1, 0, descr=floatarraydescr) + # v3[2xf64] = vec_float_add(v2[2xf64], v1[2xf64]) + # jump(p0, i1, v3[2xf64]) + # """ + # loop = self.parse_loop(trace) + # opt = self.vectorize(loop) + # self.assert_equal(loop, self.parse_loop(trace_opt)) def test_element_f45_in_guard_failargs(self): trace = self.parse_loop(""" diff --git a/rpython/jit/metainterp/optimizeopt/vector.py b/rpython/jit/metainterp/optimizeopt/vector.py --- a/rpython/jit/metainterp/optimizeopt/vector.py +++ b/rpython/jit/metainterp/optimizeopt/vector.py @@ -842,7 +842,8 @@ oplist.append(vecop) opnum = rop.VEC_INT_XOR if datatype == FLOAT: - opnum = rop.VEC_FLOAT_XOR + # see PRECISION loss below + raise NotImplementedError vecop = VecOperation(opnum, [vecop, vecop], vecop, count) oplist.append(vecop) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit