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

arigo pypy.commits at gmail.com
Sat Aug 27 04:17:21 EDT 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: py3.5-noninherit
Changeset: r86594:2a96f5773e56
Date: 2016-08-27 10:16 +0200
http://bitbucket.org/pypy/pypy/changeset/2a96f5773e56/

Log:	hg merge py3.5

diff --git a/pypy/objspace/std/bytearrayobject.py b/pypy/objspace/std/bytearrayobject.py
--- a/pypy/objspace/std/bytearrayobject.py
+++ b/pypy/objspace/std/bytearrayobject.py
@@ -1,5 +1,6 @@
 """The builtin bytearray implementation"""
 
+import sys
 from rpython.rlib.objectmodel import (
     import_from_mixin, newlist_hint, resizelist_hint, specialize)
 from rpython.rlib.buffer import Buffer
@@ -496,7 +497,6 @@
     return data
 
 HEXDIGITS = "0123456789abcdef"
-PY_SIZE_T_MAX = intmask(2**(rffi.sizeof(rffi.SIZE_T)*8)-1)
 
 @specialize.arg(3) # raw access
 def _array_to_hexstring(space, buf, len=0, rawaccess=False):
@@ -504,11 +504,11 @@
         length = len
     else:
         length = buf.getlength()
-    hexstring = StringBuilder(length*2)
 
-    if length > PY_SIZE_T_MAX/2:
+    if length > sys.maxint / 2:
         raise OperationError(space.w_MemoryError, space.w_None)
 
+    hexstring = StringBuilder(length*2)
     for i in range(length):
         if rawaccess:
             byte = ord(buf[i])
diff --git a/pypy/objspace/std/memoryobject.py b/pypy/objspace/std/memoryobject.py
--- a/pypy/objspace/std/memoryobject.py
+++ b/pypy/objspace/std/memoryobject.py
@@ -10,6 +10,7 @@
 from pypy.interpreter.error import OperationError, oefmt
 from pypy.interpreter.gateway import interp2app
 from pypy.interpreter.typedef import TypeDef, GetSetProperty,  make_weakref_descr
+from pypy.objspace.std.bytesobject import getbytevalue
 from pypy.module.struct.formatiterator import UnpackFormatIterator, PackFormatIterator
 
 
@@ -17,6 +18,7 @@
     """Implement the built-in 'memoryview' type as a wrapper around
     an interp-level buffer.
     """
+    _immutable_fields_ = ['format', 'itemsize']
 
     def __init__(self, buf, format='B', itemsize=1):
         assert isinstance(buf, Buffer)
@@ -62,8 +64,7 @@
 
     def as_str(self):
         buf = self.buf
-        n_bytes = buf.getlength()
-        return buf.getslice(0, n_bytes, 1, n_bytes)
+        return buf.as_str()
 
     def getlength(self):
         return self.buf.getlength() // self.itemsize
@@ -82,82 +83,68 @@
     def descr_getitem(self, space, w_index):
         self._check_released(space)
         start, stop, step, size = space.decode_index4(w_index, self.getlength())
-        itemsize = self.buf.getitemsize()
-        if itemsize > 1:
-            start *= itemsize
-            size *= itemsize
-            stop  = start + size
-            if step == 0:
-                step = 1
-            if stop > self.getlength():
-                raise oefmt(space.w_IndexError, 'index out of range')
-        if step not in (0, 1):
-            raise oefmt(space.w_NotImplementedError, "")
+        # ^^^ for a non-slice index, this returns (index, 0, 0, 1)
+        itemsize = self.itemsize
         if step == 0:  # index only
-            # TODO: this probably isn't very fast
-            buf = SubBuffer(self.buf, start, self.itemsize)
-            fmtiter = UnpackFormatIterator(space, buf)
-            fmtiter.interpret(self.format)
-            return fmtiter.result_w[0]
+            if itemsize == 1:
+                ch = self.buf.getitem(start)
+                return space.newint(ord(ch))
+            else:
+                # TODO: this probably isn't very fast
+                buf = SubBuffer(self.buf, start * itemsize, itemsize)
+                fmtiter = UnpackFormatIterator(space, buf)
+                fmtiter.interpret(self.format)
+                return fmtiter.result_w[0]
         elif step == 1:
-            buf = SubBuffer(self.buf, start, size)
-            return W_MemoryView(buf, self.format, self.itemsize)
+            buf = SubBuffer(self.buf, start * itemsize, size * itemsize)
+            return W_MemoryView(buf, self.format, itemsize)
         else:
