Author: Armin Rigo <[email protected]>
Branch: remove-globals-in-jit
Changeset: r58894:09635126c014
Date: 2012-11-14 16:31 +0100
http://bitbucket.org/pypy/pypy/changeset/09635126c014/
Log: 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
@@ -415,34 +415,34 @@
pass
class DoneWithThisFrameDescrVoid(_DoneWithThisFrameDescr):
- def handle_fail(self, metainterp_sd, jitdriver_sd):
+ def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
assert jitdriver_sd.result_type == history.VOID
raise metainterp_sd.DoneWithThisFrameVoid()
class DoneWithThisFrameDescrInt(_DoneWithThisFrameDescr):
- def handle_fail(self, metainterp_sd, jitdriver_sd):
+ def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
assert jitdriver_sd.result_type == history.INT
- result = metainterp_sd.cpu.get_latest_value_int(0)
+ result = metainterp_sd.cpu.get_latest_value_int(deadframe, 0)
raise metainterp_sd.DoneWithThisFrameInt(result)
class DoneWithThisFrameDescrRef(_DoneWithThisFrameDescr):
- def handle_fail(self, metainterp_sd, jitdriver_sd):
+ def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
assert jitdriver_sd.result_type == history.REF
cpu = metainterp_sd.cpu
- result = cpu.get_latest_value_ref(0)
+ result = cpu.get_latest_value_ref(deadframe, 0)
cpu.clear_latest_values(1)
raise metainterp_sd.DoneWithThisFrameRef(cpu, result)
class DoneWithThisFrameDescrFloat(_DoneWithThisFrameDescr):
- def handle_fail(self, metainterp_sd, jitdriver_sd):
+ def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
assert jitdriver_sd.result_type == history.FLOAT
- result = metainterp_sd.cpu.get_latest_value_float(0)
+ result = metainterp_sd.cpu.get_latest_value_float(deadframe, 0)
raise metainterp_sd.DoneWithThisFrameFloat(result)
class ExitFrameWithExceptionDescrRef(_DoneWithThisFrameDescr):
- def handle_fail(self, metainterp_sd, jitdriver_sd):
+ def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
cpu = metainterp_sd.cpu
- value = cpu.get_latest_value_ref(0)
+ value = cpu.get_latest_value_ref(deadframe, 0)
cpu.clear_latest_values(1)
raise metainterp_sd.ExitFrameWithExceptionRef(cpu, value)
@@ -530,7 +530,7 @@
if self.must_compile(metainterp_sd, jitdriver_sd):
self.start_compiling()
try:
- self._trace_and_compile_from_bridge(metainterp_sd,
+ self._trace_and_compile_from_bridge(deadframe, metainterp_sd,
jitdriver_sd)
finally:
self.done_compiling()
@@ -539,14 +539,15 @@
resume_in_blackhole(metainterp_sd, jitdriver_sd, self, deadframe)
assert 0, "unreachable"
- def _trace_and_compile_from_bridge(self, metainterp_sd, jitdriver_sd):
+ def _trace_and_compile_from_bridge(self, deadframe, metainterp_sd,
+ jitdriver_sd):
# 'jitdriver_sd' corresponds to the outermost one, i.e. the one
# of the jit_merge_point where we started the loop, even if the
# loop itself may contain temporarily recursion into other
# jitdrivers.
from pypy.jit.metainterp.pyjitpl import MetaInterp
metainterp = MetaInterp(metainterp_sd, jitdriver_sd)
- metainterp.handle_guard_failure(self)
+ metainterp.handle_guard_failure(self, deadframe)
_trace_and_compile_from_bridge._dont_inline_ = True
def must_compile(self, metainterp_sd, jitdriver_sd):
@@ -652,7 +653,7 @@
self.metainterp_sd = metainterp_sd
self.jitdriver_sd = jitdriver_sd
- def handle_fail(self, metainterp_sd, jitdriver_sd):
+ def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
# Failures of a GUARD_NOT_FORCED are never compiled, but
# always just blackholed. First fish for the data saved when
# the virtualrefs and virtualizable have been forced by
@@ -858,9 +859,9 @@
# ____________________________________________________________
class PropagateExceptionDescr(AbstractFailDescr):
- def handle_fail(self, metainterp_sd, jitdriver_sd):
+ def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
cpu = metainterp_sd.cpu
- exception = cpu.grab_exc_value()
+ exception = cpu.grab_exc_value(deadframe)
assert exception, "PropagateExceptionDescr: no exception??"
raise metainterp_sd.ExitFrameWithExceptionRef(cpu, exception)
diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -1886,7 +1886,7 @@
self.run_blackhole_interp_to_cancel_tracing(stb)
assert False, "should always raise"
- def handle_guard_failure(self, key):
+ def handle_guard_failure(self, key, deadframe):
debug_start('jit-tracing')
self.staticdata.profiler.start_tracing()
assert isinstance(key, compile.ResumeGuardDescr)
@@ -1894,7 +1894,7 @@
# sure that it stays alive as long as this MetaInterp
self.resumekey_original_loop_token = key.wref_original_loop_token()
self.staticdata.try_to_free_some_loops()
- self.initialize_state_from_guard_failure(key)
+ self.initialize_state_from_guard_failure(key, deadframe)
try:
return self._handle_guard_failure(key)
finally:
@@ -2224,7 +2224,7 @@
self.initialize_withgreenfields(original_boxes)
self.initialize_virtualizable(original_boxes)
- def initialize_state_from_guard_failure(self, resumedescr):
+ def initialize_state_from_guard_failure(self, resumedescr, deadframe):
# guard failure: rebuild a complete MIFrame stack
# This is stack-critical code: it must not be interrupted by
StackOverflow,
# otherwise the jit_virtual_refs are left in a dangling state.
@@ -2232,7 +2232,8 @@
try:
self.portal_call_depth = -1 # always one portal around
self.history = history.History()
- inputargs_and_holes = self.rebuild_state_after_failure(resumedescr)
+ inputargs_and_holes = self.rebuild_state_after_failure(resumedescr,
+ deadframe)
self.history.inputargs = [box for box in inputargs_and_holes if
box]
finally:
rstack._stack_criticalcode_stop()
@@ -2351,12 +2352,12 @@
def assert_no_exception(self):
assert self.last_exc_value_box is None
- def rebuild_state_after_failure(self, resumedescr):
+ def rebuild_state_after_failure(self, resumedescr, deadframe):
vinfo = self.jitdriver_sd.virtualizable_info
ginfo = self.jitdriver_sd.greenfield_info
self.framestack = []
- boxlists = resume.rebuild_from_resumedata(self, resumedescr, vinfo,
- ginfo)
+ boxlists = resume.rebuild_from_resumedata(self, resumedescr, deadframe,
+ vinfo, ginfo)
inputargs_and_holes, virtualizable_boxes, virtualref_boxes = boxlists
#
# virtual refs: make the vrefs point to the freshly allocated virtuals
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
@@ -772,9 +772,9 @@
# ---------- when resuming for pyjitpl.py, make boxes ----------
-def rebuild_from_resumedata(metainterp, storage, virtualizable_info,
- greenfield_info):
- resumereader = ResumeDataBoxReader(storage, metainterp)
+def rebuild_from_resumedata(metainterp, storage, deadframe,
+ virtualizable_info, greenfield_info):
+ resumereader = ResumeDataBoxReader(storage, deadframe, metainterp)
boxes = resumereader.consume_vref_and_vable_boxes(virtualizable_info,
greenfield_info)
virtualizable_boxes, virtualref_boxes = boxes
@@ -793,10 +793,12 @@
class ResumeDataBoxReader(AbstractResumeDataReader):
unique_id = lambda: None
- def __init__(self, storage, metainterp):
+ def __init__(self, storage, deadframe, metainterp):
self._init(metainterp.cpu, storage)
+ self.deadframe = deadframe
self.metainterp = metainterp
- self.liveboxes = [None] * metainterp.cpu.get_latest_value_count()
+ count = metainterp.cpu.get_latest_value_count(deadframe)
+ self.liveboxes = [None] * count
self._prepare(storage)
def consume_boxes(self, info, boxes_i, boxes_r, boxes_f):
@@ -972,11 +974,11 @@
num += len(self.liveboxes)
assert num >= 0
if kind == INT:
- box = BoxInt(self.cpu.get_latest_value_int(num))
+ box = BoxInt(self.cpu.get_latest_value_int(self.deadframe, num))
elif kind == REF:
- box = BoxPtr(self.cpu.get_latest_value_ref(num))
+ box = BoxPtr(self.cpu.get_latest_value_ref(self.deadframe, num))
elif kind == FLOAT:
- box = BoxFloat(self.cpu.get_latest_value_float(num))
+ box = BoxFloat(self.cpu.get_latest_value_float(self.deadframe,num))
else:
assert 0, "bad kind: %d" % ord(kind)
self.liveboxes[num] = box
@@ -1253,7 +1255,7 @@
assert tag == TAGBOX
if num < 0:
num += self.cpu.get_latest_value_count()
- return self.cpu.get_latest_value_ref(num)
+ return self.cpu.get_latest_value_ref(self.deadframe, num)
def decode_float(self, tagged):
num, tag = untag(tagged)
@@ -1263,7 +1265,7 @@
assert tag == TAGBOX
if num < 0:
num += self.cpu.get_latest_value_count()
- return self.cpu.get_latest_value_float(num)
+ return self.cpu.get_latest_value_float(self.deadframe, num)
def write_an_int(self, index, int):
self.blackholeinterp.setarg_i(index, int)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit