Author: Maciej Fijalkowski <[email protected]>
Branch: resume-refactor
Changeset: r68638:7c8b3cf8c3b5
Date: 2014-01-12 17:37 +0100
http://bitbucket.org/pypy/pypy/changeset/7c8b3cf8c3b5/

Log:    hack enough to get the first frontend test passing

diff --git a/rpython/jit/backend/llgraph/runner.py 
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -68,6 +68,9 @@
     def process_leave_frame(self, op):
         self.framestack.pop()
 
+    def process_resume_set_pc(self, op):
+        pass
+
     def process_resume_put(self, op):
         box = op.getarg(0)
         frame_pos = op.getarg(1).getint()
diff --git a/rpython/jit/backend/resumebuilder.py 
b/rpython/jit/backend/resumebuilder.py
--- a/rpython/jit/backend/resumebuilder.py
+++ b/rpython/jit/backend/resumebuilder.py
@@ -27,6 +27,9 @@
     def resume_setfield_gc(self, arg0, arg1, descr):
         self.deps[arg0][descr] = arg1
 
+    def resume_set_pc(self, pc):
+        pass
+
     def _track(self, allboxes, box):
         if box in self.deps:
             for dep in self.deps[box].values():
diff --git a/rpython/jit/metainterp/blackhole.py 
b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -2,7 +2,7 @@
 from rpython.jit.codewriter.jitcode import JitCode, SwitchDictDescr
 from rpython.jit.metainterp.compile import ResumeAtPositionDescr
 from rpython.jit.metainterp.jitexc import get_llexception, reraise
-from rpython.jit.metainterp import jitexc
+from rpython.jit.metainterp import jitexc, resume2
 from rpython.rlib import longlong2float
 from rpython.rlib.debug import ll_assert, make_sure_not_resized
 from rpython.rlib.objectmodel import we_are_translated
@@ -1608,11 +1608,10 @@
 
 def resume_in_blackhole(metainterp_sd, jitdriver_sd, resumedescr, deadframe,
                         all_virtuals=None):
-    from rpython.jit.metainterp.resume import blackhole_from_resumedata
     #debug_start('jit-blackhole')
