[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