-            buf = SubBuffer(self.buf, start, size)
-            return W_MemoryView(buf)
+            raise oefmt(space.w_NotImplementedError,
+                        "XXX extended slicing")
 
     def descr_setitem(self, space, w_index, w_obj):
         self._check_released(space)
         if self.buf.readonly:
             raise oefmt(space.w_TypeError, "cannot modify read-only memory")
         if space.isinstance_w(w_index, space.w_tuple):
-            raise oefmt(space.w_NotImplementedError, "")
+            raise oefmt(space.w_NotImplementedError, "XXX tuple setitem")
         start, stop, step, size = space.decode_index4(w_index, self.getlength())
-        itemsize = self.buf.getitemsize()
-        if itemsize > 1:
-            start *= itemsize
-            size *= itemsize
-            stop  = start + size
-            if step == 0:
-                step = 1
-            if stop > self.getlength():
-                raise oefmt(space.w_IndexError, 'index out of range')
-        if step not in (0, 1):
-            raise oefmt(space.w_NotImplementedError, "")
-        value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
-        if value.getlength() != size:
-            raise oefmt(space.w_ValueError,
-                        "cannot modify size of memoryview object")
+        itemsize = self.itemsize
         if step == 0:  # index only
-            # TODO: this probably isn't very fast
-            fmtiter = PackFormatIterator(space, [w_obj], self.itemsize)
-            try:
-                fmtiter.interpret(self.format)
-            except StructError as e:
-                raise oefmt(space.w_TypeError,
-                            "memoryview: invalid type for format '%s'",
-                            self.format)
-            self.buf.setslice(start, fmtiter.result.build())
+            if itemsize == 1:
+                ch = getbytevalue(space, w_obj)
+                self.buf.setitem(start, ch)
+            else:
+                # TODO: this probably isn't very fast
+                fmtiter = PackFormatIterator(space, [w_obj], itemsize)
+                try:
+                    fmtiter.interpret(self.format)
+                except StructError as e:
+                    raise oefmt(space.w_TypeError,
+                                "memoryview: invalid type for format '%s'",
+                                self.format)
+                self.buf.setslice(start * itemsize, fmtiter.result.build())
         elif step == 1:
             value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
             if value.getlength() != size * self.itemsize:
                 raise oefmt(space.w_ValueError,
                             "cannot modify size of memoryview object")
-            self.buf.setslice(start, value.as_str())
+            self.buf.setslice(start * itemsize, value.as_str())
         else:
-            raise oefmt(space.w_NotImplementedError, "")
+            raise oefmt(space.w_NotImplementedError,
+                        "XXX extended slicing")
 
     def descr_len(self, space):
         self._check_released(space)
-        return space.wrap(self.buf.getlength())
+        return space.wrap(self.getlength())
 
     def w_get_format(self, space):
         self._check_released(space)
-        return space.wrap(self.buf.getformat())
+        return space.wrap(self.format)
 
     def w_get_itemsize(self, space):
         self._check_released(space)
-        return space.wrap(self.buf.getitemsize())
+        return space.newint(self.itemsize)
 
     def w_get_ndim(self, space):
         self._check_released(space)
@@ -169,11 +156,11 @@
 
     def w_get_shape(self, space):
         self._check_released(space)
-        return space.newtuple([space.wrap(x) for x in self.buf.getshape()])
+        return space.newtuple([space.newint(self.getlength())])
 
     def w_get_strides(self, space):
         self._check_released(space)
-        return space.newtuple([space.wrap(x) for x in self.buf.getstrides()])
+        return space.newtuple([space.newint(self.itemsize)])
 
     def w_get_suboffsets(self, space):
         self._check_released(space)
@@ -221,7 +208,7 @@
                    "is internally %r" % (self.buf,))
             raise OperationError(space.w_ValueError, space.wrap(msg))
         return space.wrap(rffi.cast(lltype.Signed, ptr))
-    
+
     def get_native_fmtchar(self, fmt):
         from rpython.rtyper.lltypesystem import rffi
         size = -1
@@ -252,8 +239,10 @@
         return size
 
     def descr_cast(self, space, w_format, w_shape=None):
-        # XXX fixme. does not do anything near cpython (see memoryobjet.c memory_cast)
         self._check_released(space)
