Author: Matti Picus <[email protected]>
Branch: buffer-interface
Changeset: r86880:da7d464c1703
Date: 2016-09-05 16:54 +0300
http://bitbucket.org/pypy/pypy/changeset/da7d464c1703/

Log:    use tobytes if get_raw_address fails, for StringBuffer type buffers

diff --git a/pypy/module/cpyext/memoryobject.py 
b/pypy/module/cpyext/memoryobject.py
--- a/pypy/module/cpyext/memoryobject.py
+++ b/pypy/module/cpyext/memoryobject.py
@@ -26,13 +26,17 @@
         return view
     try:
         view.c_buf = rffi.cast(rffi.VOIDP, w_obj.buf.get_raw_address())
+        view.c_obj = as_pyobj(space, w_obj)
+        rffi.setintfield(view, 'c_readonly', w_obj.buf.readonly)
+        isstr = False
     except ValueError:
-        return view
+        w_s = w_obj.descr_tobytes(space)
+        view.c_obj = as_pyobj(space, w_s)
+        rffi.setintfield(view, 'c_readonly', 1)
+        isstr = True
     view.c_len = w_obj.getlength()
-    view.c_obj = as_pyobj(space, w_obj)
     incref(space, view.c_obj)
     view.c_itemsize = w_obj.buf.getitemsize()
-    rffi.setintfield(view, 'c_readonly', w_obj.buf.readonly)
     ndim = w_obj.buf.getndim()
     rffi.setintfield(view, 'c_ndim', ndim)
     view.c_format = rffi.str2charp(w_obj.buf.getformat())
diff --git a/pypy/module/cpyext/test/test_memoryobject.py 
b/pypy/module/cpyext/test/test_memoryobject.py
--- a/pypy/module/cpyext/test/test_memoryobject.py
+++ b/pypy/module/cpyext/test/test_memoryobject.py
@@ -1,6 +1,6 @@
 from pypy.module.cpyext.test.test_api import BaseApiTest
 from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
-
+from rpython.rlib.buffer import StringBuffer
 
 class TestMemoryViewObject(BaseApiTest):
     def test_fromobject(self, space, api):
@@ -12,6 +12,12 @@
         w_bytes = space.call_method(w_view, "tobytes")
         assert space.unwrap(w_bytes) == "hello"
 
+    def test_frombuffer(self, space, api):
+        w_buf = space.newbuffer(StringBuffer("hello"))
+        w_memoryview = api.PyMemoryView_FromObject(w_buf)
+        w_view = api.PyMemoryView_GET_BUFFER(w_memoryview)
+        ndim = w_view.c_ndim
+        assert ndim == 1
 
 class AppTestBufferProtocol(AppTestCpythonExtensionBase):
     def test_buffer_protocol(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to