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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit