[pypy-commit] pypy py3k: merge upstream

pjenvey noreply at buildbot.pypy.org
Sun Feb 17 23:13:40 CET 2013


Author: Philip Jenvey <pjenvey at underboss.org>
Branch: py3k
Changeset: r61386:1a3dce362e2e
Date: 2013-02-17 14:09 -0800
http://bitbucket.org/pypy/pypy/changeset/1a3dce362e2e/

Log:	merge upstream

diff --git a/lib-python/3.2/ctypes/test/test_arrays.py b/lib-python/3.2/ctypes/test/test_arrays.py
--- a/lib-python/3.2/ctypes/test/test_arrays.py
+++ b/lib-python/3.2/ctypes/test/test_arrays.py
@@ -185,7 +185,7 @@
             class T(Array):
                 _type_ = c_int
                 _length_ = sys.maxsize * 2
-        with self.assertRaises(AttributeError):
+        with self.assertRaises((AttributeError, TypeError)):
             class T(Array):
                 _type_ = c_int
                 _length_ = 1.87
diff --git a/lib-python/3.2/test/test_cmd_line.py b/lib-python/3.2/test/test_cmd_line.py
--- a/lib-python/3.2/test/test_cmd_line.py
+++ b/lib-python/3.2/test/test_cmd_line.py
@@ -8,6 +8,7 @@
 import subprocess
 import tempfile
 from test.script_helper import spawn_python, kill_python, assert_python_ok, assert_python_failure
+from test.support import check_impl_detail
 
 
 # XXX (ncoghlan): Move to script_helper and make consistent with run_python
@@ -339,7 +340,8 @@
             rc, out, err = assert_python_ok('-R', '-c', code)
             self.assertEqual(rc, 0)
             hashes.append(out)
-        self.assertNotEqual(hashes[0], hashes[1])
+        if check_impl_detail(pypy=False):  # PyPy does not really implement it!
+            self.assertNotEqual(hashes[0], hashes[1])
 
         # Verify that sys.flags contains hash_randomization
         code = 'import sys; print("random is", sys.flags.hash_randomization)'
diff --git a/lib-python/3.2/test/test_functools.py b/lib-python/3.2/test/test_functools.py
--- a/lib-python/3.2/test/test_functools.py
+++ b/lib-python/3.2/test/test_functools.py
@@ -47,6 +47,8 @@
         # attributes should not be writable
         if not isinstance(self.thetype, type):
             return
+        if not support.check_impl_detail():
+            return
         self.assertRaises(AttributeError, setattr, p, 'func', map)
         self.assertRaises(AttributeError, setattr, p, 'args', (1, 2))
         self.assertRaises(AttributeError, setattr, p, 'keywords', dict(a=1, b=2))
@@ -138,6 +140,7 @@
         p = proxy(f)
         self.assertEqual(f.func, p.func)
         f = None
+        support.gc_collect()
         self.assertRaises(ReferenceError, getattr, p, 'func')
 
     def test_with_bound_and_unbound_methods(self):
@@ -203,7 +206,7 @@
                       updated=functools.WRAPPER_UPDATES):
         # Check attributes were assigned
         for name in assigned:
-            self.assertTrue(getattr(wrapper, name) is getattr(wrapped, name))
+            self.assertTrue(getattr(wrapper, name) == getattr(wrapped, name))
         # Check attributes were updated
         for name in updated:
             wrapper_attr = getattr(wrapper, name)
diff --git a/lib-python/3.2/test/test_tempfile.py b/lib-python/3.2/test/test_tempfile.py
--- a/lib-python/3.2/test/test_tempfile.py
+++ b/lib-python/3.2/test/test_tempfile.py
@@ -285,6 +285,7 @@
         dir = tempfile.mkdtemp()
         try:
             self.do_create(dir=dir).write(b"blat")
+            support.gc_collect()
         finally:
             os.rmdir(dir)
 
@@ -575,12 +576,15 @@
         self.do_create(suf="b")
         self.do_create(pre="a", suf="b")
         self.do_create(pre="aa", suf=".txt")
+        support.gc_collect()
 
     def test_many(self):
         # mktemp can choose many usable file names (stochastic)
         extant = list(range(TEST_FILES))
         for i in extant:
             extant[i] = self.do_create(pre="aa")
+        del extant
+        support.gc_collect()
 
 ##     def test_warning(self):
 ##         # mktemp issues a warning when used
@@ -1012,6 +1016,7 @@
                          "TemporaryDirectory %s exists after cleanup" % d1.name)
         self.assertTrue(os.path.exists(d2.name),
                         "Directory pointed to by a symlink was deleted")
