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