[pypy-commit] pypy stmgc-c4: seems to fix one bug - reload frame after stm_invalidate_jmp_buf

Raemi noreply at buildbot.pypy.org
Fri Oct 11 18:28:11 CEST 2013


Author: Remi Meier <remi.meier at gmail.com>
Branch: stmgc-c4
Changeset: r67324:8291074f521b
Date: 2013-10-11 18:26 +0200
http://bitbucket.org/pypy/pypy/changeset/8291074f521b/

Log:	seems to fix one bug - reload frame after stm_invalidate_jmp_buf

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
@@ -80,8 +80,6 @@
         else:
             self.gc_size_of_header = WORD # for tests
         self.memcpy_addr = self.cpu.cast_ptr_to_int(memcpy_fn)
-        self._build_failure_recovery(False, withfloats=False)
-        self._build_failure_recovery(True, withfloats=False)
         if gc_ll_descr.stm:
             descrs = [gc_ll_descr.P2Rdescr, gc_ll_descr.P2Wdescr]
         else:
@@ -90,6 +88,9 @@
             self._build_b_slowpath(d, False)
             self._build_b_slowpath(d, True)
             self._build_b_slowpath(d, False, for_frame=True)
+        # building the barriers needs to happen before these:
+        self._build_failure_recovery(False, withfloats=False)
+        self._build_failure_recovery(True, withfloats=False)
         # only for stm:
         if gc_ll_descr.stm:
             self._build_ptr_eq_slowpath()
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
@@ -439,6 +439,7 @@
         if not withcards:
             func = descr.get_barrier_fn(self.cpu, 
                                         returns_modified_object=is_stm)
+            assert func is not None
         else:
             assert not is_stm
             if descr.jit_wb_cards_set == 0:
@@ -929,6 +930,8 @@
             self.mc.LEA_rs(edi.value, FRAME_FIXED_SIZE * WORD)
             fn = stmtlocal.stm_invalidate_jmp_buf_fn
             self.mc.CALL(imm(self.cpu.cast_ptr_to_int(fn)))
+            # there could have been a collection in invalidate_jmp_buf()
+            self._reload_frame_if_necessary(self.mc)
 
         # the return value is the jitframe
         self.mc.MOV_rr(eax.value, ebp.value)
@@ -2531,6 +2534,7 @@
             mc.SUB_ri(esp.value, 16 - WORD) # erase the return address
             # ||retadr|...||
         func = descr.get_b_slowpath(helper_num)
+        assert func != 0
         mc.CALL(imm(func))
         # get result:
         if is_frame:


More information about the pypy-commit mailing list