[pypy-svn] r45123 - in pypy/dist/pypy/rpython/lltypesystem: . test
arigo at codespeak.net
arigo at codespeak.net
Mon Jul 16 13:25:36 CEST 2007
Author: arigo
Date: Mon Jul 16 13:25:36 2007
New Revision: 45123
Modified:
pypy/dist/pypy/rpython/lltypesystem/ll2ctypes.py
pypy/dist/pypy/rpython/lltypesystem/rffi.py
pypy/dist/pypy/rpython/lltypesystem/rfficache.py
pypy/dist/pypy/rpython/lltypesystem/test/test_ll2ctypes.py
pypy/dist/pypy/rpython/lltypesystem/test/test_rfficache.py
Log:
A bunch of small fixes:
- turn uninitialized fields from the ll world into 0xDD bytes
in the ctypes world, instead of 0x00 ones, for debugging
- char type clarification: now rffi.CHAR == lltype.Char;
rffi.SIGNEDCHAR and rffi.UCHAR are small integer types.
- support all the rffi.XXX primitive types in ll2ctypes.
- bug fix: size_t was considered to be signed.
Modified: pypy/dist/pypy/rpython/lltypesystem/ll2ctypes.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/ll2ctypes.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/ll2ctypes.py Mon Jul 16 13:25:36 2007
@@ -11,12 +11,27 @@
return fixid(ctypes.addressof(obj))
-_ctypes_cache = {
- lltype.Signed: ctypes.c_long,
- lltype.Unsigned: ctypes.c_ulong,
- lltype.Char: ctypes.c_ubyte,
- lltype.Float: ctypes.c_double,
- }
+_ctypes_cache = {}
+
+def _setup_ctypes_cache():
+ from pypy.rpython.lltypesystem import rffi
+ _ctypes_cache.update({
+ lltype.Signed: ctypes.c_long,
+ lltype.Unsigned: ctypes.c_ulong,
+ lltype.Char: ctypes.c_ubyte,
+ rffi.DOUBLE: ctypes.c_double,
+ rffi.SIGNEDCHAR: ctypes.c_byte,
+ rffi.UCHAR: ctypes.c_ubyte,
+ rffi.SHORT: ctypes.c_short,
+ rffi.USHORT: ctypes.c_ushort,
+ rffi.INT: ctypes.c_int,
+ rffi.UINT: ctypes.c_uint,
+ rffi.LONG: ctypes.c_long,
+ rffi.ULONG: ctypes.c_ulong,
+ rffi.LONGLONG: ctypes.c_longlong,
+ rffi.ULONGLONG: ctypes.c_ulonglong,
+ rffi.SIZE_T: ctypes.c_size_t,
+ })
def build_ctypes_struct(S, max_n=None):
fields = []
@@ -135,6 +150,9 @@
elif isinstance(T, lltype.Array):
cls = build_ctypes_array(T)
else:
+ _setup_ctypes_cache()
+ if T in _ctypes_cache:
+ return _ctypes_cache[T]
raise NotImplementedError(T)
_ctypes_cache[T] = cls
return cls
@@ -147,8 +165,7 @@
container._ctypes_storage = cstruct
for field_name in STRUCT._names:
field_value = getattr(container, field_name)
- if not isinstance(field_value, lltype._uninitialized):
- setattr(cstruct, field_name, lltype2ctypes(field_value))
+ setattr(cstruct, field_name, lltype2ctypes(field_value))
remove_regular_struct_content(container)
def remove_regular_struct_content(container):
@@ -163,8 +180,7 @@
container._ctypes_storage = carray
for i in range(container.getlength()):
item_value = container.items[i] # fish fish
- if not isinstance(item_value, lltype._uninitialized):
- carray.items[i] = lltype2ctypes(item_value)
+ carray.items[i] = lltype2ctypes(item_value)
remove_regular_array_content(container)
def remove_regular_array_content(container):
@@ -196,6 +212,9 @@
'normalize' should only be False in tests, where we want to
inspect the resulting ctypes object manually.
"""
+ if isinstance(llobj, lltype._uninitialized):
+ return uninitialized2ctypes(llobj.TYPE)
+
T = lltype.typeOf(llobj)
if isinstance(T, lltype.Ptr):
container = llobj._obj
@@ -274,6 +293,20 @@
assert lltype.typeOf(llobj) == T
return llobj
+def uninitialized2ctypes(T):
+ "For debugging, create a ctypes object filled with 0xDD."
+ ctype = get_ctypes_type(T)
+ cobj = ctype()
+ size = ctypes.sizeof(cobj)
+ p = ctypes.cast(ctypes.pointer(cobj),
+ ctypes.POINTER(ctypes.c_ubyte * size))
+ for i in range(size):
+ p.contents[i] = 0xDD
+ if isinstance(T, lltype.Primitive):
+ return cobj.value
+ else:
+ return cobj
+
# __________ the standard C library __________
if sys.platform == 'win32':
Modified: pypy/dist/pypy/rpython/lltypesystem/rffi.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/rffi.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/rffi.py Mon Jul 16 13:25:36 2007
@@ -41,7 +41,7 @@
name = 'u' + name[9:]
signed = False
else:
- signed = True
+ signed = (name != 'size_t')
name = name.replace(' ', '')
llname = name.upper()
inttype = rarithmetic.build_int('r_' + name, signed, bits)
@@ -53,7 +53,7 @@
# --------------------------------------------------------------------
# Type RPython integer class doing wrap-around
# --------------------------------------------------------------------
-# CHAR r_char
+# SIGNEDCHAR r_signedchar
# UCHAR r_uchar
# SHORT r_short
# USHORT r_ushort
@@ -82,6 +82,10 @@
c_errno = CConstant('errno', lltype.Signed)
+# char, represented as a Python character
+# (use SIGNEDCHAR or UCHAR for the small integer types)
+CHAR = lltype.Char
+
# double - XXX there is no support for the C type 'float' in the C backend yet
DOUBLE = lltype.Float
Modified: pypy/dist/pypy/rpython/lltypesystem/rfficache.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/rfficache.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/rfficache.py Mon Jul 16 13:25:36 2007
@@ -35,10 +35,11 @@
# XXX add float types as well here
TYPES = []
-for _name in 'char short int long'.split():
+for _name in 'short int long'.split():
for name in (_name, 'unsigned ' + _name):
TYPES.append(name)
-TYPES += ['long long', 'unsigned long long', 'size_t']
+TYPES += ['signed char', 'unsigned char',
+ 'long long', 'unsigned long long', 'size_t']
if os.name != 'nt':
TYPES.append('mode_t')
Modified: pypy/dist/pypy/rpython/lltypesystem/test/test_ll2ctypes.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/test/test_ll2ctypes.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/test/test_ll2ctypes.py Mon Jul 16 13:25:36 2007
@@ -4,6 +4,7 @@
from pypy.rpython.lltypesystem import lltype, rffi, llmemory
from pypy.rpython.lltypesystem.ll2ctypes import lltype2ctypes, ctypes2lltype
from pypy.rpython.lltypesystem.ll2ctypes import standard_c_lib
+from pypy.rpython.lltypesystem.ll2ctypes import uninitialized2ctypes
from pypy.rpython.annlowlevel import llhelper
@@ -276,6 +277,7 @@
rffi.free_charp(p)
def test_qsort():
+ py.test.skip("in-progress: size_t vs. Signed")
CMPFUNC = lltype.FuncType([rffi.VOIDP, rffi.VOIDP], rffi.INT)
qsort = rffi.llexternal('qsort', [rffi.VOIDP,
rffi.SIZE_T,
@@ -312,5 +314,32 @@
# def test_signal():...
+def test_uninitialized2ctypes():
+ # for now, uninitialized fields are filled with 0xDD in the ctypes data
+ def checkobj(o, size):
+ p = ctypes.cast(ctypes.c_void_p(ctypes.addressof(o)),
+ ctypes.POINTER(ctypes.c_ubyte*size))
+ for i in range(size):
+ assert p.contents[i] == 0xDD
+
+ def checkval(v, fmt):
+ res = struct.pack(fmt, v)
+ assert res == "\xDD" * len(res)
+
+ checkval(uninitialized2ctypes(rffi.CHAR), 'B')
+ checkval(uninitialized2ctypes(rffi.SHORT), 'h')
+ checkval(uninitialized2ctypes(rffi.INT), 'i')
+ checkval(uninitialized2ctypes(rffi.UINT), 'I')
+ checkval(uninitialized2ctypes(rffi.LONGLONG), 'q')
+ checkval(uninitialized2ctypes(rffi.DOUBLE), 'd')
+ checkobj(uninitialized2ctypes(rffi.INTP), ctypes.sizeof(ctypes.c_void_p))
+ checkobj(uninitialized2ctypes(rffi.CCHARP), ctypes.sizeof(ctypes.c_void_p))
+
+ S = lltype.Struct('S', ('x', lltype.Signed), ('y', lltype.Signed))
+ s = lltype.malloc(S, flavor='raw')
+ sc = lltype2ctypes(s)
+ checkval(sc.contents.x, 'l')
+ checkval(sc.contents.y, 'l')
+
def test_substructures():
py.test.skip("XXX test and implement substructures")
Modified: pypy/dist/pypy/rpython/lltypesystem/test/test_rfficache.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/test/test_rfficache.py (original)
+++ pypy/dist/pypy/rpython/lltypesystem/test/test_rfficache.py Mon Jul 16 13:25:36 2007
@@ -9,10 +9,10 @@
def test_gettypesizes():
tmpfile = udir.join("somecrappyfile.py")
- assert get_type_sizes(tmpfile)['char'] == 8
+ assert get_type_sizes(tmpfile)['signed char'] == 8
# this should not invoke a compiler
res = get_type_sizes(tmpfile, compiler_exe='xxx')
- assert res['char'] == 8
+ assert res['unsigned char'] == 8
def test_types_present():
for name in TYPES:
More information about the pypy-svn
mailing list