+        support.gc_collect()
         self.assertEqual(os.listdir(d2.name), ['test.txt'],
                          "Contents of the directory pointed to by a symlink "
                          "were deleted")
diff --git a/lib_pypy/_ctypes/array.py b/lib_pypy/_ctypes/array.py
--- a/lib_pypy/_ctypes/array.py
+++ b/lib_pypy/_ctypes/array.py
@@ -8,54 +8,52 @@
 class ArrayMeta(_CDataMeta):
     def __new__(self, name, cls, typedict):
         res = type.__new__(self, name, cls, typedict)
-        if '_type_' in typedict:
-            ffiarray = _rawffi.Array(typedict['_type_']._ffishape)
-            res._ffiarray = ffiarray
-            subletter = getattr(typedict['_type_'], '_type_', None)
-            if subletter == 'c':
-                def getvalue(self):
-                    return _rawffi.charp2string(self._buffer.buffer,
-                                                self._length_)
-                def setvalue(self, val):
-                    # we don't want to have buffers here
-                    if len(val) > self._length_:
-                        raise ValueError("%r too long" % (val,))
-                    for i in range(len(val)):
-                        self[i] = val[i]
-                    if len(val) < self._length_:
-                        self[len(val)] = b'\x00'
-                res.value = property(getvalue, setvalue)
+        if cls == (_CData,): # this is the Array class defined below
+            return res
 
-                def getraw(self):
-                    return _rawffi.charp2rawstring(self._buffer.buffer,
-                                                   self._length_)
+        ffiarray = res._ffiarray = _rawffi.Array(res._type_._ffishape)
+        subletter = getattr(res._type_, '_type_', None)
+        if subletter == 'c':
+            def getvalue(self):
+                return _rawffi.charp2string(self._buffer.buffer,
+                                            self._length_)
+            def setvalue(self, val):
+                # we don't want to have buffers here
+                if len(val) > self._length_:
+                    raise ValueError("%r too long" % (val,))
+                for i in range(len(val)):
+                    self[i] = val[i]
+                if len(val) < self._length_:
+                    self[len(val)] = b'\x00'
+            res.value = property(getvalue, setvalue)
 
-                def setraw(self, buffer):
-                    if len(buffer) > self._length_:
-                        raise ValueError("%r too long" % (buffer,))
-                    for i in range(len(buffer)):
-                        self[i] = buffer[i]
-                res.raw = property(getraw, setraw)
-            elif subletter == 'u':
-                def getvalue(self):
-                    return _rawffi.wcharp2unicode(self._buffer.buffer,
-                                                  self._length_)
+            def getraw(self):
+                return _rawffi.charp2rawstring(self._buffer.buffer,
+                                               self._length_)
 
-                def setvalue(self, val):
-                    # we don't want to have buffers here
-                    if len(val) > self._length_:
-                        raise ValueError("%r too long" % (val,))
-                    for i in range(len(val)):
-                        self[i] = val[i]
-                    if len(val) < self._length_:
-                        self[len(val)] = '\x00'
-                res.value = property(getvalue, setvalue)
-                
-            if '_length_' in typedict:
-                res._ffishape = (ffiarray, typedict['_length_'])
-                res._fficompositesize = res._sizeofinstances()
-        else:
-            res._ffiarray = None
+            def setraw(self, buffer):
+                if len(buffer) > self._length_:
+                    raise ValueError("%r too long" % (buffer,))
+                for i in range(len(buffer)):
+                    self[i] = buffer[i]
+            res.raw = property(getraw, setraw)
+        elif subletter == 'u':
+            def getvalue(self):
+                return _rawffi.wcharp2unicode(self._buffer.buffer,
+                                              self._length_)
+
+            def setvalue(self, val):
+                # we don't want to have buffers here
+                if len(val) > self._length_:
+                    raise ValueError("%r too long" % (val,))
+                for i in range(len(val)):
+                    self[i] = val[i]
+                if len(val) < self._length_:
+                    self[len(val)] = '\x00'
+            res.value = property(getvalue, setvalue)
+
+        res._ffishape = (ffiarray, res._length_)
+        res._fficompositesize = res._sizeofinstances()
         return res
 
     from_address = cdata_from_address
diff --git a/lib_pypy/_ctypes/function.py b/lib_pypy/_ctypes/function.py
--- a/lib_pypy/_ctypes/function.py
+++ b/lib_pypy/_ctypes/function.py
@@ -556,7 +556,6 @@
                 try:
                     keepalive, newarg, newargtype = self._conv_param(argtype, args[i])
                 except (UnicodeError, TypeError, ValueError) as e:
