[pypy-commit] pypy guard-compatible: Test and small fixes about translating guard_compatible
arigo
pypy.commits at gmail.com
Mon May 23 07:55:15 EDT 2016
Author: Armin Rigo <arigo at tunes.org>
Branch: guard-compatible
Changeset: r84623:e00de3e7de14
Date: 2016-05-23 13:55 +0200
http://bitbucket.org/pypy/pypy/changeset/e00de3e7de14/
Log: Test and small fixes about translating guard_compatible
diff --git a/rpython/jit/backend/llsupport/test/test_zrpy_gc_direct.py b/rpython/jit/backend/llsupport/test/test_zrpy_gc_direct.py
--- a/rpython/jit/backend/llsupport/test/test_zrpy_gc_direct.py
+++ b/rpython/jit/backend/llsupport/test/test_zrpy_gc_direct.py
@@ -204,3 +204,120 @@
def test_guards_translated_without_gctypeptr():
run_guards_translated(gcremovetypeptr=True)
+
+
+# ____________________________________________________________
+
+
+def test_guard_compatible_translated():
+ from rpython.jit.metainterp.compile import GuardCompatibleDescr
+
+ def main(argv):
+ return 0
+
+ t = TranslationContext()
+ t.config.translation.gc = "minimark"
+ ann = t.buildannotator()
+ ann.build_types(main, [s_list_of_strings], main_entry_point=True)
+ rtyper = t.buildrtyper()
+ rtyper.specialize()
+
+ CPU = getcpuclass()
+ cpu = CPU(rtyper, NoStats(),
+ translate_support_code=True,
+ gcdescr=get_description(t.config))
+ execute_token = cpu.make_execute_token(llmemory.GCREF)
+ finaldescr = BasicFinalDescr()
+
+ class Global:
+ pass
+ glob = Global()
+
+ class BasicCompatibleDescr(GuardCompatibleDescr):
+ def find_compatible(self, cpu, value):
+ glob.seen = value
+ if self._r_is_compatible:
+ print 'find_compatible() returning -1'
+ return -1 # continue running in the main loop
+ else:
+ print 'find_compatible() returning 0'
+ return 0 # fail
+ def make_a_counter_per_value(self, *args):
+ pass
+ guardcompatdescr_yes = BasicCompatibleDescr()
+ guardcompatdescr_no = BasicCompatibleDescr()
+ guardcompatdescr_yes._r_is_compatible = True
+ guardcompatdescr_no._r_is_compatible = False
+
+ A = lltype.GcStruct('A')
+ prebuilt_A = lltype.malloc(A, immortal=True)
+ gcref_prebuilt_A = lltype.cast_opaque_ptr(llmemory.GCREF, prebuilt_A)
+ never_A = lltype.malloc(A, immortal=True)
+ gcref_never_A = lltype.cast_opaque_ptr(llmemory.GCREF, prebuilt_A)
+
+ loop1 = parse("""
+ [p0]
+ guard_compatible(p0, ConstPtr(prebuilt_A), descr=guardcompatdescr) [p0]
+ finish(p0, descr=finaldescr)
+ """, namespace={'finaldescr': finaldescr,
+ 'guardcompatdescr': guardcompatdescr_yes,
+ 'prebuilt_A': gcref_prebuilt_A})
+
+ loop2 = parse("""
+ [p0]
+ guard_compatible(p0, ConstPtr(prebuilt_A), descr=guardcompatdescr) [p0]
+ finish(p0, descr=finaldescr)
+ """, namespace={'finaldescr': finaldescr,
+ 'guardcompatdescr': guardcompatdescr_no,
+ 'prebuilt_A': gcref_prebuilt_A})
+
+ def g():
+ cpu.setup_once()
+ token1 = JitCellToken()
+ token2 = JitCellToken()
+ cpu.compile_loop(loop1.inputargs, loop1.operations, token1)
+ cpu.compile_loop(loop2.inputargs, loop2.operations, token2)
+
+ for token in [token1, token2]:
+ for a in [prebuilt_A, lltype.nullptr(A), lltype.malloc(A)]:
+ glob.seen = gcref_never_A
+ p0 = lltype.cast_opaque_ptr(llmemory.GCREF, a)
+ frame = execute_token(token, p0)
+ assert cpu.get_ref_value(frame, 0) == p0
+ descr = cpu.get_latest_descr(frame)
+ if descr is finaldescr:
+ print 'match'
+ elif descr is guardcompatdescr_no:
+ print 'fail'
+ else:
+ print '???'
+ if glob.seen != gcref_never_A:
+ if glob.seen == p0:
+ print 'seen ok'
+ else:
+ print 'seen BAD VALUE!'
+
+
+ call_initial_function(t, g)
+
+ cbuilder = genc.CStandaloneBuilder(t, main, t.config)
+ cbuilder.generate_source(defines=cbuilder.DEBUG_DEFINES)
+ cbuilder.compile()
+
+ data = cbuilder.cmdexec('')
+ assert data == ('match\n'
+ 'find_compatible() returning -1\n'
+ 'match\n'
+ 'seen ok\n'
+ 'find_compatible() returning -1\n'
+ 'match\n'
+ 'seen ok\n'
+
+ 'match\n'
+ 'find_compatible() returning 0\n'
+ 'fail\n'
+ 'seen ok\n'
+ 'find_compatible() returning 0\n'
+ 'fail\n'
+ 'seen ok\n'
+ )
diff --git a/rpython/jit/backend/x86/guard_compat.py b/rpython/jit/backend/x86/guard_compat.py
--- a/rpython/jit/backend/x86/guard_compat.py
+++ b/rpython/jit/backend/x86/guard_compat.py
@@ -195,6 +195,7 @@
def _real_number(ofs): # hack
return rffi.cast(lltype.Signed, rffi.cast(lltype.Unsigned, ofs))
+ at specialize.arg(2)
def bchoices_pair(gc, pair_addr, callback, arg):
gcref_addr = pair_addr + llmemory.offsetof(PAIR, 'gcref')
old = gcref_addr.unsigned[0]
@@ -218,7 +219,10 @@
pairs_quicksort(array_addr, length)
lambda_bchoices_trace = lambda: bchoices_trace
-eci = ExternalCompilationInfo(separate_module_sources=["""
+eci = ExternalCompilationInfo(post_include_bits=["""
+RPY_EXTERN void pypy_pairs_quicksort(void *base_addr, Signed length);
+"""], separate_module_sources=["""
+#include <stdlib.h>
static int _pairs_compare(const void *p1, const void *p2)
{
More information about the pypy-commit
mailing list