[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