+        if not space.is_none(w_shape):
+            raise oefmt(space.w_NotImplementedError,
+                        "XXX cast() with a shape")
         fmt = space.str_w(w_format)
         newitemsize = self.get_native_fmtchar(fmt)
         return W_MemoryView(self.buf, fmt, newitemsize)
diff --git a/pypy/objspace/std/test/test_memoryobject.py b/pypy/objspace/std/test/test_memoryobject.py
--- a/pypy/objspace/std/test/test_memoryobject.py
+++ b/pypy/objspace/std/test/test_memoryobject.py
@@ -16,8 +16,6 @@
         w = v[1:234]
         assert isinstance(w, memoryview)
         assert len(w) == 2
-        exc = raises(NotImplementedError, "v[0:2:2]")
-        assert str(exc.value) == ""
         exc = raises(TypeError, "memoryview('foobar')")
 
     def test_rw(self):
@@ -32,8 +30,15 @@
         assert data == bytearray(eval("b'23f3fg'"))
         exc = raises(ValueError, "v[2:3] = b'spam'")
         assert str(exc.value) == "cannot modify size of memoryview object"
-        exc = raises(NotImplementedError, "v[0:2:2] = b'spam'")
-        assert str(exc.value) == ""
+
+    def test_extended_slice(self):
+        data = bytearray(b'abcefg')
+        v = memoryview(data)
+        w = v[0:2:2]      # failing for now: NotImplementedError
+        assert len(w) == 1
+        assert list(w) == [97]
+        v[::2] = b'ABC'
+        assert data == bytearray(b'AbBeCg')
 
     def test_memoryview_attrs(self):
         v = memoryview(b"a"*100)
@@ -165,3 +170,51 @@
 
     def test_hex(self):
         assert memoryview(b"abc").hex() == u'616263'
+
+    def test_memoryview_cast(self):
+        m1 = memoryview(b'abcdefgh')
+        m2 = m1.cast('I')
+        m3 = m1.cast('h')
+        assert list(m1) == [97, 98, 99, 100, 101, 102, 103, 104]
+        assert list(m2) == [1684234849, 1751606885]
+        assert list(m3) == [25185, 25699, 26213, 26727]
+        assert m1[1] == 98
+        assert m2[1] == 1751606885
+        assert m3[1] == 25699
+        assert list(m3[1:3]) == [25699, 26213]
+        assert m3[1:3].tobytes() == b'cdef'
+        assert len(m2) == 2
+        assert len(m3) == 4
+        assert (m2[-2], m2[-1]) == (1684234849, 1751606885)
+        raises(IndexError, "m2[2]")
+        raises(IndexError, "m2[-3]")
+        assert list(m3[-99:3]) == [25185, 25699, 26213]
+        assert list(m3[1:99]) == [25699, 26213, 26727]
+        raises(IndexError, "m1[8]")
+        raises(IndexError, "m1[-9]")
+        assert m1[-8] == 97
+
+    def test_memoryview_cast_extended_slicing(self):
+        m1 = memoryview(b'abcdefgh')
+        m3 = m1.cast('h')
+        assert m3[1::2].tobytes() == b'cdgh'
+        assert m3[::2].tobytes() == b'abef'
+        assert m3[:2:2].tobytes() == b'ab'
+
+    def test_memoryview_cast_setitem(self):
+        data = bytearray(b'abcdefgh')
+        m1 = memoryview(data)
+        m2 = m1.cast('I')
+        m3 = m1.cast('h')
+        m1[2] = ord(b'C')
+        assert m2[0] == 1682137697
+        m3[1] = -9999
+        assert data == bytearray(bytes([97, 98, 241, 216, 101, 102, 103, 104]))
+        m3[1:3] = memoryview(b"pqrs").cast('h')
+        assert data == bytearray(b'abpqrsgh')
+
+    def test_memoryview_cast_setitem_extended_slicing(self):
+        data = bytearray(b'abcdefghij')
+        m3 = memoryview(data).cast('h')
+        m3[1:5:2] = memoryview(b"xyXY").cast('h')
+        assert data == bytearray(b'abxyefXYij')
diff --git a/rpython/rlib/buffer.py b/rpython/rlib/buffer.py
--- a/rpython/rlib/buffer.py
+++ b/rpython/rlib/buffer.py
@@ -10,6 +10,7 @@
     _immutable_ = True
 
     def getlength(self):
+        """Returns the size in bytes (even if getitemsize() > 1)."""
         raise NotImplementedError
 
     def __len__(self):


More information about the pypy-commit mailing list