Author: Maciej Fijalkowski <[email protected]>
Branch: resume-refactor
Changeset: r66455:a0ed5cb4a8eb
Date: 2013-08-30 12:08 +0100
http://bitbucket.org/pypy/pypy/changeset/a0ed5cb4a8eb/

Log:    (fijal, antocuni) start storing more complicated structures for
        bridges

diff --git a/rpython/jit/backend/llsupport/assembler.py 
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -136,14 +136,13 @@
             input_i += 1
         return locs
 
-    def store_info_on_descr(self, startspos, guardtok):
+    def store_info_on_descr(self, startspos, guardtok, resume_bytecode):
         withfloats = guardtok.has_floats
         exc = guardtok.exc
         target = self.failure_recovery_code[exc + 2 * withfloats]
         fail_descr = cast_instance_to_gcref(guardtok.faildescr)
         fail_descr = rffi.cast(lltype.Signed, fail_descr)
-        # we want the descr to keep loop alive
-        guardtok.faildescr.rd_loop_token = self.current_clt
+        guardtok.faildescr.rd_resume_bytecode = resume_bytecode
         return fail_descr, target
 
     def call_assembler(self, op, guard_op, argloc, vloc, result_loc, tmploc):
diff --git a/rpython/jit/backend/llsupport/resumebuilder.py 
b/rpython/jit/backend/llsupport/resumebuilder.py
--- a/rpython/jit/backend/llsupport/resumebuilder.py
+++ b/rpython/jit/backend/llsupport/resumebuilder.py
@@ -1,6 +1,7 @@
 
 from rpython.jit.metainterp.resoperation import rop
 from rpython.jit.metainterp.history import ConstInt
+from rpython.jit.metainterp.resume2 import ResumeBytecode
 from rpython.jit.codewriter.jitcode import JitCode
 
 class LivenessAnalyzer(object):
@@ -51,6 +52,9 @@
     def get_position(self):
         return len(self.newops)
 
+    def finish(self, parent, clt):
+        return ResumeBytecode(self.newops, parent, clt)
+
     def not_implemented_op(self, op):
         print "Not implemented", op.getopname()
         raise NotImplementedError(op.getopname())
