[pypy-commit] pypy arm-longlong: Rewrite this test to no longer depend on (possibly buggy) ctypes
arigo
noreply at buildbot.pypy.org
Sun Aug 31 19:35:06 CEST 2014
Author: Armin Rigo <arigo at tunes.org>
Branch: arm-longlong
Changeset: r73245:9e40d9efd4d2
Date: 2014-08-31 19:34 +0200
http://bitbucket.org/pypy/pypy/changeset/9e40d9efd4d2/
Log: Rewrite this test to no longer depend on (possibly buggy) ctypes
callbacks.
diff --git a/rpython/jit/backend/test/runner_test.py b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -2718,12 +2718,11 @@
assert r == result
def test_call_release_gil_variable_function_and_arguments(self):
- # NOTE NOTE NOTE
- # This also works as a test for ctypes and libffi.
- # On some platforms, one of these is buggy...
+ from rpython.translator.tool.cbuild import ExternalCompilationInfo
from rpython.rlib.libffi import types
from rpython.rlib.rarithmetic import r_uint, r_longlong, r_ulonglong
from rpython.rlib.rarithmetic import r_singlefloat
+ from rpython.translator.c import primitive
cpu = self.cpu
rnd = random.Random(525)
@@ -2752,24 +2751,65 @@
(types.float, rffi.FLOAT),
] * 4
- for k in range(100):
+ NB_TESTS = 100
+ c_source = []
+ all_tests = []
+ export_symbols = []
+
+ def prepare_c_source():
POSSIBLE_TYPES = [rnd.choice(ALL_TYPES)
for i in range(random.randrange(2, 5))]
load_factor = rnd.random()
keepalive_factor = rnd.random()
#
- def pseudo_c_function(*args):
- seen.append(list(args))
- #
ffitypes = []
ARGTYPES = []
for i in range(rnd.randrange(4, 20)):
ffitype, TP = rnd.choice(POSSIBLE_TYPES)
ffitypes.append(ffitype)
ARGTYPES.append(TP)
+ fn_name = 'vartest%d' % k
+ all_tests.append((ARGTYPES, ffitypes, fn_name))
#
- FPTR = self.Ptr(self.FuncType(ARGTYPES, lltype.Void))
- func_ptr = llhelper(FPTR, pseudo_c_function)
+ fn_args = []
+ for i, ARG in enumerate(ARGTYPES):
+ arg_decl = primitive.cdecl(primitive.PrimitiveType[ARG],
+ 'x%d' % i)
+ fn_args.append(arg_decl)
+ var_name = 'argcopy_%s_x%d' % (fn_name, i)
+ var_decl = primitive.cdecl(primitive.PrimitiveType[ARG],
+ var_name)
+ c_source.append('static %s;' % var_decl)
+ getter_name = '%s_get%d' % (fn_name, i)
+ export_symbols.append(getter_name)
+ c_source.append('void %s(%s) { *p = %s; }' % (
+ getter_name,
+ primitive.cdecl(primitive.PrimitiveType[ARG], '*p'),
+ var_name))
+ export_symbols.append(fn_name)
+ c_source.append('')
+ c_source.append('void %s(%s)' % (fn_name, ', '.join(fn_args)))
+ c_source.append('{')
+ for i in range(len(ARGTYPES)):
+ c_source.append(' argcopy_%s_x%d = x%d;' % (fn_name, i, i))
+ c_source.append('}')
+ c_source.append('')
+
+ for k in range(NB_TESTS):
+ prepare_c_source()
+
+ eci = ExternalCompilationInfo(
+ separate_module_sources=['\n'.join(c_source)],
+ export_symbols=export_symbols)
+
+ for k in range(NB_TESTS):
+ ARGTYPES, ffitypes, fn_name = all_tests[k]
+ func_ptr = rffi.llexternal(fn_name, ARGTYPES, lltype.Void,
+ compilation_info=eci, _nowrapper=True)
+ load_factor = rnd.random()
+ keepalive_factor = rnd.random()
+ #
+ FPTR = lltype.typeOf(func_ptr)
funcbox = self.get_funcbox(cpu, func_ptr)
calldescr = cpu._calldescr_dynamic_for_tests(ffitypes, types.void)
faildescr = BasicFailDescr(1)
@@ -2840,12 +2880,21 @@
looptoken = JitCellToken()
self.cpu.compile_loop(argboxes, ops, looptoken)
#
- seen = []
deadframe = self.cpu.execute_token(looptoken, *argvalues_normal)
fail = self.cpu.get_latest_descr(deadframe)
assert fail.identifier == 0
expected = argvalues[1:]
- [got] = seen
+ got = []
+ for i, ARG in enumerate(ARGTYPES):
+ PARG = rffi.CArrayPtr(ARG)
+ getter_name = '%s_get%d' % (fn_name, i)
+ getter_ptr = rffi.llexternal(getter_name, [PARG], lltype.Void,
+ compilation_info=eci,
+ _nowrapper=True)
+ my_arg = lltype.malloc(PARG.TO, 1, zero=True, flavor='raw')
+ getter_ptr(my_arg)
+ got.append(my_arg[0])
+ lltype.free(my_arg, flavor='raw')
different_values = ['%r != %r' % (a, b)
for a, b in zip(got, expected)
if a != b]
More information about the pypy-commit
mailing list