Author: Remi Meier <[email protected]>
Branch: stmgc-c4
Changeset: r65522:a9400c2707e9
Date: 2013-07-22 08:31 +0200
http://bitbucket.org/pypy/pypy/changeset/a9400c2707e9/

Log:    repeat write barriers after a possible minor collection

diff --git a/rpython/jit/backend/llsupport/stmrewrite.py 
b/rpython/jit/backend/llsupport/stmrewrite.py
--- a/rpython/jit/backend/llsupport/stmrewrite.py
+++ b/rpython/jit/backend/llsupport/stmrewrite.py
@@ -70,6 +70,8 @@
                 continue
             # ----------  mallocs  ----------
             if op.is_malloc():
+                # write barriers not valid after possible collection
+                self.write_to_read_categories()
                 self.handle_malloc_operation(op)
                 continue
             # ----------  calls  ----------
@@ -107,7 +109,11 @@
             #
         return self.newops
 
-
+    def write_to_read_categories(self):
+        for v, c in self.known_category.items():
+            if c == 'W':
+                self.known_category[v] = 'R'
+        
     def gen_write_barrier(self, v):
         raise NotImplementedError
 
diff --git a/rpython/jit/backend/llsupport/test/test_stmrewrite.py 
b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
--- a/rpython/jit/backend/llsupport/test/test_stmrewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
@@ -64,6 +64,43 @@
             jump()
             """, t=NULL)
 
+    def test_rewrite_write_barrier_after_malloc(self):
+        self.check_rewrite("""
+            [p1, p3]
+            setfield_gc(p3, p1, descr=tzdescr)
+            p2 = new(descr=tdescr)
+            setfield_gc(p3, p1, descr=tzdescr)
+            jump(p2)
+        """, """
+            [p1, p3]
+            cond_call_stm_b(p3, descr=P2Wdescr)
+            setfield_gc(p3, p1, descr=tzdescr)
+            p2 = call_malloc_gc(ConstClass(malloc_big_fixedsize),    \
+                                %(tdescr.size)d, %(tdescr.tid)d, \
+                                descr=malloc_big_fixedsize_descr)
+            cond_call_stm_b(p3, descr=P2Wdescr)
+            setfield_gc(p3, p1, descr=tzdescr)
+            jump(p2)
+        """)
+
+    def test_rewrite_read_barrier_after_malloc(self):
+        self.check_rewrite("""
+            [p1]
+            p2 = getfield_gc(p1, descr=tzdescr)
+            p3 = new(descr=tdescr)
+            p4 = getfield_gc(p1, descr=tzdescr)
+            jump(p2)
+        """, """
+            [p1]
+            cond_call_stm_b(p1, descr=P2Rdescr)
+            p2 = getfield_gc(p1, descr=tzdescr)
+            p3 = call_malloc_gc(ConstClass(malloc_big_fixedsize),    \
+                                %(tdescr.size)d, %(tdescr.tid)d, \
+                                descr=malloc_big_fixedsize_descr)
+            p4 = getfield_gc(p1, descr=tzdescr)
+            jump(p2)
+        """)
+            
     def test_rewrite_setfield_gc_on_local(self):
         self.check_rewrite("""
             [p1]
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to