[pypy-svn] r78067 - in pypy/branch/jit-sign-descr/pypy: jit/backend/llsupport rlib

arigo at codespeak.net arigo at codespeak.net
Mon Oct 18 19:38:53 CEST 2010


Author: arigo
Date: Mon Oct 18 19:38:52 2010
New Revision: 78067

Modified:
   pypy/branch/jit-sign-descr/pypy/jit/backend/llsupport/ffisupport.py
   pypy/branch/jit-sign-descr/pypy/rlib/libffi.py
Log:
Pass 'signed-or-not' information from libffi to ffisupport.


Modified: pypy/branch/jit-sign-descr/pypy/jit/backend/llsupport/ffisupport.py
==============================================================================
--- pypy/branch/jit-sign-descr/pypy/jit/backend/llsupport/ffisupport.py	(original)
+++ pypy/branch/jit-sign-descr/pypy/jit/backend/llsupport/ffisupport.py	Mon Oct 18 19:38:52 2010
@@ -14,7 +14,8 @@
     arg_classes = ''.join(argkinds)
     if reskind == history.INT:
         size = intmask(ffi_result.c_size)
-        return DynamicIntCallDescr(arg_classes, size, extrainfo)
+        signed = is_ffi_type_signed(ffi_result)
+        return DynamicIntCallDescr(arg_classes, size, signed, extrainfo)
     elif reskind == history.REF:
         return  NonGcPtrCallDescr(arg_classes, extrainfo)
     elif reskind == history.FLOAT:
@@ -26,10 +27,15 @@
 def get_ffi_type_kind(ffi_type):
     from pypy.rlib.libffi import types
     kind = types.getkind(ffi_type)
-    if kind == 'i':
+    if kind == 'i' or kind == 'u':
         return history.INT
     elif kind == 'f':
         return history.FLOAT
     elif kind == 'v':
         return history.VOID
-    assert False, "Unsuported kind '%s'" % kind
+    assert False, "Unsupported kind '%s'" % kind
+
+def is_ffi_type_signed(ffi_type):
+    from pypy.rlib.libffi import types
+    kind = types.getkind(ffi_type)
+    return kind != 'u'

Modified: pypy/branch/jit-sign-descr/pypy/rlib/libffi.py
==============================================================================
--- pypy/branch/jit-sign-descr/pypy/rlib/libffi.py	(original)
+++ pypy/branch/jit-sign-descr/pypy/rlib/libffi.py	Mon Oct 18 19:38:52 2010
@@ -35,6 +35,9 @@
     @staticmethod
     @jit.purefunction
     def getkind(ffi_type):
+        """Returns 'v' for void, 'f' for float, 'i' for signed integer,
+        and 'u' for unsigned integer.
+        """
         if ffi_type is types.void:
             return 'v'
         elif ffi_type is types.double:
@@ -42,31 +45,31 @@
         elif ffi_type is types.pointer:
             return 'i'
         elif ffi_type is types.uchar:
-            return 'i'
+            return 'u'
         elif ffi_type is types.uint8:
-            return 'i'
+            return 'u'
         elif ffi_type is types.schar:
             return 'i'
         elif ffi_type is types.sint8:
             return 'i'
         elif ffi_type is types.uint16:
-            return 'i'
+            return 'u'
         elif ffi_type is types.ushort:
-            return 'i'
+            return 'u'
         elif ffi_type is types.sint16:
             return 'i'
         elif ffi_type is types.sshort:
             return 'i'
         elif ffi_type is types.uint:
-            return 'i'
+            return 'u'
         elif ffi_type is types.uint32:
-            return 'i'
+            return 'u'
         elif ffi_type is types.sint:
             return 'i'
         elif ffi_type is types.sint32:
             return 'i'
         ## elif ffi_type is types.uint64:
-        ##     return 'i'
+        ##     return 'u'
         ## elif ffi_type is types.sint64:
         ##     return 'i'
         raise KeyError



More information about the Pypy-commit mailing list