Author: Matti Picus <[email protected]>
Branch: issue2444
Changeset: r89240:50865558868e
Date: 2016-12-26 22:24 +0200
http://bitbucket.org/pypy/pypy/changeset/50865558868e/

Log:    test, fix for issue 2453

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
@@ -76,7 +76,11 @@
     try:
         view.c_buf = rffi.cast(rffi.VOIDP, buf.get_raw_address())
     except ValueError:
-        raise BufferError("could not create buffer from object")
+        if not space.isinstance_w(w_obj, space.w_str):
+            # XXX Python 3?
+            raise BufferError("could not create buffer from object")
+        view.c_buf = rffi.cast(rffi.VOIDP, rffi.str2charp(space.str_w(w_obj), 
track_allocation=False))
+        rffi.setintfield(view, 'c_readonly', 1)
     ret = fill_Py_buffer(space, buf, view)
     view.c_obj = make_ref(space, w_obj)
     return ret
@@ -99,13 +103,11 @@
         view.c_buf = rffi.cast(rffi.VOIDP, w_obj.buf.get_raw_address())
         #view.c_obj = make_ref(space, w_obj) # NO - this creates a ref cycle!
         rffi.setintfield(view, 'c_readonly', w_obj.buf.readonly)
-        isstr = False
     except ValueError:
         w_s = w_obj.descr_tobytes(space)
         view.c_obj = make_ref(space, w_s)
         view.c_buf = rffi.cast(rffi.VOIDP, rffi.str2charp(space.str_w(w_s), 
track_allocation=False))
         rffi.setintfield(view, 'c_readonly', 1)
-        isstr = True
     return view
 
 def fill_Py_buffer(space, buf, view):
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
@@ -57,7 +57,7 @@
                 PyObject* obj = PyTuple_GetItem(args, 0);
                 long ret, vlen;
                 memset(&view, 0, sizeof(Py_buffer));
-                ret = PyObject_GetBuffer(obj, &view, PyBUF_FULL);
+                ret = PyObject_GetBuffer(obj, &view, PyBUF_FULL_RO);
                 if (ret != 0)
                     return NULL;
                 vlen = view.len / view.itemsize;
@@ -79,6 +79,8 @@
         arr = module.PyMyArray(10)
         ten = foo.get_len(arr)
         assert ten == 10
+        ten = foo.get_len('1234567890')
+        assert ten == 10
         ten = foo.test_buffer(arr)
         assert ten == 10
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to