-                    raise
                     raise ArgumentError(str(e))
                 keepalives.append(keepalive)
                 newargs.append(newarg)
diff --git a/lib_pypy/_functools.py b/lib_pypy/_functools.py
--- a/lib_pypy/_functools.py
+++ b/lib_pypy/_functools.py
@@ -1,7 +1,10 @@
 """ Supplies the internal functions for functools.py in the standard library """
+from __pypy__ import builtinify
+
 
 sentinel = object()
 
+ at builtinify
 def reduce(func, sequence, initial=sentinel):
     """reduce(function, sequence[, initial]) -> value
 
@@ -40,3 +43,17 @@
         if self.keywords is not None:
             fkeywords = dict(self.keywords, **fkeywords)
         return self.func(*(self.args + fargs), **fkeywords)
+
+    def __repr__(self):
+        cls = type(self)
+        if cls is partial:
+            name = 'functools.partial'
+        else:
+            name = cls.__name__
+        tmp = [repr(self.func)]
+        for arg in self.args:
+            tmp.append(repr(arg))
+        if self.keywords:
+            for k, v in self.keywords.items():
+                tmp.append("{}={!r}".format(k, v))
+        return "{}({})".format(name, ', '.join(tmp))
diff --git a/pypy/interpreter/argument.py b/pypy/interpreter/argument.py
--- a/pypy/interpreter/argument.py
+++ b/pypy/interpreter/argument.py
@@ -508,6 +508,8 @@
                 plural = "s"
             if has_kwarg or num_kwds > 0:
                 msg2 = " non-keyword"
+            elif defcount != -1: # XXX not sure about this
+                msg2 = " positional"
             else:
                 msg2 = ""
             msg = "takes %s %d%s argument%s (%d given)" % (
diff --git a/pypy/interpreter/test/test_argument.py b/pypy/interpreter/test/test_argument.py
--- a/pypy/interpreter/test/test_argument.py
+++ b/pypy/interpreter/test/test_argument.py
@@ -698,3 +698,11 @@
         assert e.value.args[0] == "f() got an unexpected keyword argument 'ü'"
         """
 
