Author: Maciej Fijalkowski <fij...@gmail.com> Branch: resume-refactor Changeset: r68961:a6c79f403639 Date: 2014-01-27 15:38 +0100 http://bitbucket.org/pypy/pypy/changeset/a6c79f403639/
Log: Adjust tests for the real interface of bhimpl_new_with_vtable diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py --- a/rpython/jit/backend/llgraph/runner.py +++ b/rpython/jit/backend/llgraph/runner.py @@ -6,6 +6,7 @@ from rpython.jit.metainterp.history import AbstractDescr from rpython.jit.metainterp.history import Const, getkind from rpython.jit.metainterp.history import INT, REF, FLOAT, VOID, Box +from rpython.jit.metainterp.history import getkind from rpython.jit.metainterp.resoperation import rop from rpython.jit.codewriter import longlong, heaptracker from rpython.jit.codewriter.effectinfo import EffectInfo @@ -36,6 +37,7 @@ def __init__(self, mapping, frontend_liveness, descr, inputargs, inputlocs): self.liveness = LivenessAnalyzer() self.numbering = {} + self.deps = {} self.mapping = mapping self.framestack = [] if inputlocs is not None: @@ -68,15 +70,24 @@ def process_resume_set_pc(self, op): pass + def process_resume_new_with_vtable(self, op): + self._add_box_to_numbering(op.result) + self.deps[op.result] = {} + def process_resume_setfield_gc(self, op): - xxx + self._add_box_to_numbering(op.getarg(1)) + self.deps[op.getarg(0)][op.getdescr()] = op.getarg(1) + + def _add_box_to_numbering(self, box): + if box not in self.deps: + if self.mapping(box) not in self.numbering: + self.numbering[self.mapping(box)] = len(self.numbering) def process_resume_put(self, op): box = op.getarg(0) if isinstance(box, Const): return - if self.mapping(box) not in self.numbering: - self.numbering[self.mapping(box)] = len(self.numbering) + self._add_box_to_numbering(box) frame_pos = op.getarg(1).getint() pos_in_frame = op.getarg(2).getint() self.framestack[frame_pos].registers[pos_in_frame] = box @@ -86,13 +97,23 @@ frontend_pos = op.getarg(1).getint() self.framestack[frame_pos].registers[frontend_pos] = None + def extend_from_virtual(self, r, box): + for v in sorted(self.deps[box].values()): + if v in self.deps: + self.extend_from_virtual(r, v) + else: + r.append(self.mapping(v)) + def get_numbering(self, mapping, op): res = [] all = {} for frame in self.framestack: for reg in frame.registers: if reg is not None and isinstance(reg, Box) and reg not in all: - res.append(mapping(reg)) + if reg in self.deps: + self.extend_from_virtual(res, reg) + else: + res.append(mapping(reg)) all[reg] = None return res diff --git a/rpython/jit/backend/llsupport/llmodel.py b/rpython/jit/backend/llsupport/llmodel.py --- a/rpython/jit/backend/llsupport/llmodel.py +++ b/rpython/jit/backend/llsupport/llmodel.py @@ -23,10 +23,10 @@ def __init__(self, rtyper, stats, opts, translate_support_code=False, gcdescr=None): + from rpython.jit.backend.llsupport.gc import get_ll_description + assert type(opts) is not bool self.opts = opts - - from rpython.jit.backend.llsupport.gc import get_ll_description AbstractCPU.__init__(self) self.rtyper = rtyper self.stats = stats diff --git a/rpython/jit/resume/frontend.py b/rpython/jit/resume/frontend.py --- a/rpython/jit/resume/frontend.py +++ b/rpython/jit/resume/frontend.py @@ -84,13 +84,13 @@ return val def setfield_gc(self, struct, encoded_field_pos, fielddescr): - if fielddescr.kind == INT: + if fielddescr.is_field_signed(): intval = self.getint(encoded_field_pos) self.cpu.bh_setfield_gc_i(struct, intval, fielddescr) - elif fielddescr.kind == REF: + elif fielddescr.is_pointer_field(): refval = self.getref(encoded_field_pos) self.cpu.bh_setfield_gc_r(struct, refval, fielddescr) - elif fielddescr.kind == FLOAT: + elif fielddescr.is_float_field(): xxx def store_float_value(self, curbh, i, jitframe_pos): diff --git a/rpython/jit/resume/reader.py b/rpython/jit/resume/reader.py --- a/rpython/jit/resume/reader.py +++ b/rpython/jit/resume/reader.py @@ -1,6 +1,7 @@ from rpython.jit.metainterp.resoperation import rop from rpython.jit.metainterp.history import ConstInt +from rpython.jit.codewriter import heaptracker from rpython.jit.resume import rescode class ResumeFrame(object): @@ -35,7 +36,8 @@ ConstInt(self.const_class)) def allocate_direct(self, cpu): - return cpu.bh_new_with_vtable(self.const_class) + descr = heaptracker.vtable2descr(cpu, self.const_class) + return cpu.bh_new_with_vtable(self.const_class, descr) class AbstractResumeReader(object): """ A resume reader that can follow resume until given point. Consult diff --git a/rpython/jit/resume/test/test_frontend.py b/rpython/jit/resume/test/test_frontend.py --- a/rpython/jit/resume/test/test_frontend.py +++ b/rpython/jit/resume/test/test_frontend.py @@ -12,6 +12,7 @@ from rpython.jit.metainterp.resoperation import rop from rpython.jit.codewriter.format import unformat_assembler from rpython.jit.codewriter.codewriter import CodeWriter +from rpython.jit.codewriter import heaptracker from rpython.jit.backend.llgraph.runner import LLGraphCPU from rpython.jit.metainterp.pyjitpl import MetaInterp, MetaInterpStaticData from rpython.jit.metainterp.jitdriver import JitDriverStaticData @@ -19,10 +20,15 @@ from rpython.jit.metainterp.jitexc import DoneWithThisFrameInt from rpython.jit.metainterp.optimizeopt.util import equaloplists from rpython.rlib.jit import JitDriver +from rpython.rtyper.lltypesystem import rclass, lltype, llmemory class Descr(AbstractDescr): - pass + def is_pointer_field(self): + return self.kind == REF + + def is_field_signed(self): + return self.kind == INT class MockLoop(object): pass @@ -90,7 +96,7 @@ def bh_setfield_gc_r(self, struct, refval, fielddescr): self.history.append(("setfield_gc_r", struct, refval, fielddescr)) - def bh_new_with_vtable(self, const_class): + def bh_new_with_vtable(self, const_class, descr): self.history.append(("new_with_vtable", const_class)) return "new_with_vtable" @@ -206,7 +212,10 @@ jitcode1.setup(num_regs_i=0, num_regs_r=1, num_regs_f=0) builder = ResumeBytecodeBuilder() descr = Descr() - const_class = ConstInt(13) + cls = lltype.malloc(rclass.OBJECT_VTABLE, flavor='raw', + immortal=True) + cls_as_int = heaptracker.adr2int(llmemory.cast_ptr_to_adr(cls)) + const_class = ConstInt(cls_as_int) descr.global_descr_index = 0 builder.enter_frame(-1, jitcode1) builder.resume_new(0, descr) @@ -230,16 +239,24 @@ metainterp = MockMetaInterp() metainterp.staticdata = MockStaticData([jitcode1], [descr, d2, d3]) metainterp.cpu = MockCPU() + + class MockTracker(object): + pass + + tr = MockTracker() + tr._all_size_descrs_with_vtable = [descr] + descr._corresponding_vtable = cls + metainterp.cpu.tracker = tr metainterp.staticdata.cpu = metainterp.cpu rebuild_from_resumedata(metainterp, "myframe", descr) expected = [(rop.NEW, descr), (rop.SETFIELD_GC, d2, AnyBox(), EqConstInt(1)), - (rop.NEW_WITH_VTABLE, EqConstInt(13)), + (rop.NEW_WITH_VTABLE, EqConstInt(cls_as_int)), (rop.SETFIELD_GC, d3, AnyBox(), AnyBox()), (rop.RESUME_PUT, None, AnyBox(), EqConstInt(0), EqConstInt(0))] expected2 = [(rop.NEW, descr), - (rop.NEW_WITH_VTABLE, EqConstInt(13)), + (rop.NEW_WITH_VTABLE, EqConstInt(cls_as_int)), (rop.SETFIELD_GC, d3, AnyBox(), AnyBox()), (rop.SETFIELD_GC, d2, AnyBox(), EqConstInt(1)), (rop.RESUME_PUT, None, AnyBox(), EqConstInt(0), @@ -251,14 +268,14 @@ hist = metainterp.cpu.history dir_expected2 = [ ("new", descr), - ("new_with_vtable", 13), + ("new_with_vtable", cls_as_int), ("setfield_gc_r", "new", "new_with_vtable", d3), ("setfield_gc_i", "new", 1, d2), ] dir_expected = [ ("new", descr), ("setfield_gc_i", "new", 1, d2), - ("new_with_vtable", 13), + ("new_with_vtable", cls_as_int), ("setfield_gc_r", "new", "new_with_vtable", d3), ] assert hist == dir_expected or hist == dir_expected2 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit