Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60158:4cdddd8fa88e
Date: 2013-01-18 00:07 +0200
http://bitbucket.org/pypy/pypy/changeset/4cdddd8fa88e/

Log:    fixes and tests

diff --git a/pypy/jit/backend/x86/assembler.py 
b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -520,6 +520,7 @@
         clt.allgcrefs = []
         clt.frame_info.jfi_frame_depth = 0 # for now
         looptoken.compiled_loop_token = clt
+        clt._debug_nbargs = len(inputargs)
         if not we_are_translated():
             # Arguments should be unique
             assert len(set(inputargs)) == len(inputargs)
@@ -532,7 +533,6 @@
         regalloc = RegAlloc(self, self.cpu.translate_support_code)
         #
         self._call_header_with_stack_check()
-        clt._debug_nbargs = len(inputargs)
         operations = regalloc.prepare_loop(inputargs, operations, looptoken,
                                            clt.allgcrefs)
         rgc._make_sure_does_not_move(clt.frame_info)
@@ -700,14 +700,15 @@
         frame_info_ofs = self.cpu.get_ofs_of_frame_field('jf_frame_info')
         jfi_gc_map_ofs = self.cpu.get_ofs_of_frame_field('jfi_gcmap')
         if IS_X86_32:
-            self.mc.MOV_bi(gcmap_ofs, frame_info_addr + jfi_gc_map_ofs)
             self.mc.MOV_bi(frame_info_ofs, frame_info_addr)
+            XXX
         else:
-            self.mc.MOV_ri(X86_64_SCRATCH_REG.value,
-                           frame_info_addr + jfi_gc_map_ofs)
-            self.mc.MOV_br(gcmap_ofs, X86_64_SCRATCH_REG.value)
             self.mc.MOV_ri(X86_64_SCRATCH_REG.value, frame_info_addr)
             self.mc.MOV_br(frame_info_ofs, X86_64_SCRATCH_REG.value)
+            self.mc.MOV_rm(X86_64_SCRATCH_REG.value,
+                           (X86_64_SCRATCH_REG.value,
+                            jfi_gc_map_ofs))
+            self.mc.MOV_br(gcmap_ofs, X86_64_SCRATCH_REG.value)
             
 
     def _patch_stackadjust(self, adr, allocated_depth):
@@ -2393,14 +2394,6 @@
                         op.getopname())
 
     def closing_jump(self, target_token):
-        # The backend's logic assumes that the target code is in a piece of
-        # assembler that was also called with the same number of arguments,
-        # so that the locations [ebp+8..] of the input arguments are valid
-        # stack locations both before and after the jump.
-        my_nbargs = self.current_clt._debug_nbargs
-        target_nbargs = target_token._x86_clt._debug_nbargs
-        assert my_nbargs == target_nbargs
-        #
         target = target_token._x86_loop_code
         if target_token in self.target_tokens_currently_compiling:
             curpos = self.mc.get_relative_pos() + 5
diff --git a/pypy/jit/backend/x86/test/test_gc_integration.py 
b/pypy/jit/backend/x86/test/test_gc_integration.py
--- a/pypy/jit/backend/x86/test/test_gc_integration.py
+++ b/pypy/jit/backend/x86/test/test_gc_integration.py
@@ -36,6 +36,7 @@
     ptr0 = struct_ref
 
     targettoken = TargetToken()
+    targettoken2 = TargetToken()
 
     namespace = locals().copy()
 
@@ -76,7 +77,7 @@
     def test_label(self):
         ops = '''
         [i0, p0, i1, p1]
-        label(i0, p0, i1, p1, descr=targettoken)
+        label(i0, p0, i1, p1, descr=targettoken2)
         p3 = getfield_gc(p0, descr=fielddescr)
         force_spill(p3)
         guard_true(i0) [p0, i1, p1, p3]
@@ -85,13 +86,15 @@
         s1 = lltype.malloc(self.S)
         s2 = lltype.malloc(self.S)
         s1.field = s2
-        loop = self.interpret(ops, [0, s1, 1, s2])
+        self.interpret(ops, [0, s1, 1, s2])
         ops2 = '''
         [p0]
-        jump(1, p0, 1, p0, descr=targettoken)
+        jump(1, p0, 1, p0, descr=targettoken2)
         '''
-        self.interpret(ops2)
-        xxx
+        self.interpret(ops2, [s1])
+        frame = lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR, self.deadframe)
+        assert len(frame.jf_gcmap) == 3
+        assert [frame.jf_gcmap[i] for i in range(3)] == [1, 3, 4]
 
     def test_rewrite_constptr(self):
         ops = '''
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to