[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