+    def test_error_positional(self):
+        """
+        def f(a, b=None, *, c=None):
+            pass
+        exc = raises(TypeError, f, 1, 2, 3)
+        expected = "f() takes at most 2 positional arguments (3 given)"
+        assert str(exc.value) == expected
+        """
diff --git a/pypy/module/_rawffi/interp_rawffi.py b/pypy/module/_rawffi/interp_rawffi.py
--- a/pypy/module/_rawffi/interp_rawffi.py
+++ b/pypy/module/_rawffi/interp_rawffi.py
@@ -55,7 +55,7 @@
     return intmask(ffi_type.c_size), intmask(ffi_type.c_alignment)
 
 LL_TYPEMAP = {
-    'c' : rffi.UCHAR,
+    'c' : rffi.CHAR,
     'u' : lltype.UniChar,
     'b' : rffi.SIGNEDCHAR,
     'B' : rffi.UCHAR,
@@ -334,7 +334,14 @@
         push_func(add_arg, argdesc, rffi.cast(rffi.LONGDOUBLE,
                                               space.float_w(w_arg)))
     elif letter == "c":
-        val = getbytevalue(space, w_arg)
+        if space.isinstance_w(w_arg, space.w_int):
+            val = getbytevalue(space, w_arg)
+        else:
+            s = space.str_w(w_arg)
+            if len(s) != 1:
+                raise OperationError(space.w_TypeError, w(
+                    "Expected string of length one as character"))
+            val = s[0]
         push_func(add_arg, argdesc, val)
     elif letter == 'u':
         s = space.unicode_w(w_arg)
@@ -363,7 +370,9 @@
             if c in TYPEMAP_PTR_LETTERS:
                 res = func(add_arg, argdesc, rffi.VOIDP)
                 return space.wrap(rffi.cast(lltype.Unsigned, res))
-            elif c == 'q' or c == 'Q' or c == 'L' or c == 'c' or c == 'u':
+            elif c == 'c':
+                return space.wrapbytes(func(add_arg, argdesc, ll_type))
+            elif c == 'q' or c == 'Q' or c == 'L' or c == 'u':
                 return space.wrap(func(add_arg, argdesc, ll_type))
             elif c == 'f' or c == 'd' or c == 'g':
                 return space.wrap(float(func(add_arg, argdesc, ll_type)))
diff --git a/pypy/module/_rawffi/test/test__rawffi.py b/pypy/module/_rawffi/test/test__rawffi.py
--- a/pypy/module/_rawffi/test/test__rawffi.py
+++ b/pypy/module/_rawffi/test/test__rawffi.py
@@ -260,7 +260,6 @@
         assert lib.ptr(1, [], 'i')()[0] == 42
 
     def test_getchar(self):
-        py3k_skip('bytes vs unicode')
         import _rawffi
         lib = _rawffi.CDLL(self.lib_name)
         get_char = lib.ptr('get_char', ['P', 'H'], 'c')
@@ -272,7 +271,8 @@
             intptr = B(1)
             intptr[0] = i
             res = get_char(dupaptr, intptr)
-            assert res[0] == 'dupa'[i:i+1]
+            char = b'dupa'[i:i+1]
+            assert res[0] == char
             intptr.free()
         dupaptr.free()
         dupa.free()
@@ -282,14 +282,13 @@
         import _rawffi
         A = _rawffi.Array('c')
         buf = A(10, autofree=True)
-        buf[0] = ord('*')
+        buf[0] = b'*'
         assert buf[1:5] == b'\x00' * 4
         buf[7:] = b'abc'
-        assert buf[9] == ord('c')
+        assert buf[9] == b'c'
         assert buf[:8] == b'*' + b'\x00'*6 + b'a'
 
     def test_returning_str(self):
-        py3k_skip('bytes vs unicode')
         import _rawffi
         lib = _rawffi.CDLL(self.lib_name)
         char_check = lib.ptr('char_check', ['c', 'c'], 's')
@@ -450,13 +449,13 @@
         X = _rawffi.Structure([('x1', 'i'), ('x2', 'h'), ('x3', 'c'), ('next', 'P')])
         next = X()
         next.next = 0
-        next.x3 = ord('x')
+        next.x3 = b'x'
         x = X()
         x.next = next
         x.x1 = 1
         x.x2 = 2
-        x.x3 = ord('x')
-        assert X.fromaddress(x.next).x3 == ord('x')
+        x.x3 = b'x'
+        assert X.fromaddress(x.next).x3 == b'x'
         x.free()
         next.free()
         create_double_struct = lib.ptr("create_double_struct", [], 'P')
@@ -997,15 +996,15 @@
 
         A = _rawffi.Array('c')
         a = A(10, autofree=True)
-        a[3] = ord('x')
+        a[3] = b'x'
         b = memoryview(a)
         assert len(b) == 10
         assert b[3] == b'x'
         b[6] = b'y'
-        assert a[6] == ord('y')
+        assert a[6] == b'y'
         b[3:5] = b'zt'
-        assert a[3] == ord('z')
-        assert a[4] == ord('t')
+        assert a[3] == b'z'
+        assert a[4] == b't'
 
     def test_union(self):
         import _rawffi
@@ -1025,6 +1024,18 @@
         S2E = _rawffi.Structure([('bah', (EMPTY, 1))])
         S2E.get_ffi_type()     # does not hang
 
+    def test_char_array_int(self):
+        import _rawffi
+        A = _rawffi.Array('c')
+        a = A(1)
+        a[0] = b'a'
+        assert a[0] == b'a'
+        # also accept int but return bytestring
+        a[0] = 100
+        assert a[0] == b'd'
+        a.free()
+
+
 class AppTestAutoFree:
     spaceconfig = dict(usemodules=['_rawffi', 'struct'])
     
diff --git a/pypy/module/_rawffi/test/test_nested.py b/pypy/module/_rawffi/test/test_nested.py
--- a/pypy/module/_rawffi/test/test_nested.py
+++ b/pypy/module/_rawffi/test/test_nested.py
@@ -43,14 +43,14 @@
         assert S.fieldoffset('x') == 0
         assert S.fieldoffset('s1') == S1.alignment
         s = S()
-        s.x = ord('G')
+        s.x = b'G'
         raises(TypeError, 's.s1')
         assert s.fieldaddress('s1') == s.buffer + S.fieldoffset('s1')
         s1 = S1.fromaddress(s.fieldaddress('s1'))
-        s1.c = ord('H')
+        s1.c = b'H'
         rawbuf = _rawffi.Array('c').fromaddress(s.buffer, S.size)
-        assert rawbuf[0] == ord('G')
-        assert rawbuf[S1.alignment + S1.fieldoffset('c')] == ord('H')
+        assert rawbuf[0] == b'G'
+        assert rawbuf[S1.alignment + S1.fieldoffset('c')] == b'H'
         s.free()
 
     def test_array_of_structures(self):
@@ -60,17 +60,17 @@
         a = A(3)
         raises(TypeError, "a[0]")
         s0 = S.fromaddress(a.buffer)
-        s0.c = ord('B')
+        s0.c = b'B'
         assert a.itemaddress(1) == a.buffer + S.size
         s1 = S.fromaddress(a.itemaddress(1))
-        s1.c = ord('A')
+        s1.c = b'A'
         s2 = S.fromaddress(a.itemaddress(2))
-        s2.c = ord('Z')
+        s2.c = b'Z'
         rawbuf = _rawffi.Array('c').fromaddress(a.buffer, S.size * len(a))
         ofs = S.fieldoffset('c')
-        assert rawbuf[0*S.size+ofs] == ord('B')
-        assert rawbuf[1*S.size+ofs] == ord('A')
-        assert rawbuf[2*S.size+ofs] == ord('Z')
+        assert rawbuf[0*S.size+ofs] == b'B'
+        assert rawbuf[1*S.size+ofs] == b'A'
+        assert rawbuf[2*S.size+ofs] == b'Z'
         a.free()
 
     def test_array_of_array(self):
@@ -103,16 +103,16 @@
         assert S.fieldoffset('x') == 0
         assert S.fieldoffset('ar') == A5alignment
         s = S()
-        s.x = ord('G')
+        s.x = b'G'
         raises(TypeError, 's.ar')
         assert s.fieldaddress('ar') == s.buffer + S.fieldoffset('ar')
         a1 = A.fromaddress(s.fieldaddress('ar'), 5)
         a1[4] = 33
         rawbuf = _rawffi.Array('c').fromaddress(s.buffer, S.size)
-        assert rawbuf[0] == ord('G')
+        assert rawbuf[0] == b'G'
         sizeofint = struct.calcsize("i")
         v = 0
         for i in range(sizeofint):
-            v += rawbuf[A5alignment + sizeofint*4+i]
+            v += ord(rawbuf[A5alignment + sizeofint*4+i])
         assert v == 33
         s.free()
diff --git a/pypy/objspace/std/floatobject.py b/pypy/objspace/std/floatobject.py
--- a/pypy/objspace/std/floatobject.py
+++ b/pypy/objspace/std/floatobject.py
@@ -166,7 +166,7 @@
     return space.wrap(float2string(w_float.floatval, 'r', 0))
 
 def str__Float(space, w_float):
-    return space.wrap(float2string(w_float.floatval, 'g', DTSF_STR_PRECISION))
+    return space.wrap(float2string(w_float.floatval, 'r', 0))
 
 def format__Float_ANY(space, w_float, w_spec):
     return newformat.run_formatter(space, w_spec, "format_float", w_float)
diff --git a/pypy/objspace/std/longtype.py b/pypy/objspace/std/longtype.py
--- a/pypy/objspace/std/longtype.py
+++ b/pypy/objspace/std/longtype.py
@@ -48,7 +48,12 @@
             bigint = space.bigint_w(w_obj)
             return newbigint(space, w_longtype, bigint)
     else:
-        base = space.int_w(w_base)
+        try:
+            base = space.int_w(w_base)
+        except OperationError, e:
+            if not e.match(space, space.w_OverflowError):
+                raise
+            base = 37 # this raises the right error in string_to_bigint()
 
         if space.isinstance_w(w_value, space.w_unicode):
             from pypy.objspace.std.unicodeobject import unicode_to_decimal_w
diff --git a/pypy/objspace/std/test/test_floatobject.py b/pypy/objspace/std/test/test_floatobject.py
--- a/pypy/objspace/std/test/test_floatobject.py
+++ b/pypy/objspace/std/test/test_floatobject.py
@@ -837,3 +837,6 @@
         check(mod(0.0, -1.0), -0.0)
         check(mod(1e-100, -1.0), -1.0)
         check(mod(1.0, -1.0), -0.0)
+
+    def test_repr_str_eq(self):
+        assert repr(19 * 0.1) == str(19 * 0.1)
diff --git a/pypy/objspace/std/test/test_longobject.py b/pypy/objspace/std/test/test_longobject.py
--- a/pypy/objspace/std/test/test_longobject.py
+++ b/pypy/objspace/std/test/test_longobject.py
@@ -340,3 +340,6 @@
             assert 'hello àèìò' in e.message
         else:
             assert False, 'did not raise'
+
+    def test_base_overflow(self):
+        raises(ValueError, int, '42', 2**63)


More information about the pypy-commit mailing list