Author: Maciej Fijalkowski <[email protected]>
Branch: resume-refactor
Changeset: r68640:c2ad1730a302
Date: 2014-01-13 11:53 +0100
http://bitbucket.org/pypy/pypy/changeset/c2ad1730a302/

Log:    (fijal, rguillebert) don't eagerly create frames, but instead do the
        computations symbolically

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
@@ -48,6 +48,9 @@
     def leave_frame(self):
         self.framestack.pop()
 
+    def rebuild(self, faildescr):
+        raise Exception("should not be called")
+
 class ResumeBuilder(object):
     def __init__(self, regalloc, frontend_liveness, descr, inputframes=None,
                  inputlocs=None):
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
@@ -2409,8 +2409,8 @@
         try:
             self.portal_call_depth = -1 # always one portal around
             self.history = history.History()
-            inputargs_and_holes = self.rebuild_state_after_failure(resumedescr,
-                                                                   deadframe)
+            self.rebuild_state_after_failure(resumedescr, deadframe)
+            xxx
             self.history.inputargs = [box for box in inputargs_and_holes if 
box]
         finally:
             rstack._stack_criticalcode_stop()
@@ -2531,10 +2531,10 @@
         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
+        inputframes = resume2.rebuild_from_resumedata(self, deadframe,
+                                                      resumedescr)
+        virtualizable_boxes = None
+        virtualref_boxes = None
         #
         # virtual refs: make the vrefs point to the freshly allocated virtuals
         self.virtualref_boxes = virtualref_boxes
@@ -2565,7 +2565,7 @@
         else:
             assert not virtualizable_boxes
         #
-        return inputargs_and_holes
+        return inputframes
 
     def check_synchronized_virtualizable(self):
         if not we_are_translated():
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
@@ -1,6 +1,6 @@
 
 from rpython.jit.metainterp.resoperation import rop
-from rpython.jit.metainterp.history import BoxInt
+from rpython.jit.metainterp.history import BoxInt, BoxPtr, BoxFloat
 from rpython.jit.codewriter.jitcode import JitCode
 from rpython.rlib import rstack
 
@@ -11,7 +11,16 @@
         self.parent_position = parent_position
         self.loop = loop
 
+class ResumeFrame(object):
+    def __init__(self, jitcode):
+        self.registers = [-1] * jitcode.num_regs()
+        self.jitcode = jitcode
+        self.pc = -1
+        
 class AbstractResumeReader(object):
+    def __init__(self):
+        self.framestack = []
+
     def rebuild(self, faildescr):
         self._rebuild_until(faildescr.rd_resume_bytecode,
                             faildescr.rd_bytecode_position)
@@ -20,6 +29,22 @@
     def finish(self):
         pass
 
+    def enter_frame(self, pc, jitcode):
+        if self.framestack:
+            assert pc != -1
+            self.framestack[-1].pc = pc
+        self.framestack.append(ResumeFrame(jitcode))
+
+    def resume_put(self, jitframe_pos_const, frame_no, frontend_position):
+        jitframe_pos = jitframe_pos_const.getint()
+        self.framestack[frame_no].registers[frontend_position] = jitframe_pos
+
+    def resume_set_pc(self, pc):
+        self.framestack[-1].pc = pc
+
+    def leave_frame(self):
+        self.framestack.pop()
+
     def _rebuild_until(self, rb, position):
         if rb.parent is not None:
             self._rebuild_until(rb.parent, rb.parent_position)
@@ -36,7 +61,7 @@
                 self.leave_frame()
             elif op.getopnum() == rop.RESUME_PUT:
                 self.resume_put(op.getarg(0), op.getarg(1).getint(),
-                         op.getarg(2).getint())
+                                 op.getarg(2).getint())
             elif op.getopnum() == rop.RESUME_NEW:
                 self.resume_new(op.result, op.getdescr())
             elif op.getopnum() == rop.RESUME_SETFIELD_GC:
@@ -51,20 +76,6 @@
                 xxx
             pos += 1
 
-    def resume_put(self, jitframe_pos_const, frame_no, frontend_position):
-        jitframe_pos = jitframe_pos_const.getint()
-        jitcode = self.get_jitcode(frame_no)
-        if frontend_position < jitcode.num_regs_i():
-            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_no, frontend_position - 
jitcode.num_regs_i(),
-                             jitframe_pos)
-        else:
-            assert frontend_position < jitcode.num_regs()
-            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)
 
@@ -75,12 +86,6 @@
         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
@@ -112,34 +117,37 @@
     def __init__(self, metainterp, deadframe):
         self.metainterp = metainterp
         self.deadframe = deadframe
+        AbstractResumeReader.__init__(self)
 
-    def enter_frame(self, pc, jitcode):
-        if pc != -1:
-            self.metainterp.framestack[-1].pc = pc
-        self.metainterp.newframe(jitcode)
+    def get_int_box(self, pos):
+        return BoxInt(self.metainterp.cpu.get_int_value(self.deadframe, pos))
 
