[pypy-svn] r46937 - in pypy/dist/pypy/rpython/lltypesystem: . test

arigo at codespeak.net arigo at codespeak.net
Thu Sep 27 11:48:35 CEST 2007


Author: arigo
Date: Thu Sep 27 11:48:35 2007
New Revision: 46937

Modified:
   pypy/dist/pypy/rpython/lltypesystem/ll2ctypes.py
   pypy/dist/pypy/rpython/lltypesystem/rffi.py
   pypy/dist/pypy/rpython/lltypesystem/test/test_ll2ctypes.py
Log:
More singlefloat support in rffi and ll2ctypes.


Modified: pypy/dist/pypy/rpython/lltypesystem/ll2ctypes.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/ll2ctypes.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/ll2ctypes.py	Thu Sep 27 11:48:35 2007
@@ -12,7 +12,7 @@
 from pypy.rlib.objectmodel import Symbolic
 from pypy.tool.uid import fixid
 from pypy.tool.tls import tlsobject
-from pypy.rlib.rarithmetic import r_uint
+from pypy.rlib.rarithmetic import r_uint, r_singlefloat
 from pypy.annotation import model as annmodel
 from pypy.rpython.rbuiltin import gen_cast
 
@@ -30,6 +30,7 @@
         lltype.Unsigned: ctypes.c_ulong,
         lltype.Char:     ctypes.c_ubyte,
         rffi.DOUBLE:     ctypes.c_double,
+        rffi.FLOAT:      ctypes.c_float,
         rffi.SIGNEDCHAR: ctypes.c_byte,
         rffi.UCHAR:      ctypes.c_ubyte,
         rffi.SHORT:      ctypes.c_short,
@@ -428,6 +429,9 @@
     if T is lltype.Char:
         return ord(llobj)
 
+    if T is lltype.SingleFloat:
+        return ctypes.c_float(float(llobj))
+
     return llobj
 
 def ctypes2lltype(T, cobj):
@@ -459,7 +463,11 @@
         llobj = lltype._ptr(T, container, solid=True)
     elif T is lltype.Char:
         llobj = chr(cobj)
-    elif T is not lltype.Signed:
+    elif T is lltype.Signed:
+        llobj = cobj
+    elif T is lltype.SingleFloat:
+        llobj = r_singlefloat(cobj.value)
+    else:
         from pypy.rpython.lltypesystem import rffi
         try:
             inttype = rffi.platform.numbertype_to_rclass[T]
@@ -467,8 +475,6 @@
             llobj = cobj
         else:
             llobj = inttype(cobj)
-    else:
-        llobj = cobj
 
     assert lltype.typeOf(llobj) == T
     return llobj

Modified: pypy/dist/pypy/rpython/lltypesystem/rffi.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypesystem/rffi.py	(original)
+++ pypy/dist/pypy/rpython/lltypesystem/rffi.py	Thu Sep 27 11:48:35 2007
@@ -260,6 +260,7 @@
 # float - corresponds to pypy.rlib.rarithmetic.r_float, and supports no
 #         operation except rffi.cast() between FLOAT and DOUBLE
 FLOAT = lltype.SingleFloat
+r_singlefloat = rarithmetic.r_singlefloat
 
 # void *   - for now, represented as char *
 VOIDP = lltype.Ptr(lltype.Array(lltype.Char, hints={'nolength': True}))
@@ -273,6 +274,9 @@
 # double *
 DOUBLEP = lltype.Ptr(lltype.Array(DOUBLE, hints={'nolength': True}))
 
+# float *
+FLOATP = lltype.Ptr(lltype.Array(FLOAT, hints={'nolength': True}))
+
 # various type mapping
 # str -> char*
 def str2charp(s):

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	Thu Sep 27 11:48:35 2007
@@ -23,6 +23,12 @@
         assert ctypes2lltype(lltype.Char, 0xFF) == '\xFF'
         assert lltype2ctypes(5.25) == 5.25
         assert ctypes2lltype(lltype.Float, 5.25) == 5.25
+        res = lltype2ctypes(rffi.r_singlefloat(-3.5))
+        assert isinstance(res, ctypes.c_float)
+        assert res.value == -3.5
+        res = ctypes2lltype(lltype.SingleFloat, ctypes.c_float(-3.5))
+        assert isinstance(res, rffi.r_singlefloat)
+        assert float(res) == -3.5
         assert lltype2ctypes(rffi.r_uint(-1)) == sys.maxint * 2 + 1
         res = ctypes2lltype(lltype.Unsigned, sys.maxint * 2 + 1)
         assert (res, type(res)) == (rffi.r_uint(-1), rffi.r_uint)



More information about the Pypy-commit mailing list