Author: fijal Branch: Changeset: r79970:6f4296b0d7fa Date: 2015-10-04 13:52 +0200 http://bitbucket.org/pypy/pypy/changeset/6f4296b0d7fa/
Log: fix rpython and tests diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py --- a/rpython/jit/metainterp/compile.py +++ b/rpython/jit/metainterp/compile.py @@ -673,29 +673,11 @@ class ResumeDescr(AbstractFailDescr): _attrs_ = () -class ResumeGuardDescr(ResumeDescr): - _attrs_ = ('rd_numb', 'rd_count', 'rd_consts', 'rd_virtuals', - 'rd_frame_info_list', 'rd_pendingfields', 'status') - - rd_numb = lltype.nullptr(NUMBERING) - rd_count = 0 - rd_consts = None - rd_virtuals = None - rd_frame_info_list = None - rd_pendingfields = lltype.nullptr(PENDINGFIELDSP.TO) +class AbstractResumeGuardDescr(ResumeDescr): + _attrs_ = ('status',) status = r_uint(0) - def copy_all_attributes_from(self, other): - assert isinstance(other, ResumeGuardDescr) - self.rd_count = other.rd_count - self.rd_consts = other.rd_consts - self.rd_frame_info_list = other.rd_frame_info_list - self.rd_pendingfields = other.rd_pendingfields - self.rd_virtuals = other.rd_virtuals - self.rd_numb = other.rd_numb - # we don't copy status - ST_BUSY_FLAG = 0x01 # if set, busy tracing from the guard ST_TYPE_MASK = 0x06 # mask for the type (TY_xxx) ST_SHIFT = 3 # in "status >> ST_SHIFT" is stored: @@ -707,15 +689,6 @@ TY_REF = 0x04 TY_FLOAT = 0x06 - def store_final_boxes(self, guard_op, boxes, metainterp_sd): - guard_op.setfailargs(boxes) - self.rd_count = len(boxes) - # - if metainterp_sd.warmrunnerdesc is not None: # for tests - jitcounter = metainterp_sd.warmrunnerdesc.jitcounter - hash = jitcounter.fetch_next_hash() - self.status = hash & self.ST_SHIFT_MASK - def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd): if self.must_compile(deadframe, metainterp_sd, jitdriver_sd): self.start_compiling() @@ -726,9 +699,14 @@ self.done_compiling() else: from rpython.jit.metainterp.blackhole import resume_in_blackhole - resume_in_blackhole(metainterp_sd, jitdriver_sd, self, deadframe) + if isinstance(self, ResumeGuardCopiedDescr): + resume_in_blackhole(metainterp_sd, jitdriver_sd, self.prev, deadframe) + else: + assert isinstance(self, ResumeGuardDescr) + resume_in_blackhole(metainterp_sd, jitdriver_sd, self, deadframe) assert 0, "unreachable" + def _trace_and_compile_from_bridge(self, deadframe, metainterp_sd, jitdriver_sd): # 'jitdriver_sd' corresponds to the outermost one, i.e. the one @@ -830,9 +808,53 @@ assert 0, box.type self.status = ty | (r_uint(index) << self.ST_SHIFT) + def store_hash(self, metainterp_sd): + if metainterp_sd.warmrunnerdesc is not None: # for tests + jitcounter = metainterp_sd.warmrunnerdesc.jitcounter + hash = jitcounter.fetch_next_hash() + self.status = hash & self.ST_SHIFT_MASK + +class ResumeGuardCopiedDescr(AbstractResumeGuardDescr): + _attrs_ = ('status', 'prev') + + def copy_all_attributes_from(self, other): + assert isinstance(other, ResumeGuardCopiedDescr) + self.prev = other.prev + +class ResumeGuardDescr(AbstractResumeGuardDescr): + _attrs_ = ('rd_numb', 'rd_count', 'rd_consts', 'rd_virtuals', + 'rd_frame_info_list', 'rd_pendingfields', 'status') + + rd_numb = lltype.nullptr(NUMBERING) + rd_count = 0 + rd_consts = None + rd_virtuals = None + rd_frame_info_list = None + rd_pendingfields = lltype.nullptr(PENDINGFIELDSP.TO) + + def copy_all_attributes_from(self, other): + if isinstance(other, ResumeGuardCopiedDescr): + other = other.prev + assert isinstance(other, ResumeGuardDescr) + self.rd_count = other.rd_count + self.rd_consts = other.rd_consts + self.rd_frame_info_list = other.rd_frame_info_list + self.rd_pendingfields = other.rd_pendingfields + self.rd_virtuals = other.rd_virtuals + self.rd_numb = other.rd_numb + # we don't copy status + + def store_final_boxes(self, guard_op, boxes, metainterp_sd): + guard_op.setfailargs(boxes) + self.rd_count = len(boxes) + self.store_hash(metainterp_sd) + class ResumeGuardExcDescr(ResumeGuardDescr): pass +class ResumeGuardCopiedExcDescr(ResumeGuardCopiedDescr): + pass + class ResumeAtPositionDescr(ResumeGuardDescr): pass @@ -853,6 +875,25 @@ ptr = cpu.ts.cast_to_baseclass(gcref) return cast_base_ptr_to_instance(AllVirtuals, ptr) +def invent_fail_descr_for_op(opnum, optimizer, copied_guard=False): + if opnum == rop.GUARD_NOT_FORCED or opnum == rop.GUARD_NOT_FORCED_2: + assert not copied_guard + resumedescr = ResumeGuardForcedDescr() + resumedescr._init(optimizer.metainterp_sd, optimizer.jitdriver_sd) + elif opnum in (rop.GUARD_IS_OBJECT, rop.GUARD_SUBCLASS, rop.GUARD_GC_TYPE): + # note - this only happens in tests + resumedescr = ResumeAtPositionDescr() + elif opnum in (rop.GUARD_EXCEPTION, rop.GUARD_NO_EXCEPTION): + if copied_guard: + resumedescr = ResumeGuardCopiedExcDescr() + else: + resumedescr = ResumeGuardExcDescr() + else: + if copied_guard: + resumedescr = ResumeGuardCopiedDescr() + else: + resumedescr = ResumeGuardDescr() + return resumedescr class ResumeGuardForcedDescr(ResumeGuardDescr): def _init(self, metainterp_sd, jitdriver_sd): @@ -889,7 +930,7 @@ rstack._stack_criticalcode_start() try: deadframe = cpu.force(token) - # this should set descr to ResumeGuardForceDescr, if it + # this should set descr to ResumeGuardForcedDescr, if it # was not that already faildescr = cpu.get_latest_descr(deadframe) assert isinstance(faildescr, ResumeGuardForcedDescr) @@ -913,19 +954,6 @@ hidden_all_virtuals = obj.hide(metainterp_sd.cpu) metainterp_sd.cpu.set_savedata_ref(deadframe, hidden_all_virtuals) -def invent_fail_descr_for_op(opnum, optimizer): - if opnum == rop.GUARD_NOT_FORCED or opnum == rop.GUARD_NOT_FORCED_2: - resumedescr = ResumeGuardForcedDescr() - resumedescr._init(optimizer.metainterp_sd, optimizer.jitdriver_sd) - elif opnum in (rop.GUARD_IS_OBJECT, rop.GUARD_SUBCLASS, rop.GUARD_GC_TYPE): - # note - this only happens in tests - resumedescr = ResumeAtPositionDescr() - elif opnum in (rop.GUARD_EXCEPTION, rop.GUARD_NO_EXCEPTION): - resumedescr = ResumeGuardExcDescr() - else: - resumedescr = ResumeGuardDescr() - return resumedescr - class ResumeFromInterpDescr(ResumeDescr): def __init__(self, original_greenkey): self.original_greenkey = original_greenkey diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py --- a/rpython/jit/metainterp/optimizeopt/optimizer.py +++ b/rpython/jit/metainterp/optimizeopt/optimizer.py @@ -636,11 +636,14 @@ def _copy_resume_data_from(self, guard_op, last_guard_op): if guard_op.getopnum() in (rop.GUARD_NO_EXCEPTION, rop.GUARD_EXCEPTION): assert last_guard_op.getopnum() == rop.GUARD_NOT_FORCED - descr = compile.invent_fail_descr_for_op(guard_op.getopnum(), self) - descr.copy_all_attributes_from(last_guard_op.getdescr()) + descr = compile.invent_fail_descr_for_op(guard_op.getopnum(), self, True) + assert isinstance(descr, compile.ResumeGuardCopiedDescr) + last_descr = last_guard_op.getdescr() + assert isinstance(descr, compile.ResumeGuardDescr) + descr.prev = last_descr guard_op.setdescr(descr) - descr.store_final_boxes(guard_op, last_guard_op.getfailargs(), - self.metainterp_sd) + guard_op.setfailargs(last_guard_op.getfailargs()) + descr.store_hash(self.metainterp_sd) assert isinstance(guard_op, GuardResOp) if guard_op.getopnum() == rop.GUARD_VALUE: guard_op = self._maybe_replace_guard_value(guard_op, descr) diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py --- a/rpython/jit/metainterp/pyjitpl.py +++ b/rpython/jit/metainterp/pyjitpl.py @@ -2302,9 +2302,13 @@ self.run_blackhole_interp_to_cancel_tracing(stb) assert False, "should always raise" - def handle_guard_failure(self, key, deadframe): + def handle_guard_failure(self, resumedescr, deadframe): debug_start('jit-tracing') self.staticdata.profiler.start_tracing() + if isinstance(resumedescr, compile.ResumeGuardCopiedDescr): + key = resumedescr.prev + else: + key = resumedescr assert isinstance(key, compile.ResumeGuardDescr) # store the resumekey.wref_original_loop_token() on 'self' to make # sure that it stays alive as long as this MetaInterp @@ -2314,15 +2318,15 @@ self.staticdata.try_to_free_some_loops() self.initialize_state_from_guard_failure(key, deadframe) try: - return self._handle_guard_failure(key, deadframe) + return self._handle_guard_failure(resumedescr, key, deadframe) finally: self.resumekey_original_loop_token = None self.staticdata.profiler.end_tracing() debug_stop('jit-tracing') - def _handle_guard_failure(self, key, deadframe): + def _handle_guard_failure(self, resumedescr, key, deadframe): self.current_merge_points = [] - self.resumekey = key + self.resumekey = resumedescr self.seen_loop_header_for_jdindex = -1 if isinstance(key, compile.ResumeAtPositionDescr): self.seen_loop_header_for_jdindex = self.jitdriver_sd.index _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit