Author: Armin Rigo <[email protected]>
Branch: cffi-1.0
Changeset: r77245:9766055c7144
Date: 2015-05-09 12:21 +0200
http://bitbucket.org/pypy/pypy/changeset/9766055c7144/

Log:    ffi.buffer()

diff --git a/pypy/module/_cffi_backend/ffi_obj.py 
b/pypy/module/_cffi_backend/ffi_obj.py
--- a/pypy/module/_cffi_backend/ffi_obj.py
+++ b/pypy/module/_cffi_backend/ffi_obj.py
@@ -7,7 +7,7 @@
 
 from pypy.module._cffi_backend import parse_c_type, realize_c_type
 from pypy.module._cffi_backend import newtype, cerrno, ccallback, ctypearray
-from pypy.module._cffi_backend import ctypestruct, ctypeptr, handle
+from pypy.module._cffi_backend import ctypestruct, ctypeptr, handle, cbuffer
 from pypy.module._cffi_backend.ctypeobj import W_CType
 from pypy.module._cffi_backend.cdataobj import W_CData
 
@@ -168,6 +168,22 @@
         return self.space.wrap(align)
 
 
+    @unwrap_spec(w_cdata=W_CData, size=int)
+    def descr_buffer(self, w_cdata, size=-1):
+        """\
+Return a read-write buffer object that references the raw C data
+ointed to by the given 'cdata'.  The 'cdata' must be a pointer or an
+array.  Can be passed to functions expecting a buffer, or directly
+manipulated with:
+
+    buf[:]          get a copy of it in a regular string, or
+    buf[idx]        as a single character
+    buf[:] = ...
+    buf[idx] = ...  change the content"""
+        #
+        return cbuffer.buffer(self.space, w_cdata, size)
+
+
     @unwrap_spec(w_python_callable=WrappedDefault(None),
                  w_error=WrappedDefault(None))
     def descr_callback(self, w_cdecl, w_python_callable, w_error):
@@ -380,10 +396,14 @@
                                      cls=W_FFIObject),
         addressof   = interp2app(W_FFIObject.descr_addressof),
         alignof     = interp2app(W_FFIObject.descr_alignof),
+        buffer      = interp2app(W_FFIObject.descr_buffer),
         callback    = interp2app(W_FFIObject.descr_callback),
         cast        = interp2app(W_FFIObject.descr_cast),
+        #from_buffer = interp2app(W_FFIObject.descr_from_buffer),
         from_handle = interp2app(W_FFIObject.descr_from_handle),
+        #gc          = interp2app(W_FFIObject.descr_gc),
         getctype    = interp2app(W_FFIObject.descr_getctype),
+        #getwinerror = interp2app(W_FFIObject.descr_getwinerror),
         new         = interp2app(W_FFIObject.descr_new),
         new_handle  = interp2app(W_FFIObject.descr_new_handle),
         offsetof    = interp2app(W_FFIObject.descr_offsetof),
diff --git a/pypy/module/_cffi_backend/test/test_ffi_obj.py 
b/pypy/module/_cffi_backend/test/test_ffi_obj.py
--- a/pypy/module/_cffi_backend/test/test_ffi_obj.py
+++ b/pypy/module/_cffi_backend/test/test_ffi_obj.py
@@ -181,3 +181,9 @@
         assert str(e.value) == ("undefined struct/union name\n"
                                 "struct never_heard_of_s\n"
                                 "       ^")
+
+    def test_ffi_buffer(self):
+        import _cffi_backend as _cffi1_backend
+        ffi = _cffi1_backend.FFI()
+        a = ffi.new("signed char[]", [5, 6, 7])
+        assert ffi.buffer(a)[:] == '\x05\x06\x07'
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to