diff --git a/rpython/jit/backend/llsupport/test/test_resume.py 
b/rpython/jit/backend/llsupport/test/test_resume.py
--- a/rpython/jit/backend/llsupport/test/test_resume.py
+++ b/rpython/jit/backend/llsupport/test/test_resume.py
@@ -39,4 +39,4 @@
         backend_put(28, 0, 2)
         leave_frame()
         """, namespace={'jitcode': jitcode}).operations
-        equaloplists(descr.rd_loop_token.rd_bytecode, expected_resume)
+        equaloplists(descr.rd_resume_bytecode.bc, expected_resume)
diff --git a/rpython/jit/backend/test/runner_test.py 
b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -227,6 +227,8 @@
             ResOperation(rop.ENTER_FRAME, [ConstInt(-1)], None, descr=jitcode),
             ResOperation(rop.INT_ADD, [i0, ConstInt(1)], i1),
             ResOperation(rop.INT_LE, [i1, ConstInt(9)], i2),
+            ResOperation(rop.RESUME_PUT, [i1, ConstInt(0), ConstInt(0)],
+                         None),
             ResOperation(rop.GUARD_TRUE, [i2], None, descr=faildescr1),
             ResOperation(rop.LEAVE_FRAME, [], None),
             ResOperation(rop.JUMP, [i1], None, descr=targettoken),
@@ -239,6 +241,7 @@
         bridge = [
             ResOperation(rop.INT_LE, [i1b, ConstInt(19)], i3),
             ResOperation(rop.GUARD_TRUE, [i3], None, descr=faildescr2),
+            ResOperation(rop.LEAVE_FRAME, [], None),
             ResOperation(rop.JUMP, [i1b], None, descr=targettoken),
         ]
 
diff --git a/rpython/jit/backend/x86/assembler.py 
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -476,6 +476,7 @@
         self.update_frame_depth(frame_depth_no_fixed_size + 
JITFRAME_FIXED_SIZE)
         #
         size_excluding_failure_stuff = self.mc.get_relative_pos()
+        self.resume_bytecode = regalloc.resumebuilder.finish(None, looptoken)
         self.write_pending_failure_recoveries()
         full_size = self.mc.get_relative_pos()
         #
@@ -535,6 +536,8 @@
         self._check_frame_depth(self.mc, regalloc.get_gcmap())
         frame_depth_no_fixed_size = self._assemble(regalloc, inputargs, 
operations)
         codeendpos = self.mc.get_relative_pos()
+        self.resume_bytecode = regalloc.resumebuilder.finish(
+            faildescr.rd_bytecode, original_loop_token)
         self.write_pending_failure_recoveries()
         fullsize = self.mc.get_relative_pos()
         #
@@ -565,7 +568,8 @@
         # for each pending guard, generate the code of the recovery stub
         # at the end of self.mc.
         for tok in self.pending_guard_tokens:
-            tok.pos_recovery_stub = self.generate_quick_failure(tok)
+            tok.pos_recovery_stub = self.generate_quick_failure(tok,
+                                                        self.resume_bytecode)
         if WORD == 8 and len(self.pending_memoryerror_trampoline_from) > 0:
             self.error_trampoline_64 = self.generate_propagate_error_64()
 
@@ -1732,11 +1736,12 @@
         self.mc.JMP(imm(self.propagate_exception_path))
         return startpos
 
-    def generate_quick_failure(self, guardtok):
+    def generate_quick_failure(self, guardtok, resume_bytecode):
         """ Gather information about failure
         """
         startpos = self.mc.get_relative_pos()
-        fail_descr, target = self.store_info_on_descr(startpos, guardtok)
+        fail_descr, target = self.store_info_on_descr(startpos, guardtok,
+                                                      resume_bytecode)
         self.mc.PUSH(imm(fail_descr))
         self.push_gcmap(self.mc, guardtok.gcmap, push=True)
         self.mc.JMP(imm(target))
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
@@ -3,6 +3,16 @@
 from rpython.jit.metainterp.history import BoxInt
 from rpython.jit.codewriter.jitcode import JitCode
 
+class ResumeBytecode(object):
+    def __init__(self, bc, parent=None, loop=None):
+        self.bc = bc
+        self.branches = {}
+        self.parent = parent
+        self.loop = loop
+
+    def add_branch(self, pos, bc):
+        self.branches[pos] = ResumeBytecode(bc, self)
+
 class AbstractResumeReader(object):
     def rebuild(self, faildescr):
         bytecode = faildescr.rd_loop.rd_bytecode
@@ -58,5 +68,9 @@
         value = cpu.get_int_value(self.deadframe, jitframe_index)
         frame.registers_i[pos] = BoxInt(value)
 
+class ReconstructingResumeReader(AbstractResumeReader):
+    def __init__(self):
+        pass
+
 def rebuild_from_resumedata(metainterp, deadframe, faildescr):
     BoxResumeReader(metainterp, deadframe).rebuild(faildescr)
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
@@ -85,7 +85,7 @@
         assert f.registers_i[3].getint() == 12 + 3
         assert f2.registers_i[4].getint() == 8 + 3
         assert f2.registers_i[2].getint() == 11 + 3
-        
+
         descr.rd_bytecode_position = 7
         metainterp.framestack = []
         rebuild_from_resumedata(metainterp, "myframe", descr)
@@ -96,3 +96,18 @@
         assert f.registers_i[2].getint() == 11 + 3
         assert f.registers_i[4].getint() == 8 + 3
 
+    def test_reconstructing_resume_reader(self):
+        jitcode1 = JitCode("jitcode")
+        jitcode1.setup(num_regs_i=13)
+        resume_loop = parse("""
+        []
+        enter_frame(-1, descr=jitcode1)
+        backend_put(11, 0, 2)
+        enter_frame(12, descr=jitcode2)
+        backend_put(12, 0, 3)
+        backend_put(8, 1, 4)
+        leave_frame()
+        backend_put(10, 0, 1)
+        leave_frame()
+        """)
+        xxx
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to