Author: Armin Rigo <[email protected]>
Branch: stmgc-c7
Changeset: r70161:c3d7dd930444
Date: 2014-03-22 12:12 +0100
http://bitbucket.org/pypy/pypy/changeset/c3d7dd930444/

Log:    Fixes

diff --git a/rpython/jit/backend/llsupport/rewrite.py 
b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -386,34 +386,32 @@
 
     # ----------
 
+    def must_apply_write_barrier(self, val, v):
+        if val not in self.write_barrier_applied:
+            if isinstance(v, BoxPtr) or (isinstance(v, ConstPtr) and
+                                         bool(v.value)): # store a non-NULL
+                return True
+        return False
+
     def handle_write_barrier_setfield(self, op):
         val = op.getarg(0)
-        if val not in self.write_barrier_applied:
-            v = op.getarg(1)
-            if isinstance(v, BoxPtr) or (isinstance(v, ConstPtr) and
-                                         bool(v.value)): # store a non-NULL
-                self.gen_write_barrier(val)
-                #op = op.copy_and_change(rop.SETFIELD_RAW)
+        if self.must_apply_write_barrier(val, op.getarg(1)):
+            self.gen_write_barrier(val)
+            #op = op.copy_and_change(rop.SETFIELD_RAW)
         self.newops.append(op)
 
     def handle_write_barrier_setinteriorfield(self, op):
         val = op.getarg(0)
-        if val not in self.write_barrier_applied:
-            v = op.getarg(2)
-            if isinstance(v, BoxPtr) or (isinstance(v, ConstPtr) and
-                                         bool(v.value)): # store a non-NULL
-                self.gen_write_barrier(val)
-                #op = op.copy_and_change(rop.SETINTERIORFIELD_RAW)
+        if self.must_apply_write_barrier(val, op.getarg(2)):
+            self.gen_write_barrier(val)
+            #op = op.copy_and_change(rop.SETINTERIORFIELD_RAW)
         self.newops.append(op)
 
     def handle_write_barrier_setarrayitem(self, op):
         val = op.getarg(0)
-        if val not in self.write_barrier_applied:
-            v = op.getarg(2)
-            if isinstance(v, BoxPtr) or (isinstance(v, ConstPtr) and
-                                         bool(v.value)): # store a non-NULL
-                self.gen_write_barrier_array(val, op.getarg(1))
-                #op = op.copy_and_change(rop.SETARRAYITEM_RAW)
+        if self.must_apply_write_barrier(val, op.getarg(2)):
+            self.gen_write_barrier_array(val, op.getarg(1))
+            #op = op.copy_and_change(rop.SETARRAYITEM_RAW)
         self.newops.append(op)
 
     def gen_write_barrier(self, v_base):
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
@@ -121,6 +121,10 @@
             self.read_barrier_applied[v_ptr] = None
 
 
+    def must_apply_write_barrier(self, val, v):
+        return val not in self.write_barrier_applied
+
+
     def handle_setfields(self, op):
         opnum = op.getopnum()
         descr = op.getdescr()
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
@@ -102,6 +102,18 @@
             jump()
         """)
 
+    def test_rewrite_one_setfield_gc_i(self):
+        self.check_rewrite("""
+            [p1, i2]
+            setfield_gc(p1, i2, descr=tzdescr)
+            jump()
+        """, """
+            [p1, i2]
+            cond_call_gc_wb(p1, descr=wbdescr)
+            setfield_gc(p1, i2, descr=tzdescr)
+            jump()
+        """)
+
     def test_rewrite_setfield_gc_const(self):
         TP = lltype.GcArray(lltype.Signed)
         NULL = lltype.cast_opaque_ptr(llmemory.GCREF, lltype.nullptr(TP))
@@ -147,6 +159,20 @@
             jump()
         """)
 
+    def test_rewrite_getfield_after_setfield(self):
+        self.check_rewrite("""
+            [p1, i2]
+            setfield_gc(p1, i2, descr=tydescr)
+            p3 = getfield_gc(p1, descr=tzdescr)
+            jump(p3)
+        """, """
+            [p1, i2]
+            cond_call_gc_wb(p1, descr=wbdescr)
+            setfield_gc(p1, i2, descr=tydescr)
+            p3 = getfield_gc(p1, descr=tzdescr)
+             jump(p3)
+        """)
+
     def test_invalidate_read_status_after_write_to_constptr(self):
         TP = lltype.GcArray(lltype.Signed)
         NULL = lltype.cast_opaque_ptr(llmemory.GCREF, lltype.nullptr(TP))
@@ -162,9 +188,9 @@
             [p0]
             p1 = same_as(ConstPtr(t))
             p2 = same_as(ConstPtr(t))
-            cond_call_stm_b(p1, descr=A2Rdescr)
             p3 = getfield_gc(p1, descr=tzdescr)
-            cond_call_stm_b(p2, descr=A2Wdescr)
+            stm_read(p1)
+            cond_call_gc_wb(p2, descr=wbdescr)
             setfield_gc(p2, p0, descr=tzdescr)
             cond_call_stm_b(p1, descr=Q2Rdescr)
             p4 = getfield_gc(p1, descr=tzdescr)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to