1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
from rpython.rlib.jit_libffi import types, CIF_DESCRIPTION, FFI_TYPE_PP
from rpython.rlib.clibffi import FFI_DEFAULT_ABI
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.jit.codewriter.longlong import is_64_bit
from rpython.jit.backend.llsupport.descr import *
from rpython.jit.backend.llsupport.ffisupport import *
from rpython.rlib.rarithmetic import is_emulated_long
class FakeCPU:
def __init__(self, supports_floats=False, supports_longlong=False,
supports_singlefloats=False):
self.supports_floats = supports_floats
self.supports_longlong = supports_longlong
self.supports_singlefloats = supports_singlefloats
def calldescrof_dynamic(self, cif_descr, effectinfo):
return get_call_descr_dynamic(self, cif_descr, effectinfo)
def test_call_descr_dynamic():
args = [types.sint, types.pointer]
descr = calldescr_dynamic_for_tests(FakeCPU(), args, types.sint)
assert isinstance(descr, CallDescr)
assert descr.result_type == 'i'
assert descr.result_flag == FLAG_SIGNED
assert descr.arg_classes == 'ii'
assert descr.get_ffi_flags() == FFI_DEFAULT_ABI
args = [types.sint, types.double, types.pointer]
descr = calldescr_dynamic_for_tests(FakeCPU(), args, types.void)
assert descr is None # missing floats
descr = calldescr_dynamic_for_tests(FakeCPU(supports_floats=True),
args, types.void)
assert descr.result_type == 'v'
assert descr.result_flag == FLAG_VOID
assert descr.arg_classes == 'ifi'
assert descr.get_ffi_flags() == FFI_DEFAULT_ABI
descr = calldescr_dynamic_for_tests(FakeCPU(), [], types.sint8)
assert descr.get_result_size() == 1
assert descr.result_flag == FLAG_SIGNED
assert descr.is_result_signed() == True
descr = calldescr_dynamic_for_tests(FakeCPU(), [], types.uint8)
assert isinstance(descr, CallDescr)
assert descr.get_result_size() == 1
assert descr.result_flag == FLAG_UNSIGNED
assert descr.is_result_signed() == False
if not is_64_bit or is_emulated_long:
descr = calldescr_dynamic_for_tests(FakeCPU(), [], types.slonglong)
assert descr is None # missing longlongs
descr = calldescr_dynamic_for_tests(FakeCPU(supports_longlong=True),
[], types.slonglong)
assert isinstance(descr, CallDescr)
assert descr.result_flag == FLAG_FLOAT
assert descr.result_type == 'L'
assert descr.get_ffi_flags() == FFI_DEFAULT_ABI
else:
assert types.slonglong is types.slong
descr = calldescr_dynamic_for_tests(FakeCPU(), [], types.float)
assert descr is None # missing singlefloats
descr = calldescr_dynamic_for_tests(FakeCPU(supports_singlefloats=True),
[], types.float)
assert descr.result_flag == FLAG_UNSIGNED
assert descr.result_type == 'S'
assert descr.get_ffi_flags() == FFI_DEFAULT_ABI
|