Author: Richard Plangger <[email protected]>
Branch: strbuf-as-buffer
Changeset: r89267:6381bf44e70c
Date: 2016-12-29 16:34 +0100
http://bitbucket.org/pypy/pypy/changeset/6381bf44e70c/

Log:    revert last commit, handle it different in _ctypes

diff --git a/lib_pypy/_ctypes/basics.py b/lib_pypy/_ctypes/basics.py
--- a/lib_pypy/_ctypes/basics.py
+++ b/lib_pypy/_ctypes/basics.py
@@ -84,10 +84,18 @@
         return self.from_address(dll._handle.getaddressindll(name))
 
     def from_buffer(self, obj, offset=0):
+        from array import array
         size = self._sizeofinstances()
-        buf = buffer(obj, offset, size)
-        if buf._pypy_is_readonly():
-            raise TypeError("Cannot use %s as modifiable buffer" % 
str(type(obj)))
+        if isinstance(obj, array):
+            # hack, buffer(array.array) will always return a readonly buffer.
+            # CPython calls PyObject_AsWriteBuffer(...) here!
+            # array.array does not implement the buffer interface so we cannot
+            # use memoryview here (neither on CPython)!
+            buf = buffer(obj, offset, size)
+        else:
+            buf = memoryview(obj)[offset:]
+            if buf.readonly:
+                raise TypeError("Cannot use %s as modifiable buffer" % 
str(type(obj)))
         if len(buf) < size:
             raise ValueError(
                 "Buffer size too small (%d instead of at least %d bytes)"
diff --git a/pypy/objspace/std/bufferobject.py 
b/pypy/objspace/std/bufferobject.py
--- a/pypy/objspace/std/bufferobject.py
+++ b/pypy/objspace/std/bufferobject.py
@@ -138,11 +138,6 @@
             raise OperationError(space.w_ValueError, space.wrap(msg))
         return space.wrap(rffi.cast(lltype.Signed, ptr))
 
-    def descr_is_readonly(self, space):
-        """ Needed in ctypes (from_buffer), CPython can check if a
-            buffer can be readonly (has a C Function/Macro for that) """
-        return space.newbool(bool(self.buf.readonly))
-
 W_Buffer.typedef = TypeDef(
     "buffer", None, None, "read-write",
     __doc__ = """\
@@ -171,6 +166,5 @@
     __repr__ = interp2app(W_Buffer.descr_repr),
     __buffer__ = interp2app(W_Buffer.descr_getbuffer),
     _pypy_raw_address = interp2app(W_Buffer.descr_pypy_raw_address),
-    _pypy_is_readonly = interp2app(W_Buffer.descr_is_readonly),
 )
 W_Buffer.typedef.acceptable_as_base_class = False
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to