-    blackholeinterp = blackhole_from_resumedata(
+    blackholeinterp = resume2.blackhole_from_resumedata(
         metainterp_sd.blackholeinterpbuilder,
-        jitdriver_sd,
+        metainterp_sd,
         resumedescr,
         deadframe,
         all_virtuals)
diff --git a/rpython/jit/metainterp/history.py 
b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -133,14 +133,6 @@
     def repr_of_descr(self):
         return '%r' % (self,)
 
-    def _clone_if_mutable(self):
-        return self
-    def clone_if_mutable(self):
-        clone = self._clone_if_mutable()
-        if not we_are_translated():
-            assert clone.__class__ is self.__class__
-        return clone
-
     def hide(self, cpu):
         descr_ptr = cpu.ts.cast_instance_to_base_ref(self)
         return cpu.ts.cast_to_ref(descr_ptr)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py 
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -291,20 +291,6 @@
             retrace_limit = 5
             max_retrace_guards = 15
 
-class Storage(compile.ResumeGuardDescr):
-    "for tests."
-    def __init__(self, metainterp_sd=None, original_greenkey=None):
-        self.metainterp_sd = metainterp_sd
-        self.original_greenkey = original_greenkey
-    def store_final_boxes(self, op, boxes):
-        op.setfailargs(boxes)
-    def __eq__(self, other):
-        return type(self) is type(other)      # xxx obscure
-    def clone_if_mutable(self):
-        res = Storage(self.metainterp_sd, self.original_greenkey)
-        self.copy_all_attributes_into(res)
-        return res
-
 def _sortboxes(boxes):
     _kind2count = {history.INT: 1, history.REF: 2, history.FLOAT: 3}
     return sorted(boxes, key=lambda box: _kind2count[box.type])
@@ -399,23 +385,6 @@
         return preamble
 
 
-class FakeDescr(compile.ResumeGuardDescr):
-    def clone_if_mutable(self):
-        return FakeDescr()
-    def __eq__(self, other):
-        return isinstance(other, FakeDescr)
-
-class FakeDescrWithSnapshot(compile.ResumeGuardDescr):
-    class rd_snapshot:
-        class prev:
-            prev = None
-            boxes = []
-        boxes = []
-    def clone_if_mutable(self):
-        return FakeDescrWithSnapshot()
-    def __eq__(self, other):
-        return isinstance(other, Storage) or isinstance(other, 
FakeDescrWithSnapshot)
-
 
 def convert_old_style_to_targets(loop, jump):
     newloop = TreeLoop(loop.name)
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
@@ -5,7 +5,7 @@
 from rpython.jit.codewriter import heaptracker
 from rpython.jit.codewriter.effectinfo import EffectInfo
 from rpython.jit.codewriter.jitcode import JitCode, SwitchDictDescr
-from rpython.jit.metainterp import history, compile, resume, executor, jitexc
+from rpython.jit.metainterp import history, compile, resume2, executor, jitexc
 from rpython.jit.metainterp.heapcache import HeapCache
 from rpython.jit.metainterp.history import (Const, ConstInt, ConstPtr,
     ConstFloat, Box, TargetToken)
@@ -41,9 +41,11 @@
         self.registers_i = [None] * 256
         self.registers_r = [None] * 256
         self.registers_f = [None] * 256
+        self.resume_cache = {}
 
     def setup(self, jitcode, greenkey=None):
         assert isinstance(jitcode, JitCode)
+        self.resume_cache = {}
         self.jitcode = jitcode
         self.bytecode = jitcode.code
         # this is not None for frames that are recursive portal calls
@@ -1458,6 +1460,31 @@
         # but we should not follow calls to that graph
         return self.do_residual_call(funcbox, argboxes, calldescr, pc)
 
+    def emit_resume_data(self, pos):
+        i = 0
+        history = self.metainterp.history
+        for i in range(self.jitcode.num_regs_i()):
+            box = self.registers_i[i]
+            if box is not None and box not in self.resume_cache:
+                history.record(rop.RESUME_PUT,
+                               [box, ConstInt(pos), ConstInt(i)], None)
+                self.resume_cache[box] = None
+        start = self.jitcode.num_regs_i()
+        for i in range(self.jitcode.num_regs_r()):
+            box = self.registers_r[i]
+            if box is not None and box not in self.resume_cache:
+                history.record(rop.RESUME_PUT,
+                               [box, ConstInt(pos), ConstInt(i + start)], None)
+                self.resume_cache[box] = None
+        start = self.jitcode.num_regs_i() + self.jitcode.num_regs_r()
+        for i in range(self.jitcode.num_regs_f()):
+            box = self.registers_f[i]
+            if box is not None and box not in self.resume_cache:
+                history.record(rop.RESUME_PUT,
+                               [box, ConstInt(pos), ConstInt(i + start)], None)
+                self.resume_cache[box] = None
+        history.record(rop.RESUME_SET_PC, [ConstInt(self.pc)], None)
+
 # ____________________________________________________________
 
 class MetaInterpStaticData(object):
@@ -1672,6 +1699,12 @@
         return self.jitdriver_sd is not None and jitcode is 
self.jitdriver_sd.mainjitcode
 
     def newframe(self, jitcode, greenkey=None):
+        if self.framestack:
+            pc = self.framestack[-1].pc
+        else:
+            pc = -1
+        self.history.record(rop.ENTER_FRAME, [ConstInt(pc)], None,
+                            descr=jitcode)
         if jitcode.is_portal:
             self.portal_call_depth += 1
             self.call_ids.append(self.current_call_id)
@@ -1688,6 +1721,7 @@
         return f
 
     def popframe(self):
+        self.history.record(rop.LEAVE_FRAME, [], None)
         frame = self.framestack.pop()
         jitcode = frame.jitcode
         if jitcode.is_portal:
@@ -1786,15 +1820,21 @@
             resumedescr = compile.ResumeGuardNotInvalidated()
         else:
             resumedescr = compile.ResumeGuardDescr()
+            resumedescr.guard_opnum = opnum # XXX kill me
+        self.sync_resume_data(resumedescr, resumepc)
         guard_op = self.history.record(opnum, moreargs, None,
                                              descr=resumedescr)
-        #self.capture_resumedata(resumedescr, resumepc)
         self.staticdata.profiler.count_ops(opnum, Counters.GUARDS)
         # count
         self.attach_debug_info(guard_op)
         return guard_op
-
+    
+    def sync_resume_data(self, resumedescr, resumepc):
+        for i, frame in enumerate(self.framestack):
+            frame.emit_resume_data(i)
+    
     def capture_resumedata(self, resumedescr, resumepc=-1):
+        XXXX
         virtualizable_boxes = None
         if (self.jitdriver_sd.virtualizable_info is not None or
             self.jitdriver_sd.greenfield_info is not None):
@@ -1805,6 +1845,7 @@
             saved_pc = frame.pc
             if resumepc >= 0:
                 frame.pc = resumepc
+        xxx
         resume.capture_resumedata(self.framestack, virtualizable_boxes,
                                   self.virtualref_boxes, resumedescr)
         if self.framestack:
@@ -2490,6 +2531,7 @@
         vinfo = self.jitdriver_sd.virtualizable_info
         ginfo = self.jitdriver_sd.greenfield_info
         self.framestack = []
+        xxx
         boxlists = resume.rebuild_from_resumedata(self, resumedescr, deadframe,
                                                   vinfo, ginfo)
         inputargs_and_holes, virtualizable_boxes, virtualref_boxes = boxlists
diff --git a/rpython/jit/metainterp/resoperation.py 
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -80,8 +80,6 @@
     def clone(self):
         args = self.getarglist()
         descr = self.getdescr()
-        if descr is not None:
-            descr = descr.clone_if_mutable()
         op = ResOperation(self.getopnum(), args[:], self.result, descr)
         if not we_are_translated():
             op.name = self.name
@@ -477,6 +475,7 @@
                     # frontend
     'RESUME_NEW/0d',
     'RESUME_SETFIELD_GC/2d',
+    'RESUME_SET_PC/1',
     '_RESUME_LAST', # ----- end of resume only operations ------
     '_NOSIDEEFFECT_LAST', # ----- end of no_side_effect operations -----
 
diff --git a/rpython/jit/metainterp/resume2.py 
b/rpython/jit/metainterp/resume2.py
--- a/rpython/jit/metainterp/resume2.py
+++ b/rpython/jit/metainterp/resume2.py
@@ -2,6 +2,7 @@
 from rpython.jit.metainterp.resoperation import rop
 from rpython.jit.metainterp.history import BoxInt
 from rpython.jit.codewriter.jitcode import JitCode
+from rpython.rlib import rstack
 
 class ResumeBytecode(object):
     def __init__(self, opcodes, parent=None, parent_position=-1, loop=None):
@@ -41,6 +42,8 @@
             elif op.getopnum() == rop.RESUME_SETFIELD_GC:
                 self.resume_setfield_gc(op.getarg(0), op.getarg(1),
                                         op.getdescr())
+            elif op.getopnum() == rop.RESUME_SET_PC:
+                self.resume_set_pc(op.getarg(0).getint())
             elif not op.is_resume():
                 pos += 1
                 continue
@@ -50,24 +53,56 @@
 
     def resume_put(self, jitframe_pos_const, frame_no, frontend_position):
         jitframe_pos = jitframe_pos_const.getint()
-        jitcode = self.metainterp.framestack[frame_no].jitcode
-        frame = self.metainterp.framestack[frame_no]
+        jitcode = self.get_jitcode(frame_no)
         if frontend_position < jitcode.num_regs_i():
-            self.put_box_int(frame, frontend_position, jitframe_pos)
+            self.put_box_int(frame_no, frontend_position, jitframe_pos)
         elif frontend_position < (jitcode.num_regs_r() + jitcode.num_regs_i()):
-            self.put_box_ref(frame, frontend_position - jitcode.num_regs_i(),
+            self.put_box_ref(frame_no, frontend_position - 
jitcode.num_regs_i(),
                              jitframe_pos)
         else:
             assert frontend_position < jitcode.num_regs()
-            self.put_box_float(frame, frontend_position - jitcode.num_regs_r()
+            self.put_box_float(frame_no,
+                               frontend_position - jitcode.num_regs_r()
                                - jitcode.num_regs_i(), jitframe_pos)
 
     def read_int(self, jitframe_pos):
         return self.metainterp.cpu.get_int_value(self.deadframe, jitframe_pos)
 
 class DirectResumeReader(AbstractResumeReader):
-    def __init__(self, *args):
-        xxx
+    def __init__(self, binterpbuilder, cpu, deadframe):
+        self.bhinterpbuilder = binterpbuilder
+        self.cpu = cpu
+        self.deadframe = deadframe
+        self.bhinterp_stack = []
+
+    def get_jitcode(self, no):
+        return self.bhinterp_stack[no].jitcode
+
+    def get_frame(self, no):
+        return self.bhinterp_stack[no]
+
+    def enter_frame(self, pc, jitcode):
+        if pc != -1:
+            self.bhinterp_stack[-1].position = pc
+        self.bhinterp_stack.append(self.bhinterpbuilder.acquire_interp())
+        self.bhinterp_stack[-1].setposition(jitcode, 0)
+
+    def put_box_int(self, frame_no, frontend_position, jitframe_pos):
+        val = self.cpu.get_int_value(self.deadframe, jitframe_pos)
+        self.bhinterp_stack[frame_no].registers_i[frontend_position] = val
+
+    def resume_set_pc(self, pc):
+        self.bhinterp_stack[-1].position = pc
+
+    def leave_frame(self):
+        bhinterp = self.bhinterp_stack.pop()
+        self.bhinterpbuilder.release_interp(bhinterp)
+
+    def finish(self):
+        self.bhinterp_stack[0].nextblackholeinterp = None
+        for i in range(1, len(self.bhinterp_stack)):
+            self.bhinterp_stack[i].nextblackholeinterp = self.bhinterp_stack[i 
- 1]
+        return self.bhinterp_stack[-1]
 
 class BoxResumeReader(AbstractResumeReader):
     def __init__(self, metainterp, deadframe):
@@ -82,14 +117,17 @@
     def leave_frame(self):
         self.metainterp.popframe()
 
-    def put_box_int(self, frame, position, jitframe_pos):
+    def put_box_int(self, frame_no, position, jitframe_pos):
+        frame = self.metainterp.framestack[frame_no]
         frame.registers_i[position] = BoxInt(self.read_int(jitframe_pos))
 
-    def put_box_ref(self, frame, position, jitframe_pos):
+    def put_box_ref(self, frame_no, position, jitframe_pos):
+        frame = self.metainterp.framestack[frame_no]
         xxx
         frame.registers_r[position] = self.read_ref(jitframe_pos)
 
-    def put_box_float(self, frame, position, jitframe_pos):
+    def put_box_float(self, frame_no, position, jitframe_pos):
+        frame = self.metainterp.framestack[frame_no]
         xxx
         frame.registers_f[position] = self.read_float(jitframe_pos)
 
@@ -99,3 +137,16 @@
 def rebuild_from_resumedata(metainterp, deadframe, faildescr):
     BoxResumeReader(metainterp, deadframe).rebuild(faildescr)
 
+def blackhole_from_resumedata(interpbuilder, metainterp_sd, faildescr,
+                              deadframe, all_virtuals=None):
+    assert all_virtuals is None
+    #rstack._stack_criticalcode_start()
+    #try:
+    #    xxx consume vrefs and random shit
+    #finally:
+    #    rstack._stack_criticalcode_stop()
+    cpu = metainterp_sd.cpu
+    last_bhinterp = DirectResumeReader(interpbuilder, cpu,
+                                       deadframe).rebuild(faildescr)
+    
+    return last_bhinterp
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to