[pypy-commit] pypy s390x-backend: ffi call fixed in deprecated api that is still used (fix before that was not sufficient), fixed legacy tests test_libffi
plan_rich
pypy.commits at gmail.com
Fri Feb 5 16:38:36 EST 2016
Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r82095:d40d932f8349
Date: 2016-02-05 22:37 +0100
http://bitbucket.org/pypy/pypy/changeset/d40d932f8349/
Log: ffi call fixed in deprecated api that is still used (fix before that
was not sufficient), fixed legacy tests test_libffi
diff --git a/pypy/module/_rawffi/interp_rawffi.py b/pypy/module/_rawffi/interp_rawffi.py
--- a/pypy/module/_rawffi/interp_rawffi.py
+++ b/pypy/module/_rawffi/interp_rawffi.py
@@ -4,7 +4,6 @@
from pypy.interpreter.gateway import interp2app, unwrap_spec
from pypy.interpreter.typedef import TypeDef, GetSetProperty
-from rpython.jit.backend.llsupport.symbolic import WORD
from rpython.rlib.clibffi import *
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.rtyper.tool import rffi_platform
@@ -447,6 +446,9 @@
self.ptr = ptr
self.argshapes = argshapes
self.resshape = resshape
+ self.narrow_integer = False
+ if resshape is not None:
+ self.narrow_integer = resshape.itemcode.lower() in ('c','h','i')
def getbuffer(self, space):
return space.wrap(rffi.cast(lltype.Unsigned, self.ptr.funcsym))
@@ -506,9 +508,9 @@
result = self.resshape.allocate(space, 1, autofree=True)
# adjust_return_size() was used here on result.ll_buffer
self.ptr.call(args_ll, result.ll_buffer)
- if BIGENDIAN and result.shape.itemcode in ('c','h','i','C','H','I'):
+ if BIGENDIAN and self.narrow_integer:
# we get a 8 byte value in big endian
- n = WORD - result.shape.size
+ n = rffi.sizeof(lltype.Signed) - result.shape.size
result.buffer_advance(n)
return space.wrap(result)
diff --git a/rpython/rlib/clibffi.py b/rpython/rlib/clibffi.py
--- a/rpython/rlib/clibffi.py
+++ b/rpython/rlib/clibffi.py
@@ -594,10 +594,10 @@
intmask(argtypes[i].c_size),
flavor='raw')
if restype != ffi_type_void:
- size = adjust_return_size(intmask(restype.c_size))
+ self.restype_size = intmask(restype.c_size)
+ size = adjust_return_size(self.restype_size)
self.ll_result = lltype.malloc(rffi.VOIDP.TO, size,
flavor='raw')
- self.restype_size = intmask(restype.c_size)
else:
self.restype_size = -1
@@ -637,7 +637,7 @@
if RES_TP is not lltype.Void:
TP = lltype.Ptr(rffi.CArray(RES_TP))
ptr = self.ll_result
- if _BIG_ENDIAN and self.restype_size != -1:
+ if _BIG_ENDIAN and RES_TP in TYPE_MAP_INT:
# we get a 8 byte value in big endian
n = rffi.sizeof(lltype.Signed) - self.restype_size
ptr = rffi.ptradd(ptr, n)
diff --git a/rpython/rlib/libffi.py b/rpython/rlib/libffi.py
--- a/rpython/rlib/libffi.py
+++ b/rpython/rlib/libffi.py
@@ -4,6 +4,7 @@
from __future__ import with_statement
from rpython.rtyper.lltypesystem import rffi, lltype
+from rpython.rlib.unroll import unrolling_iterable
from rpython.rlib.objectmodel import specialize, enforceargs
from rpython.rlib.rarithmetic import intmask, r_uint, r_singlefloat, r_longlong
from rpython.rlib import jit
@@ -15,6 +16,9 @@
from rpython.rlib.rdynload import DLLHANDLE
import os
+import sys
+
+_BIG_ENDIAN = sys.byteorder == 'big'
class types(object):
"""
@@ -211,6 +215,8 @@
# ======================================================================
+NARROW_INTEGER_TYPES = unrolling_iterable([rffi.CHAR,
+ rffi.UCHAR, rffi.SHORT, rffi.USHORT, rffi.INT, rffi.UINT])
class Func(AbstractFuncPtr):
@@ -263,7 +269,12 @@
res = self._do_call_raw(self.funcsym, ll_args)
elif _fits_into_signed(RESULT):
assert not types.is_struct(self.restype)
- res = self._do_call_int(self.funcsym, ll_args)
+ for res in NARROW_INTEGER_TYPES:
+ if RESULT is res:
+ res = self._do_call_int(self.funcsym, ll_args, rffi.CHAR)
+ break
+ else:
+ res = self._do_call_int(self.funcsym, ll_args, rffi.SIGNED)
elif RESULT is rffi.DOUBLE:
return self._do_call_float(self.funcsym, ll_args)
elif RESULT is rffi.FLOAT:
@@ -325,8 +336,9 @@
#@jit.oopspec('libffi_call_int(self, funcsym, ll_args)')
@jit.dont_look_inside
- def _do_call_int(self, funcsym, ll_args):
- return self._do_call(funcsym, ll_args, rffi.INT)
+ @specialize.arg(3)
+ def _do_call_int(self, funcsym, ll_args, TP):
+ return self._do_call(funcsym, ll_args, TP)
#@jit.oopspec('libffi_call_float(self, funcsym, ll_args)')
@jit.dont_look_inside
@@ -368,10 +380,10 @@
@specialize.arg(3)
def _do_call(self, funcsym, ll_args, RESULT):
# XXX: check len(args)?
- ll_result = lltype.nullptr(rffi.CCHARP.TO)
+ ll_result = lltype.nullptr(rffi.VOIDP.TO)
if self.restype != types.void:
size = adjust_return_size(intmask(self.restype.c_size))
- ll_result = lltype.malloc(rffi.CCHARP.TO, size,
+ ll_result = lltype.malloc(rffi.VOIDP.TO, size,
flavor='raw')
ffires = c_ffi_call(self.ll_cif,
self.funcsym,
@@ -379,14 +391,20 @@
rffi.cast(rffi.VOIDPP, ll_args))
if RESULT is not lltype.Void:
TP = lltype.Ptr(rffi.CArray(RESULT))
- buf = rffi.cast(TP, ll_result)
if types.is_struct(self.restype):
assert RESULT == rffi.SIGNED
# for structs, we directly return the buffer and transfer the
# ownership
+ buf = rffi.cast(TP, ll_result)
res = rffi.cast(RESULT, buf)
else:
- res = buf[0]
+ if _BIG_ENDIAN and types.getkind(self.restype) in ('i','u'):
+ ptr = ll_result
+ n = rffi.sizeof(lltype.Signed) - self.restype.c_size
+ ptr = rffi.ptradd(ptr, n)
+ res = rffi.cast(TP, ptr)[0]
+ else:
+ res = rffi.cast(TP, ll_result)[0]
else:
res = None
self._free_buffers(ll_result, ll_args)
diff --git a/rpython/rlib/test/test_libffi.py b/rpython/rlib/test/test_libffi.py
--- a/rpython/rlib/test/test_libffi.py
+++ b/rpython/rlib/test/test_libffi.py
@@ -274,7 +274,7 @@
"""
libfoo = self.get_libfoo()
func = (libfoo, 'diff_xy', [types.sint, types.signed], types.sint)
- res = self.call(func, [50, 8], lltype.Signed)
+ res = self.call(func, [50, 8], rffi.INT)
assert res == 42
def test_simple(self):
@@ -287,7 +287,7 @@
"""
libfoo = self.get_libfoo()
func = (libfoo, 'sum_xy', [types.sint, types.double], types.sint)
- res = self.call(func, [38, 4.2], lltype.Signed, jitif=["floats"])
+ res = self.call(func, [38, 4.2], rffi.INT, jitif=["floats"])
assert res == 42
def test_float_result(self):
@@ -319,7 +319,7 @@
"""
libfoo = self.get_libfoo()
func = (libfoo, 'many_args', [types.uchar, types.sint], types.sint)
- res = self.call(func, [chr(20), 22], rffi.SIGNED)
+ res = self.call(func, [chr(20), 22], rffi.INT)
assert res == 42
def test_char_args(self):
@@ -418,12 +418,12 @@
set_dummy = (libfoo, 'set_dummy', [types.sint], types.void)
get_dummy = (libfoo, 'get_dummy', [], types.sint)
#
- initval = self.call(get_dummy, [], rffi.SIGNED)
+ initval = self.call(get_dummy, [], rffi.INT)
#
res = self.call(set_dummy, [initval+1], lltype.Void)
assert res is None
#
- res = self.call(get_dummy, [], rffi.SIGNED)
+ res = self.call(get_dummy, [], rffi.INT)
assert res == initval+1
def test_single_float_args(self):
More information about the pypy-commit
mailing list