Author: Armin Rigo <ar...@tunes.org>
Branch: ffi-backend
Changeset: r55969:ec27cf4e431c
Date: 2012-07-07 17:48 +0200
http://bitbucket.org/pypy/pypy/changeset/ec27cf4e431c/

Log:    Test and fix

diff --git a/pypy/module/_cffi_backend/cbuffer.py 
b/pypy/module/_cffi_backend/cbuffer.py
--- a/pypy/module/_cffi_backend/cbuffer.py
+++ b/pypy/module/_cffi_backend/cbuffer.py
@@ -2,7 +2,7 @@
 from pypy.interpreter.buffer import RWBuffer
 from pypy.interpreter.gateway import unwrap_spec
 from pypy.rpython.lltypesystem import rffi
-from pypy.module._cffi_backend import cdataobj, ctypeptr
+from pypy.module._cffi_backend import cdataobj, ctypeptr, ctypearray
 
 
 class LLBuffer(RWBuffer):
@@ -36,14 +36,19 @@
 
 @unwrap_spec(cdata=cdataobj.W_CData, size=int)
 def buffer(space, cdata, size=-1):
-    if not isinstance(cdata.ctype, ctypeptr.W_CTypePtrOrArray):
+    ctype = cdata.ctype
+    if isinstance(ctype, ctypeptr.W_CTypePointer):
+        if size < 0:
+            size = ctype.ctitem.size
+    elif isinstance(ctype, ctypearray.W_CTypeArray):
+        if size < 0:
+            size = cdata._sizeof()
+    else:
         raise operationerrfmt(space.w_TypeError,
                               "expected a pointer or array cdata, got '%s'",
-                              cdata.ctype.name)
+                              ctype.name)
     if size < 0:
-        size = cdata._sizeof()
-        if size < 0:
-            raise operationerrfmt(space.w_TypeError,
-                                  "don't know the size pointed to by '%s'",
-                                  cdata.ctype.name)
+        raise operationerrfmt(space.w_TypeError,
+                              "don't know the size pointed to by '%s'",
+                              ctype.name)
     return space.wrap(LLBuffer(cdata._cdata, size))
diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py 
b/pypy/module/_cffi_backend/test/_backend_test_c.py
--- a/pypy/module/_cffi_backend/test/_backend_test_c.py
+++ b/pypy/module/_cffi_backend/test/_backend_test_c.py
@@ -1348,6 +1348,12 @@
     assert (p < s) ^ (p > s)
 
 def test_buffer():
+    BShort = new_primitive_type("short")
+    s = newp(new_pointer_type(BShort), 100)
+    assert sizeof(s) == size_of_ptr()
+    assert sizeof(BShort) == 2
+    assert len(str(buffer(s))) == 2
+    #
     BChar = new_primitive_type("char")
     BCharArray = new_array_type(new_pointer_type(BChar), None)
     c = newp(BCharArray, "hi there")
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to