Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60837:9e0fcf9d51a9
Date: 2013-02-03 17:03 +0200
http://bitbucket.org/pypy/pypy/changeset/9e0fcf9d51a9/

Log:    Try to fix the problem with redirect_call_assembler

diff --git a/rpython/jit/backend/arm/opassembler.py 
b/rpython/jit/backend/arm/opassembler.py
--- a/rpython/jit/backend/arm/opassembler.py
+++ b/rpython/jit/backend/arm/opassembler.py
@@ -1294,6 +1294,8 @@
         # we overwrite the instructions at the old _arm_func_adddr
         # to start with a JMP to the new _arm_func_addr.
         # Ideally we should rather patch all existing CALLs, but well.
+        XXX # this is wrong, copy the logic from x86, but also, shouldn't
+        # it live on a base class instead?
         oldadr = oldlooptoken._arm_func_addr
         target = newlooptoken._arm_func_addr
         mc = ARMv7Builder()
diff --git a/rpython/jit/backend/model.py b/rpython/jit/backend/model.py
--- a/rpython/jit/backend/model.py
+++ b/rpython/jit/backend/model.py
@@ -1,3 +1,4 @@
+import weakref
 from rpython.rlib.debug import debug_start, debug_print, debug_stop
 from rpython.rtyper.lltypesystem import lltype
 
@@ -293,25 +294,14 @@
         self.cpu = cpu
         self.number = number
         self.bridges_count = 0
-        # This growing list gives the 'descr_number' of all fail descrs
-        # that belong to this loop or to a bridge attached to it.
-        # Filled by the frontend calling record_faildescr_index().
-        self.faildescr_indices = []
         self.invalidate_positions = []
+        # a list of weakrefs to looptokens that has been redirected to
+        # this one
+        self.looptokens_redirected_to = []
         debug_start("jit-mem-looptoken-alloc")
         debug_print("allocating Loop #", self.number)
         debug_stop("jit-mem-looptoken-alloc")
 
-    def record_faildescr_index(self, n):
-        self.faildescr_indices.append(n)
-
-    def reserve_and_record_some_faildescr_index(self):
-        # like record_faildescr_index(), but invent and return a new,
-        # unused faildescr index
-        n = self.cpu.reserve_some_free_fail_descr_number()
-        self.record_faildescr_index(n)
-        return n
-
     def compiling_a_bridge(self):
         self.cpu.tracker.total_compiled_bridges += 1
         self.bridges_count += 1
@@ -319,6 +309,19 @@
         debug_print("allocating Bridge #", self.bridges_count, "of Loop #", 
self.number)
         debug_stop("jit-mem-looptoken-alloc")
 
+    def update_frame_info(self, oldlooptoken, baseofs):
+        new_fi = self.frame_info
+        new_loop_tokens = []
+        for ref in oldlooptoken.looptokens_redirected_to:
+            looptoken = ref()
+            if looptoken:
+                looptoken.frame_info.set_frame_depth(baseofs,
+                                                     new_fi.jfi_frame_depth)
+                new_loop_tokens.append(ref)
+        oldlooptoken.frame_info.set_frame_depth(baseofs, 
new_fi.jfi_frame_depth)
+        new_loop_tokens.append(weakref.ref(oldlooptoken))
+        self.looptokens_redirected_to = new_loop_tokens
+
     def __del__(self):
         #debug_start("jit-mem-looptoken-free")
         #debug_print("freeing Loop #", self.number, 'with',
diff --git a/rpython/jit/backend/test/test_model.py 
b/rpython/jit/backend/test/test_model.py
--- a/rpython/jit/backend/test/test_model.py
+++ b/rpython/jit/backend/test/test_model.py
@@ -1,21 +1,32 @@
-from rpython.jit.metainterp.history import AbstractFailDescr
-from rpython.jit.backend.model import AbstractCPU
+from rpython.jit.backend.model import CompiledLoopToken
 
+class FakeCPU(object):
+    class tracker:
+        total_compiled_loops = 0
+        total_freed_loops = 0
+        total_freed_bridges = 0
 
-def test_faildescr_numbering():
-    cpu = AbstractCPU()
-    fail_descr1 = AbstractFailDescr()
-    fail_descr2 = AbstractFailDescr()    
+    def free_loop_and_bridges(self, *args):
+        pass
 
-    n1 = cpu.get_fail_descr_number(fail_descr1)
-    n2 = cpu.get_fail_descr_number(fail_descr2)
-    assert n1 != n2
+class FrameInfo(object):
+    def __init__(self, depth):
+        self.jfi_frame_depth = depth
 
-    fail_descr = cpu.get_fail_descr_from_number(n1)
-    assert fail_descr is fail_descr1
-    fail_descr = cpu.get_fail_descr_from_number(n2)
-    assert fail_descr is fail_descr2
+    def set_frame_depth(self, baseofs, newdepth):
+        self.jfi_frame_depth = newdepth
 
-    # provides interning on its own
-    n1_1 = cpu.get_fail_descr_number(fail_descr1)
-    assert n1_1 == n1
+def test_redirect_loop_token():
+    cpu = FakeCPU()
+    c = CompiledLoopToken(cpu, 0)
+    c2 = CompiledLoopToken(cpu, 0)
+    c.frame_info = FrameInfo(1)
+    c2.frame_info = FrameInfo(2)
+    c2.update_frame_info(c, 0)
+    assert c.frame_info.jfi_frame_depth == 2
+    c3 = CompiledLoopToken(cpu, 0)
+    c3.frame_info = FrameInfo(3)
+    c3.update_frame_info(c2, 0)
+    assert c.frame_info.jfi_frame_depth == 3
+    assert c2.frame_info.jfi_frame_depth == 3
+    
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
@@ -892,16 +892,15 @@
         old_nbargs = oldlooptoken.compiled_loop_token._debug_nbargs
         new_nbargs = newlooptoken.compiled_loop_token._debug_nbargs
         assert old_nbargs == new_nbargs
-        # we overwrite the instructions at the old _x86_direct_bootstrap_code
-        # to start with a JMP to the new _x86_direct_bootstrap_code.
+        # we overwrite the instructions at the old _x86_function_addr
+        # to start with a JMP to the new _x86_function_addr.
         # Ideally we should rather patch all existing CALLs, but well.
         oldadr = oldlooptoken._x86_function_addr
         target = newlooptoken._x86_function_addr
         # copy frame-info data
-        old_fi = oldlooptoken.compiled_loop_token.frame_info
-        new_fi = newlooptoken.compiled_loop_token.frame_info
         baseofs = self.cpu.get_baseofs_of_frame_field()
-        old_fi.set_frame_depth(baseofs, new_fi.jfi_frame_depth)
+        newlooptoken.compiled_loop_token.update_frame_info(
+            oldlooptoken.compiled_loop_token, baseofs)
         mc = codebuf.MachineCodeBlockWrapper()
         mc.JMP(imm(target))
         if WORD == 4:         # keep in sync with prepare_loop()
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to