Author: Armin Rigo <ar...@tunes.org>
Branch: cffi-1.0
Changeset: r1772:7a5750bbb806
Date: 2015-04-19 10:45 +0200
http://bitbucket.org/cffi/cffi/changeset/7a5750bbb806/

Log:    test and fix for ffi.sizeof()

diff --git a/new/ffi_obj.c b/new/ffi_obj.c
--- a/new/ffi_obj.c
+++ b/new/ffi_obj.c
@@ -178,16 +178,25 @@
 
 static PyObject *ffi_sizeof(FFIObject *self, PyObject *arg)
 {
+    Py_ssize_t size;
     CTypeDescrObject *ct = _ffi_type(self, arg, ACCEPT_ALL);
     if (ct == NULL)
         return NULL;
 
-    if (ct->ct_size < 0) {
+    size = ct->ct_size;
+
+    if (CData_Check(arg)) {
+        CDataObject *cd = (CDataObject *)arg;
+        if (cd->c_type->ct_flags & CT_ARRAY)
+            size = get_array_length(cd) * cd->c_type->ct_itemdescr->ct_size;
+    }
+
+    if (size < 0) {
         PyErr_Format(FFIError, "don't know the size of ctype '%s'",
                      ct->ct_name);
         return NULL;
     }
-    return PyInt_FromSsize_t(ct->ct_size);
+    return PyInt_FromSsize_t(size);
 }
 
 PyDoc_STRVAR(ffi_alignof_doc,
diff --git a/new/test_ffi_obj.py b/new/test_ffi_obj.py
--- a/new/test_ffi_obj.py
+++ b/new/test_ffi_obj.py
@@ -72,3 +72,13 @@
     assert ffi.alignof("int[]") == 4
     assert ffi.alignof("int[41]") == 4
     assert ffi.alignof("short[41]") == 2
+    assert ffi.alignof(ffi.new("int[41]")) == 4
+    assert ffi.alignof(ffi.new("int[]", 41)) == 4
+
+def test_ffi_sizeof():
+    ffi = _cffi1_backend.FFI()
+    assert ffi.sizeof("int") == 4
+    py.test.raises(ffi.error, ffi.sizeof, "int[]")
+    assert ffi.sizeof("int[41]") == 41 * 4
+    assert ffi.sizeof(ffi.new("int[41]")) == 41 * 4
+    assert ffi.sizeof(ffi.new("int[]", 41)) == 41 * 4
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to