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