[pypy-svn] r74831 - in pypy/branch/blackhole-improvement/pypy/jit: backend/llgraph metainterp metainterp/test
arigo at codespeak.net
arigo at codespeak.net
Fri May 28 02:57:46 CEST 2010
Author: arigo
Date: Fri May 28 02:57:45 2010
New Revision: 74831
Modified:
pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/compile.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_virtualref.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/virtualref.py
Log:
I think that's all for virtualrefs.
Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py Fri May 28 02:57:45 2010
@@ -245,7 +245,7 @@
def get_latest_force_token(self):
token = llimpl.get_frame_forced_token(self.latest_frame)
- return self.cast_adr_to_int(token)
+ return llmemory.cast_adr_to_int(token)
def clear_latest_values(self):
llimpl.frame_clear_latest_values(self.latest_frame)
@@ -426,7 +426,7 @@
return llimpl.cast_to_int(ptr)
def force(self, force_token):
- token = self.cast_int_to_adr(force_token)
+ token = llmemory.cast_int_to_adr(force_token)
frame = llimpl.get_forced_token_frame(token)
fail_index = llimpl.force(frame)
self.latest_frame = frame
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py Fri May 28 02:57:45 2010
@@ -1247,14 +1247,15 @@
current_exc = blackholeinterp._resume_mainloop(current_exc)
blackholeinterp = blackholeinterp.nextblackholeinterp
-def resume_in_blackhole(metainterp_sd, resumedescr):
+def resume_in_blackhole(metainterp_sd, resumedescr, all_virtuals=None):
from pypy.jit.metainterp.resume import blackhole_from_resumedata
debug_start('jit-blackhole')
metainterp_sd.profiler.start_blackhole()
blackholeinterp = blackhole_from_resumedata(
metainterp_sd.blackholeinterpbuilder,
resumedescr,
- False) # XXX
+ False,
+ all_virtuals) # XXX
# XXX virtualrefs
# XXX virtualizable
current_exc = blackholeinterp._prepare_resume_from_failure(
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/compile.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/compile.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/compile.py Fri May 28 02:57:45 2010
@@ -324,17 +324,16 @@
class ResumeGuardForcedDescr(ResumeGuardDescr):
def handle_fail(self, metainterp_sd):
- from pypy.jit.metainterp.pyjitpl import MetaInterp
- metainterp = MetaInterp(metainterp_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
+ # handle_async_forcing() just a moment ago.
+ from pypy.jit.metainterp.blackhole import resume_in_blackhole
token = metainterp_sd.cpu.get_latest_force_token()
all_virtuals = self.fetch_data(token)
if all_virtuals is None:
all_virtuals = []
- metainterp._already_allocated_resume_virtuals = all_virtuals
- return metainterp.handle_guard_failure(self)
-
- def must_compile(self, metainterp_sd, inputargs_and_holes):
- return False # never compile GUARD_NOT_FORCED failures
+ resume_in_blackhole(metainterp_sd, self, all_virtuals)
@staticmethod
def force_now(cpu, token):
@@ -346,27 +345,11 @@
faildescr.handle_async_forcing(token)
def handle_async_forcing(self, force_token):
- from pypy.jit.metainterp.pyjitpl import MetaInterp
from pypy.jit.metainterp.resume import force_from_resumedata
- # To handle the forcing itself, we create a temporary MetaInterp
- # as a convenience to move the various data to its proper place.
metainterp_sd = self.metainterp_sd
- metainterp = MetaInterp(metainterp_sd)
- metainterp.history = None # blackholing
- liveboxes = metainterp_sd.cpu.make_boxes_from_latest_values(self)
- #
expect_virtualizable = metainterp_sd.virtualizable_info is not None
- forced_data = force_from_resumedata(metainterp, liveboxes, self,
+ all_virtuals = force_from_resumedata(metainterp_sd, self,
expect_virtualizable)
- virtualizable_boxes, virtualref_boxes, all_virtuals = forced_data
- #
- # Handle virtualref_boxes: mark each JIT_VIRTUAL_REF as forced
- vrefinfo = metainterp_sd.virtualref_info
- for i in range(0, len(virtualref_boxes), 2):
- virtualbox = virtualref_boxes[i]
- vrefbox = virtualref_boxes[i+1]
- vrefinfo.forced_single_vref(vrefbox.getref_base(),
- virtualbox.getref_base())
# Handle virtualizable_boxes: store them on the real virtualizable now
if expect_virtualizable:
metainterp_sd.virtualizable_info.forced_vable(virtualizable_boxes)
@@ -376,14 +359,30 @@
def save_data(self, key, value):
globaldata = self.metainterp_sd.globaldata
- assert key not in globaldata.resume_virtuals
- globaldata.resume_virtuals[key] = value
+ if we_are_translated():
+ assert key not in globaldata.resume_virtuals
+ globaldata.resume_virtuals[key] = value
+ else:
+ rv = globaldata.resume_virtuals_not_translated
+ for key1, value1 in rv:
+ assert key1 != key
+ rv.append((key, value))
def fetch_data(self, key):
globaldata = self.metainterp_sd.globaldata
- assert key in globaldata.resume_virtuals
- data = globaldata.resume_virtuals[key]
- del globaldata.resume_virtuals[key]
+ if we_are_translated():
+ assert key in globaldata.resume_virtuals
+ data = globaldata.resume_virtuals[key]
+ del globaldata.resume_virtuals[key]
+ else:
+ rv = globaldata.resume_virtuals_not_translated
+ for i in range(len(rv)):
+ if rv[i][0] == key:
+ data = rv[i][1]
+ del rv[i]
+ break
+ else:
+ assert 0, "not found: %r" % (key,)
return data
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py Fri May 28 02:57:45 2010
@@ -1202,6 +1202,7 @@
self.addr2name = None
self.loopnumbering = 0
self.resume_virtuals = {}
+ self.resume_virtuals_not_translated = []
#
state = staticdata.state
if state is not None:
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/resume.py Fri May 28 02:57:45 2010
@@ -496,10 +496,12 @@
_mixin_ = True
virtuals = None
- def _prepare(self, cpu, storage):
+ def _init(self, cpu, storage):
self.cpu = cpu
self.cur_numb = storage.rd_numb
self.consts = storage.rd_consts
+
+ def _prepare(self, storage):
self._prepare_virtuals(storage.rd_virtuals)
self._prepare_pendingfields(storage.rd_pendingfields)
@@ -566,21 +568,13 @@
resumereader.done()
return resumereader.liveboxes, None, virtualref_boxes
-def force_from_resumedata(metainterp, newboxes, storage,
- expects_virtualizables):
- resumereader = ResumeDataReader(storage, newboxes, metainterp)
- virtualizable_boxes = None
- if expects_virtualizables:
- virtualizable_boxes = resumereader.consume_boxes()
- virtualref_boxes = resumereader.consume_boxes()
- return virtualizable_boxes, virtualref_boxes, resumereader.virtuals
-
class ResumeDataBoxReader(AbstractResumeDataReader):
def __init__(self, storage, metainterp):
+ self._init(metainterp.cpu, storage)
self.metainterp = metainterp
self.liveboxes = [None] * metainterp.cpu.get_latest_value_count()
- self._prepare(metainterp.cpu, storage)
+ self._prepare(storage)
def consume_boxes(self, info, boxes_i, boxes_r, boxes_f):
self.boxes_i = boxes_i
@@ -685,8 +679,9 @@
# ---------- when resuming for blackholing, get direct values ----------
def blackhole_from_resumedata(blackholeinterpbuilder, storage,
- expects_virtualizables):
- resumereader = ResumeDataDirectReader(blackholeinterpbuilder.cpu, storage)
+ expects_virtualizables, all_virtuals=None):
+ resumereader = ResumeDataDirectReader(blackholeinterpbuilder.cpu, storage,
+ all_virtuals)
if expects_virtualizables:
XXX
vrefinfo = blackholeinterpbuilder.metainterp_sd.virtualref_info
@@ -720,10 +715,25 @@
resumereader.done()
return firstbh
+def force_from_resumedata(metainterp_sd, storage, expects_virtualizables):
+ resumereader = ResumeDataDirectReader(metainterp_sd.cpu, storage)
+ virtualizable_boxes = None
+ if expects_virtualizables:
+ XXX
+ vrefinfo = metainterp_sd.virtualref_info
+ resumereader.consume_virtualref_info(vrefinfo)
+ return resumereader.virtuals
+
class ResumeDataDirectReader(AbstractResumeDataReader):
- def __init__(self, cpu, storage):
- self._prepare(cpu, storage)
+ def __init__(self, cpu, storage, all_virtuals=None):
+ self._init(cpu, storage)
+ if all_virtuals is None: # common case
+ self._prepare(storage)
+ else:
+ # special case for resuming after a GUARD_NOT_FORCED: we already
+ # have the virtuals
+ self.virtuals = all_virtuals
def consume_one_section(self, blackholeinterp):
self.blackholeinterp = blackholeinterp
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_virtualref.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_virtualref.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/test/test_virtualref.py Fri May 28 02:57:45 2010
@@ -442,7 +442,7 @@
self.check_aborted_count(0)
def test_recursive_call_1(self):
- myjitdriver = JitDriver(greens = [], reds = ['n', 'frame', 'rec'])
+ myjitdriver = JitDriver(greens = [], reds = ['n', 'rec', 'frame'])
#
class XY:
pass
@@ -472,7 +472,7 @@
self.check_aborted_count(0)
def test_recursive_call_2(self):
- myjitdriver = JitDriver(greens = [], reds = ['n', 'frame', 'rec'])
+ myjitdriver = JitDriver(greens = [], reds = ['n', 'rec', 'frame'])
#
class XY:
n = 0
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/virtualref.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/virtualref.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/virtualref.py Fri May 28 02:57:45 2010
@@ -61,11 +61,11 @@
# The 'virtual_token' field has the same meaning as the 'vable_token' field
# of a virtualizable. It is equal to:
- # * -2 (TOKEN_NONE) when tracing, except as described below;
+ # * -3 (TOKEN_NONE) when tracing, except as described below;
# * -1 (TOKEN_TRACING_RESCALL) during tracing when we do a residual call;
# * addr in the CPU stack (set by FORCE_TOKEN) when running the assembler;
- # * -2 (TOKEN_NONE) after the virtual is forced, if it is forced at all.
- TOKEN_NONE = -2
+ # * -3 (TOKEN_NONE) after the virtual is forced, if it is forced at all.
+ TOKEN_NONE = -3
TOKEN_TRACING_RESCALL = -1
def virtual_ref_during_tracing(self, real_object):
@@ -105,16 +105,6 @@
# marker "modified during residual call" set.
return True
- def forced_single_vref(self, gcref, real_object):
- if not self.is_virtual_ref(gcref):
- return
- assert real_object
- vref = lltype.cast_opaque_ptr(lltype.Ptr(self.JIT_VIRTUAL_REF), gcref)
- assert (vref.virtual_token != self.TOKEN_NONE and
- vref.virtual_token != self.TOKEN_TRACING_RESCALL)
- vref.virtual_token = self.TOKEN_NONE
- vref.forced = lltype.cast_opaque_ptr(rclass.OBJECTPTR, real_object)
-
def continue_tracing(self, gcref, real_object):
if not self.is_virtual_ref(gcref):
return
More information about the Pypy-commit
mailing list