Author: David Schneider <[email protected]>
Branch: remove-globals-in-jit
Changeset: r59679:655e6658b685
Date: 2013-01-02 14:55 +0100
http://bitbucket.org/pypy/pypy/changeset/655e6658b685/

Log:    WIP: port forcing support

diff --git a/pypy/jit/backend/arm/assembler.py 
b/pypy/jit/backend/arm/assembler.py
--- a/pypy/jit/backend/arm/assembler.py
+++ b/pypy/jit/backend/arm/assembler.py
@@ -338,7 +338,7 @@
     def grab_frame_values(cpu, mem_loc, frame_pointer,
                                                 registers, vfp_registers):
         # no malloc allowed here!!  xxx apart from one, hacking a lot
-        #self.fail_ebp = allregisters[16 + ebp.value]
+        force_index = rffi.cast(lltype.Signed, frame_pointer)
         num = 0
         deadframe = lltype.nullptr(jitframe.DEADFRAME)
         bytecode = rffi.cast(rffi.UCHARP, mem_loc)
@@ -361,8 +361,7 @@
                         continue
                     if code == AssemblerARM.CODE_FORCED:
                         # resuming from a GUARD_NOT_FORCED
-                        xxx
-                        token = allregisters[16 + ebp.value]
+                        token = force_index
                         deadframe = (
                             cpu.assembler.force_token_to_dead_frame.pop(token))
                         deadframe = lltype.cast_opaque_ptr(
diff --git a/pypy/jit/backend/arm/runner.py b/pypy/jit/backend/arm/runner.py
--- a/pypy/jit/backend/arm/runner.py
+++ b/pypy/jit/backend/arm/runner.py
@@ -99,23 +99,27 @@
                         flavor='raw', zero=True, immortal=True)
 
     def force(self, addr_of_force_index):
-       assert 0, 'refactor ME'
         TP = rffi.CArrayPtr(lltype.Signed)
         fail_index = rffi.cast(TP, addr_of_force_index)[0]
         assert fail_index >= 0, "already forced!"
         faildescr = self.get_fail_descr_from_number(fail_index)
         rffi.cast(TP, addr_of_force_index)[0] = ~fail_index
-        bytecode = self.assembler._find_failure_recovery_bytecode(faildescr)
+        frb = self.assembler._find_failure_recovery_bytecode(faildescr)
+        bytecode = rffi.cast(rffi.UCHARP, frb)
         addr_all_null_regsiters = rffi.cast(rffi.LONG, self.all_null_registers)
-        # start of "no gc operation!" block
-        fail_index_2 = self.assembler.failure_recovery_func(
-            bytecode,
-            addr_of_force_index,
-            addr_all_null_regsiters)
-        self.assembler.leave_jitted_hook()
-        # end of "no gc operation!" block
-        assert fail_index == fail_index_2
-        return faildescr
+        #
+        assert (rffi.cast(lltype.Signed, bytecode[0]) ==
+                self.assembler.CODE_FORCED)
+        bytecode = rffi.ptradd(bytecode, 1)
+        deadframe = self.assembler.failure_recovery_func(bytecode,
+                      addr_of_force_index,
+                      self.all_null_registers)
+    
+        #
+        assert self.get_latest_descr(deadframe) is faildescr
+        self.assembler.force_token_to_dead_frame[addr_of_force_index] = (
+            deadframe)
+        return deadframe
 
     def redirect_call_assembler(self, oldlooptoken, newlooptoken):
         self.assembler.redirect_call_assembler(oldlooptoken, newlooptoken)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to