Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r92386:9bd6fef43680
Date: 2017-09-14 10:52 +0200
http://bitbucket.org/pypy/pypy/changeset/9bd6fef43680/

Log:    Test and fix: an ll_assert() can rarely fail in debug mode in the
        GC, but that's not a real problem

diff --git a/rpython/memory/gc/incminimark.py b/rpython/memory/gc/incminimark.py
--- a/rpython/memory/gc/incminimark.py
+++ b/rpython/memory/gc/incminimark.py
@@ -1897,8 +1897,14 @@
                         if cardbyte & 1:
                             if interval_stop > length:
                                 interval_stop = length
-                                ll_assert(cardbyte <= 1 and bytes == 0,
-                                          "premature end of object")
+                                #--- the sanity check below almost always
+                                #--- passes, except in situations like
+                                #--- test_writebarrier_before_copy_manually\
+                                #    _copy_card_bits
+                                #ll_assert(cardbyte <= 1 and bytes == 0,
+                                #          "premature end of object")
+                                ll_assert(bytes == 0, "premature end of 
object")
+                                cardbyte = 1
                             self.trace_and_drag_out_of_nursery_partial(
                                 obj, interval_start, interval_stop)
                         #
diff --git a/rpython/memory/gc/minimark.py b/rpython/memory/gc/minimark.py
--- a/rpython/memory/gc/minimark.py
+++ b/rpython/memory/gc/minimark.py
@@ -1399,8 +1399,15 @@
                         if cardbyte & 1:
                             if interval_stop > length:
                                 interval_stop = length
-                                ll_assert(cardbyte <= 1 and bytes == 0,
-                                          "premature end of object")
+                                #--- the sanity check below almost always
+                                #--- passes, except in situations like
+                                #--- test_writebarrier_before_copy_manually\
+                                #    _copy_card_bits
+                                #ll_assert(cardbyte <= 1 and bytes == 0,
+                                #          "premature end of object")
+                                ll_assert(bytes == 0, "premature end of 
object")
+                                if interval_stop <= interval_start:
+                                    break
                             self.trace_and_drag_out_of_nursery_partial(
                                 obj, interval_start, interval_stop)
                         #
diff --git a/rpython/memory/test/gc_test_base.py 
b/rpython/memory/test/gc_test_base.py
--- a/rpython/memory/test/gc_test_base.py
+++ b/rpython/memory/test/gc_test_base.py
@@ -995,6 +995,31 @@
 
         self.interpret(fn, [])
 
+    def test_writebarrier_before_copy_manually_copy_card_bits(self):
+        S = lltype.GcStruct('S', ('x', lltype.Char))
+        TP = lltype.GcArray(lltype.Ptr(S))
+        def fn():
+            l1 = lltype.malloc(TP, 65)
+            l2 = lltype.malloc(TP, 33)
+            for i in range(65):
+                l1[i] = lltype.malloc(S)
+            l = lltype.malloc(TP, 100)
+            i = 0
+            while i < 65:
+                l[i] = l1[i]
+                i += 1
+            rgc.ll_arraycopy(l, l2, 0, 0, 33)
+            x = []
+            # force minor collect
+            t = (1, lltype.malloc(S))
+            for i in range(20):
+                x.append(t)
+            for i in range(33):
+                assert l2[i] == l[i]
+            return 0
+
+        self.interpret(fn, [])
+
     def test_stringbuilder(self):
         def fn():
             s = StringBuilder(4)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to