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