Author: Armin Rigo <ar...@tunes.org> Branch: jit-constptr-2 Changeset: r83509:3b8c459d92f7 Date: 2016-04-02 10:27 +0200 http://bitbucket.org/pypy/pypy/changeset/3b8c459d92f7/
Log: Test fixes, including moving the two tests about pinned objects to test_rewrite.py: we don't need any special case about pinned objects any more. Just check that it still gives mostly the same results in terms of load_from_gc_table. diff --git a/rpython/jit/backend/llsupport/gc.py b/rpython/jit/backend/llsupport/gc.py --- a/rpython/jit/backend/llsupport/gc.py +++ b/rpython/jit/backend/llsupport/gc.py @@ -247,6 +247,14 @@ """ return jitframe.JITFRAME.allocate(frame_info) + def make_gcref_tracer(self, array_base_addr, gcrefs): + # for tests, or for Boehm. Overridden for framework GCs + from rpython.jit.backend.llsupport import gcreftracer + return gcreftracer.make_boehm_tracer(array_base_addr, gcrefs) + + def clear_gcref_tracer(self, tracer): + pass # nothing needed unless overridden + class JitFrameDescrs: def _freeze_(self): return True @@ -345,13 +353,6 @@ arraydescr.itemsize, arraydescr.lendescr.offset) - def make_gcref_tracer(self, array_base_addr, gcrefs): - from rpython.jit.backend.llsupport import gcreftracer - return gcreftracer.make_boehm_tracer(array_base_addr, gcrefs) - - def clear_gcref_tracer(self, tracer): - pass # nothing needed - # ____________________________________________________________ # All code below is for the hybrid or minimark GC diff --git a/rpython/jit/backend/llsupport/test/test_pinned_object_rewrite.py b/rpython/jit/backend/llsupport/test/test_pinned_object_rewrite.py deleted file mode 100644 --- a/rpython/jit/backend/llsupport/test/test_pinned_object_rewrite.py +++ /dev/null @@ -1,149 +0,0 @@ -from test_rewrite import get_size_descr, get_array_descr, get_description, BaseFakeCPU -from rpython.jit.backend.llsupport.descr import get_size_descr,\ - get_field_descr, get_array_descr, ArrayDescr, FieldDescr,\ - SizeDescr, get_interiorfield_descr -from rpython.jit.backend.llsupport.gc import GcLLDescr_boehm,\ - GcLLDescr_framework, MovableObjectTracker -from rpython.jit.backend.llsupport import jitframe, gc -from rpython.jit.metainterp.gc import get_description -from rpython.jit.tool.oparser import parse -from rpython.jit.metainterp.optimizeopt.util import equaloplists -from rpython.jit.metainterp.history import JitCellToken, FLOAT -from rpython.rtyper.lltypesystem import lltype, rffi, lltype, llmemory -from rpython.rtyper import rclass -from rpython.jit.backend.x86.arch import WORD -from rpython.rlib import rgc - -class Evaluator(object): - def __init__(self, scope): - self.scope = scope - def __getitem__(self, key): - return eval(key, self.scope) - - -class FakeLoopToken(object): - pass - -# The following class is based on rpython.jit.backend.llsupport.test.test_rewrite.RewriteTests. -# It's modified to be able to test the object pinning specific features. -class RewriteTests(object): - def check_rewrite(self, frm_operations, to_operations, **namespace): - # objects to use inside the test - A = lltype.GcArray(lltype.Signed) - adescr = get_array_descr(self.gc_ll_descr, A) - adescr.tid = 4321 - alendescr = adescr.lendescr - # - pinned_obj_type = lltype.GcStruct('PINNED_STRUCT', ('my_int', lltype.Signed)) - pinned_obj_my_int_descr = get_field_descr(self.gc_ll_descr, pinned_obj_type, 'my_int') - pinned_obj_ptr = lltype.malloc(pinned_obj_type) - pinned_obj_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, pinned_obj_ptr) - assert rgc.pin(pinned_obj_gcref) - # - notpinned_obj_type = lltype.GcStruct('NOT_PINNED_STRUCT', ('my_int', lltype.Signed)) - notpinned_obj_my_int_descr = get_field_descr(self.gc_ll_descr, notpinned_obj_type, 'my_int') - notpinned_obj_ptr = lltype.malloc(notpinned_obj_type) - notpinned_obj_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, notpinned_obj_ptr) - # - ptr_array_descr = self.cpu.arraydescrof(MovableObjectTracker.ptr_array_type) - # - vtable_descr = self.gc_ll_descr.fielddescr_vtable - O = lltype.GcStruct('O', ('parent', rclass.OBJECT), - ('x', lltype.Signed)) - o_vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True) - # - tiddescr = self.gc_ll_descr.fielddescr_tid - wbdescr = self.gc_ll_descr.write_barrier_descr - WORD = globals()['WORD'] - # - strdescr = self.gc_ll_descr.str_descr - unicodedescr = self.gc_ll_descr.unicode_descr - strlendescr = strdescr.lendescr - unicodelendescr = unicodedescr.lendescr - - casmdescr = JitCellToken() - clt = FakeLoopToken() - clt._ll_initial_locs = [0, 8] - frame_info = lltype.malloc(jitframe.JITFRAMEINFO, flavor='raw') - clt.frame_info = frame_info - frame_info.jfi_frame_depth = 13 - frame_info.jfi_frame_size = 255 - framedescrs = self.gc_ll_descr.getframedescrs(self.cpu) - framelendescr = framedescrs.arraydescr.lendescr - jfi_frame_depth = framedescrs.jfi_frame_depth - jfi_frame_size = framedescrs.jfi_frame_size - jf_frame_info = framedescrs.jf_frame_info - signedframedescr = self.cpu.signedframedescr - floatframedescr = self.cpu.floatframedescr - casmdescr.compiled_loop_token = clt - tzdescr = None # noone cares - # - namespace.update(locals()) - # - for funcname in self.gc_ll_descr._generated_functions: - namespace[funcname] = self.gc_ll_descr.get_malloc_fn(funcname) - namespace[funcname + '_descr'] = getattr(self.gc_ll_descr, - '%s_descr' % funcname) - # - ops = parse(frm_operations, namespace=namespace) - operations = self.gc_ll_descr.rewrite_assembler(self.cpu, - ops.operations, - []) - # make the array containing the GCREF's accessible inside the tests. - # This must be done after we call 'rewrite_assembler'. Before that - # call 'last_moving_obj_tracker' is None or filled with some old - # value. - namespace['ptr_array_gcref'] = self.gc_ll_descr.last_moving_obj_tracker.ptr_array_gcref - expected = parse(to_operations % Evaluator(namespace), - namespace=namespace) - equaloplists(operations, expected.operations) - lltype.free(frame_info, flavor='raw') - -class TestFramework(RewriteTests): - def setup_method(self, meth): - class config_(object): - class translation(object): - gc = 'minimark' - gcrootfinder = 'asmgcc' - gctransformer = 'framework' - gcremovetypeptr = False - gcdescr = get_description(config_) - self.gc_ll_descr = GcLLDescr_framework(gcdescr, None, None, None, - really_not_translated=True) - self.gc_ll_descr.write_barrier_descr.has_write_barrier_from_array = ( - lambda cpu: True) - # - class FakeCPU(BaseFakeCPU): - def sizeof(self, STRUCT, is_object): - descr = SizeDescr(104) - descr.tid = 9315 - descr.vtable = 12 - return descr - self.cpu = FakeCPU() - - def test_simple_getfield(self): - self.check_rewrite(""" - [] - i0 = getfield_gc_i(ConstPtr(pinned_obj_gcref), descr=pinned_obj_my_int_descr) - """, """ - [] - p1 = gc_load_r(ConstPtr(ptr_array_gcref), %(0 * ptr_array_descr.itemsize + 1)s, %(ptr_array_descr.itemsize)s) - i0 = gc_load_i(p1, 0, -%(pinned_obj_my_int_descr.field_size)s) - """) - assert len(self.gc_ll_descr.last_moving_obj_tracker._indexes) == 1 - - def test_simple_getfield_twice(self): - self.check_rewrite(""" - [] - i0 = getfield_gc_i(ConstPtr(pinned_obj_gcref), descr=pinned_obj_my_int_descr) - i1 = getfield_gc_i(ConstPtr(notpinned_obj_gcref), descr=notpinned_obj_my_int_descr) - i2 = getfield_gc_i(ConstPtr(pinned_obj_gcref), descr=pinned_obj_my_int_descr) - """, """ - [] - p1 = gc_load_r(ConstPtr(ptr_array_gcref), %(0 * ptr_array_descr.itemsize + 1)s, %(ptr_array_descr.itemsize)s) - i0 = gc_load_i(p1, 0, -%(pinned_obj_my_int_descr.field_size)s) - i1 = gc_load_i(ConstPtr(notpinned_obj_gcref), 0, -%(notpinned_obj_my_int_descr.field_size)s) - p2 = gc_load_r(ConstPtr(ptr_array_gcref), %(1 * ptr_array_descr.itemsize + 1)s, %(ptr_array_descr.itemsize)s) - i2 = gc_load_i(p2, 0, -%(pinned_obj_my_int_descr.field_size)s) - """) - assert len(self.gc_ll_descr.last_moving_obj_tracker._indexes) == 2 diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py b/rpython/jit/backend/llsupport/test/test_rewrite.py --- a/rpython/jit/backend/llsupport/test/test_rewrite.py +++ b/rpython/jit/backend/llsupport/test/test_rewrite.py @@ -1368,6 +1368,37 @@ """) assert self.gcrefs == [self.myR1, self.myR1b] + def test_pinned_simple_getfield(self): + # originally in test_pinned_object_rewrite; now should give the + # same result for pinned objects and for normal objects + self.check_rewrite(""" + [] + i0 = getfield_gc_i(ConstPtr(myR1), descr=xdescr) + """, """ + [] + p1 = load_from_gc_table(0) + i0 = gc_load_i(p1, %(xdescr.offset)s, -%(xdescr.field_size)s) + """) + assert self.gcrefs == [self.myR1] + + def test_pinned_simple_getfield_twice(self): + # originally in test_pinned_object_rewrite; now should give the + # same result for pinned objects and for normal objects + self.check_rewrite(""" + [] + i0 = getfield_gc_i(ConstPtr(myR1), descr=xdescr) + i1 = getfield_gc_i(ConstPtr(myR1b), descr=xdescr) + i2 = getfield_gc_i(ConstPtr(myR1), descr=xdescr) + """, """ + [] + p1 = load_from_gc_table(0) + i0 = gc_load_i(p1, %(xdescr.offset)s, -%(xdescr.field_size)s) + p2 = load_from_gc_table(1) + i1 = gc_load_i(p2, %(xdescr.offset)s, -%(xdescr.field_size)s) + i2 = gc_load_i(p1, %(xdescr.offset)s, -%(xdescr.field_size)s) + """) + assert self.gcrefs == [self.myR1, self.myR1b] + def test_guard_in_gcref(self): self.check_rewrite(""" [i1, i2] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit