Author: Maciej Fijalkowski <fij...@gmail.com> Branch: vref-copy Changeset: r56813:6112dd6a9ff6 Date: 2012-08-22 22:36 +0200 http://bitbucket.org/pypy/pypy/changeset/6112dd6a9ff6/
Log: slow progress diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py --- a/pypy/jit/metainterp/compile.py +++ b/pypy/jit/metainterp/compile.py @@ -2,7 +2,7 @@ from pypy.rpython.lltypesystem import lltype from pypy.rpython.ootypesystem import ootype from pypy.objspace.flow.model import Constant, Variable -from pypy.rlib.objectmodel import we_are_translated +from pypy.rlib.objectmodel import we_are_translated, specialize from pypy.rlib.debug import debug_start, debug_stop, debug_print from pypy.rlib import rstack from pypy.rlib.jit import JitDebugInfo, Counters @@ -638,6 +638,12 @@ self.copy_all_attributes_into(res) return res +@specialize.arg(2) +def read_field_from_resume(cpu, token, fieldname): + faildescr = cpu.force(token) + assert isinstance(faildescr, ResumeGuardForcedDescr) + return faildescr.handle_async_field_read(token, fieldname) + class ResumeGuardForcedDescr(ResumeGuardDescr): def __init__(self, metainterp_sd, jitdriver_sd): @@ -686,6 +692,13 @@ # future failure of the GUARD_NOT_FORCED self.save_data(force_token, all_virtuals) + @specialize.arg(2) + def handle_async_field_read(self, force_token, fieldname): + from pypy.jit.metainterp.resume import read_field_from_resumedata + metainterp_sd = self.metainterp_sd + ginfo = self.jitdriver_sd.greenfield_info + return read_field_from_resumedata(metainterp_sd, self, ginfo) + def save_data(self, key, value): globaldata = self.metainterp_sd.globaldata if we_are_translated(): diff --git a/pypy/jit/metainterp/resume.py b/pypy/jit/metainterp/resume.py --- a/pypy/jit/metainterp/resume.py +++ b/pypy/jit/metainterp/resume.py @@ -793,6 +793,9 @@ resumereader.done() return resumereader.liveboxes, virtualizable_boxes, virtualref_boxes +def read_field_from_resumedata(metainterp, storage, greenfield_info): + xxx + class ResumeDataBoxReader(AbstractResumeDataReader): unique_id = lambda: None diff --git a/pypy/jit/metainterp/virtualref.py b/pypy/jit/metainterp/virtualref.py --- a/pypy/jit/metainterp/virtualref.py +++ b/pypy/jit/metainterp/virtualref.py @@ -36,11 +36,19 @@ def _freeze_(self): return True - def _find_type_of_virtualref(self): + def _find_type_of_virtualref(self, graphs): # XXX limitation is that we can only have one type + T = None for graph in graphs: for block in graph.iterblocks(): for op in block.operations: + if op.opname == 'jit_record_vref': + new_T = op.args[0].concretetype + if T is None: + T = new_T + else: + assert T == new_T, "Different vref types %s and %s" % (T, new_T) + self._vref_T = T def replace_force_virtual_with_call(self, graphs): # similar to rvirtualizable2.replace_force_virtualizable_with_call(). @@ -48,7 +56,7 @@ c_is_virtual_ptr = None c_getfield_ptrs = {} # fieldname -> function force_virtual_count = 0 - self._find_type_of_virtualref() + self._find_type_of_virtualref(graphs) for graph in graphs: for block in graph.iterblocks(): for op in block.operations: @@ -158,9 +166,19 @@ def get_vref_getfield_fnptr(self, name, RES_TP): def read_virtual_field(inst): if inst.typeptr != self.jit_virtual_ref_vtable: - lltype.cast_ptr( - xxx - xxx + inst = lltype.cast_pointer(self._vref_T, inst) + return getattr(inst, 'inst_' + name) + vref = lltype.cast_pointer(lltype.Ptr(self.JIT_VIRTUAL_REF), inst) + token = vref.virtual_token + if token == self.TOKEN_TRACING_RESCALL or token == self.TOKEN_NONE: + # not a virtual at all, just pretending to be one + forced = lltype.cast_pointer(self._vref_T, vref.forced) + return getattr(forced, 'inst_' + name) + else: + assert not vref.forced + from pypy.jit.metainterp.compile import read_field_from_resume + return read_field_from_resume(self.cpu, token, name) + FUNC = lltype.FuncType([rclass.OBJECTPTR], RES_TP) funcptr = self.warmrunnerdesc.helper_func( lltype.Ptr(FUNC), diff --git a/pypy/rpython/lltypesystem/opimpl.py b/pypy/rpython/lltypesystem/opimpl.py --- a/pypy/rpython/lltypesystem/opimpl.py +++ b/pypy/rpython/lltypesystem/opimpl.py @@ -570,6 +570,9 @@ def op_jit_record_known_class(x, y): pass +def op_jit_record_vref(x): + pass + def op_get_group_member(TYPE, grpptr, memberoffset): from pypy.rpython.lltypesystem import llgroup assert isinstance(memberoffset, llgroup.GroupMemberOffset) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit