[pypy-commit] pypy py3.5: hg merge default

arigo pypy.commits at gmail.com
Fri Dec 2 11:35:05 EST 2016


Author: Armin Rigo <arigo at 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)


More information about the pypy-commit mailing list