-    def leave_frame(self):
-        self.metainterp.popframe()
+    def get_ref_box(self, pos):
+        return BoxPtr(self.metainterp.cpu.get_ref_value(self.deadframe, 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_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_no, position, jitframe_pos):
-        frame = self.metainterp.framestack[frame_no]
-        xxx
-        frame.registers_f[position] = self.read_float(jitframe_pos)
+    def get_float_box(self, pos):
+        return BoxFloat(self.metainterp.cpu.get_float_value(self.deadframe,
+                                                            pos))
 
     def finish(self):
-        pass
-
+        for frame in self.framestack:
+            jitcode = frame.jitcode
+            miframe = self.metainterp.newframe(jitcode)
+            miframe.pc = frame.pc
+            pos = 0
+            for i in range(jitcode.num_regs_i()):
+                miframe.registers_i[i] = self.get_int_box(frame.registers[pos])
+                pos += 1
+            for i in range(jitcode.num_regs_r()):
+                miframe.registers_r[i] = self.get_ref_box(frame.registers[pos])
+                pos += 1
+            for i in range(jitcode.num_regs_f()):
+                jitframe_pos = frame.registers[pos]
+                miframe.registers_f[i] = self.get_float_box(jitframe_pos)
+                pos += 1
+            
 def rebuild_from_resumedata(metainterp, deadframe, faildescr):
-    BoxResumeReader(metainterp, deadframe).rebuild(faildescr)
+    return BoxResumeReader(metainterp, deadframe).rebuild(faildescr)
 
 def blackhole_from_resumedata(interpbuilder, metainterp_sd, faildescr,
                               deadframe, all_virtuals=None):
diff --git a/rpython/jit/metainterp/test/test_resume2.py 
b/rpython/jit/metainterp/test/test_resume2.py
--- a/rpython/jit/metainterp/test/test_resume2.py
+++ b/rpython/jit/metainterp/test/test_resume2.py
@@ -4,7 +4,7 @@
 from rpython.jit.codewriter.jitcode import JitCode
 from rpython.jit.metainterp.history import AbstractDescr
 from rpython.jit.metainterp.resume2 import rebuild_from_resumedata,\
-     ResumeBytecode, BoxResumeReader
+     ResumeBytecode, AbstractResumeReader
 
 
 class Descr(AbstractDescr):
@@ -21,7 +21,7 @@
         self.registers_f = [None] * jitcode.num_regs_f()
 
     def num_nonempty_regs(self):
-        return len(filter(bool, self.registers_i))
+        return len([i for i in self.registers_i if i.getint() != 2])
 
     def dump_registers(self, lst, backend_values):
         lst += [backend_values[x] for x in self.registers_i]
@@ -34,7 +34,9 @@
         self.framestack = []
 
     def newframe(self, jitcode):
-        self.framestack.append(Frame(jitcode))
+        f = Frame(jitcode)
+        self.framestack.append(f)
+        return f
 
     def popframe(self):
         self.framestack.pop()
@@ -44,25 +46,9 @@
         assert frame == "myframe"
         return index + 3
 
-class RebuildingResumeReader(BoxResumeReader):
-    def __init__(self):
-        self.metainterp = MockMetaInterp()
-
-    def put_box_int(self, frame, position, jitframe_pos):
-        frame.registers_i[position] = jitframe_pos
-
-    def put_box_float(self, frame, position, jitframe_pos):
-        frame.registers_f[position] = jitframe_pos
-
-    def put_box_ref(self, frame, position, jitframe_pos):
-        frame.registers_r[position] = jitframe_pos
-
+class RebuildingResumeReader(AbstractResumeReader):
     def finish(self):
-        framestack = []
-        for frame in self.metainterp.framestack:
-            framestack.append(frame.registers_i + frame.registers_r +
-                              frame.registers_f)
-        return framestack
+        return [f.registers for f in self.framestack]
 
 def rebuild_locs_from_resumedata(faildescr):
     return RebuildingResumeReader().rebuild(faildescr)
@@ -70,7 +56,7 @@
 class TestResumeDirect(object):
     def test_box_resume_reader(self):
         jitcode = JitCode("jitcode")
-        jitcode.setup(num_regs_i=13)
+        jitcode.setup(num_regs_i=13, num_regs_r=0, num_regs_f=0)
         resume_loop = parse("""
         []
         enter_frame(-1, descr=jitcode1)
@@ -89,9 +75,9 @@
 
     def test_nested_call(self):
         jitcode1 = JitCode("jitcode")
-        jitcode1.setup(num_regs_i=13)
+        jitcode1.setup(num_regs_i=13, num_regs_r=0, num_regs_f=0)
         jitcode2 = JitCode("jitcode2")
-        jitcode2.setup(num_regs_i=9)
+        jitcode2.setup(num_regs_i=9, num_regs_r=0, num_regs_f=0)
         resume_loop = parse("""
         []
         enter_frame(-1, descr=jitcode1)
@@ -130,7 +116,7 @@
 
     def test_bridge(self):
         jitcode1 = JitCode("jitcode")
-        jitcode1.setup(num_regs_i=13)
+        jitcode1.setup(num_regs_i=13, num_regs_r=0, num_regs_f=0)
         base = parse("""
         []
         enter_frame(-1, descr=jitcode1)
@@ -160,7 +146,7 @@
     def test_new(self):
         py.test.skip("finish")
         jitcode1 = JitCode("jitcode")
-        jitcode1.setup(num_regs_i=1)
+        jitcode1.setup(num_regs_i=1, num_regs_r=0, num_regs_f=0)
         base = parse("""
         []
         enter_frame(-1, descr=jitcode)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to