[pypy-svn] r50365 - in pypy/branch/applevel-ctypes2/pypy/module/_ffi: . test

fijal at codespeak.net fijal at codespeak.net
Sun Jan 6 10:31:33 CET 2008


Author: fijal
Date: Sun Jan  6 10:31:31 2008
New Revision: 50365

Modified:
   pypy/branch/applevel-ctypes2/pypy/module/_ffi/__init__.py
   pypy/branch/applevel-ctypes2/pypy/module/_ffi/interp_ffi.py
   pypy/branch/applevel-ctypes2/pypy/module/_ffi/test/test__ffi.py
Log:
Add size and alignment (extremely hard english word) to _ffi interface.


Modified: pypy/branch/applevel-ctypes2/pypy/module/_ffi/__init__.py
==============================================================================
--- pypy/branch/applevel-ctypes2/pypy/module/_ffi/__init__.py	(original)
+++ pypy/branch/applevel-ctypes2/pypy/module/_ffi/__init__.py	Sun Jan  6 10:31:31 2008
@@ -16,6 +16,8 @@
         'StructureInstance'  : 'structure.W_StructureInstance',
         'ArrayInstance'      : 'array.W_ArrayInstance',
         '_get_type'          : 'interp_ffi._w_get_type',
+        'sizeof'             : 'interp_ffi.sizeof',
+        'alignment'          : 'interp_ffi.alignment',
         #'CallbackPtr'        : 'callback.W_CallbackPtr',
     }
 

Modified: pypy/branch/applevel-ctypes2/pypy/module/_ffi/interp_ffi.py
==============================================================================
--- pypy/branch/applevel-ctypes2/pypy/module/_ffi/interp_ffi.py	(original)
+++ pypy/branch/applevel-ctypes2/pypy/module/_ffi/interp_ffi.py	Sun Jan  6 10:31:31 2008
@@ -11,6 +11,7 @@
 
 from pypy.module.struct.standardfmttable import min_max_acc_method
 from pypy.module.struct.nativefmttable import native_fmttable
+from pypy.tool.sourcetools import func_with_new_name
 
 class FfiValueError(Exception):
     def __init__(self, msg):
@@ -306,3 +307,20 @@
     'FuncPtr',
     __call__ = interp2app(W_FuncPtr.call)
 )
+
+def _create_new_accessor(func_name, name):
+    def accessor(space, tp_letter):
+        if len(tp_letter) != 1:
+            raise OperationError(space.w_ValueError, space.wrap(
+                "Expecting string of length one"))
+        tp_letter = tp_letter[0] # fool annotator
+        try:
+            return space.wrap(getattr(TYPEMAP[tp_letter], name))
+        except KeyError:
+            raise OperationError(space.w_ValueError, space.wrap(
+                "Unknown type specification %s" % tp_letter))
+    accessor.unwrap_spec = [ObjSpace, str]
+    return func_with_new_name(accessor, func_name)
+
+sizeof = _create_new_accessor('sizeof', 'c_size')
+alignment = _create_new_accessor('alignment', 'c_alignment')

Modified: pypy/branch/applevel-ctypes2/pypy/module/_ffi/test/test__ffi.py
==============================================================================
--- pypy/branch/applevel-ctypes2/pypy/module/_ffi/test/test__ffi.py	(original)
+++ pypy/branch/applevel-ctypes2/pypy/module/_ffi/test/test__ffi.py	Sun Jan  6 10:31:31 2008
@@ -1,7 +1,9 @@
 
 
 from pypy.conftest import gettestobjspace
-from pypy.translator.tool.cbuild import compile_c_module, ExternalCompilationInfo
+from pypy.translator.tool.cbuild import compile_c_module, \
+     ExternalCompilationInfo
+from pypy.module._ffi.interp_ffi import TYPEMAP
 
 import os, sys, py
 
@@ -97,6 +99,8 @@
         space = gettestobjspace(usemodules=('_ffi','struct'))
         cls.space = space
         cls.w_lib_name = space.wrap(cls.prepare_c_example())
+        cls.w_sizes_and_alignments = space.wrap(dict(
+            [(k, (v.c_size, v.c_alignment)) for k,v in TYPEMAP.iteritems()]))
 
     def test_libload(self):
         import _ffi
@@ -313,3 +317,10 @@
         assert x.value1 == 3
         raises(AttributeError, "x.foo")
         raises(AttributeError, "x.foo = 1")
+
+    def test_sizes_and_alignments(self):
+        import _ffi
+        for k, (s, a) in self.sizes_and_alignments.iteritems():
+            assert _ffi.sizeof(k) == s
+            assert _ffi.alignment(k) == a
+


More information about the pypy-svn mailing list