Author: Devin Jeanpierre <[email protected]>
Branch: gc-forkfriendly
Changeset: r84149:fb71d0056319
Date: 2016-05-02 15:39 -0700
http://bitbucket.org/pypy/pypy/changeset/fb71d0056319/

Log:    Oops. Put more cases of using .tid behind possible pointer
        indirection.

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
@@ -1083,7 +1083,7 @@
     # Simple helpers
 
     def get_type_id(self, obj):
-        tid = self.get_flags(obj)
+        tid = self.header(obj).tid
         return llop.extract_ushort(llgroup.HALFWORD, tid)
 
     def combine(self, typeid16, flags):
@@ -1384,14 +1384,13 @@
             # 'newvalue'-less version, too.  Moreover, the incremental
             # GC nowadays relies on this fact.
             self.old_objects_pointing_to_young.append(addr_struct)
-            objhdr = self.header(addr_struct)
-            objhdr.tid &= ~GCFLAG_TRACK_YOUNG_PTRS
+            self.remove_flags(addr_struct, GCFLAG_TRACK_YOUNG_PTRS)
             #
             # Second part: if 'addr_struct' is actually a prebuilt GC
             # object and it's the first time we see a write to it, we
             # add it to the list 'prebuilt_root_objects'.
-            if objhdr.tid & GCFLAG_NO_HEAP_PTRS:
-                objhdr.tid &= ~GCFLAG_NO_HEAP_PTRS
+            if self.get_flags(addr_struct) & GCFLAG_NO_HEAP_PTRS:
+                self.remove_flags(addr_struct, GCFLAG_NO_HEAP_PTRS)
                 self.prebuilt_root_objects.append(addr_struct)
 
         remember_young_pointer._dont_inline_ = True
@@ -1409,8 +1408,7 @@
             # item that is (or contains) the pointer that we write.
             # We know that 'addr_array' has GCFLAG_TRACK_YOUNG_PTRS so far.
             #
-            objhdr = self.header(addr_array)
-            if objhdr.tid & GCFLAG_HAS_CARDS == 0:
+            if self.get_flags(addr_array) & GCFLAG_HAS_CARDS == 0:
                 #
                 if DEBUG:   # note: PYPY_GC_DEBUG=1 does not enable this
                     ll_assert(self.debug_is_old_object(addr_array),
@@ -1418,9 +1416,9 @@
                 #
                 # no cards, use default logic.  Mostly copied from above.
                 self.old_objects_pointing_to_young.append(addr_array)
-                objhdr.tid &= ~GCFLAG_TRACK_YOUNG_PTRS
-                if objhdr.tid & GCFLAG_NO_HEAP_PTRS:
-                    objhdr.tid &= ~GCFLAG_NO_HEAP_PTRS
+                self.remove_flags(addr_array, GCFLAG_TRACK_YOUNG_PTRS)
+                if self.get_flags(addr_array) & GCFLAG_NO_HEAP_PTRS:
+                    self.remove_flags(addr_array, GCFLAG_NO_HEAP_PTRS)
                     self.prebuilt_root_objects.append(addr_array)
                 return
             #
@@ -1442,9 +1440,9 @@
             # does not take 3 arguments).
             addr_byte.char[0] = chr(byte | bitmask)
             #
-            if objhdr.tid & GCFLAG_CARDS_SET == 0:
+            if self.get_flags(addr_array) & GCFLAG_CARDS_SET == 0:
                 self.old_objects_with_cards_set.append(addr_array)
-                objhdr.tid |= GCFLAG_CARDS_SET
+                self.add_flags(addr_array, GCFLAG_CARDS_SET)
 
         remember_young_pointer_from_array2._dont_inline_ = True
         assert self.card_page_indices > 0
@@ -1457,10 +1455,9 @@
             # but GCFLAG_CARDS_SET is cleared.  This tries to set
             # GCFLAG_CARDS_SET if possible; otherwise, it falls back
             # to remember_young_pointer().
-            objhdr = self.header(addr_array)
-            if objhdr.tid & GCFLAG_HAS_CARDS:
+            if self.get_flags(addr_array) & GCFLAG_HAS_CARDS:
                 self.old_objects_with_cards_set.append(addr_array)
-                objhdr.tid |= GCFLAG_CARDS_SET
+                self.add_flags(addr_array, GCFLAG_CARDS_SET)
             else:
                 self.remember_young_pointer(addr_array)
 
@@ -1493,22 +1490,22 @@
         #
         source_hdr = self.header(source_addr)
         dest_hdr = self.header(dest_addr)
-        if dest_hdr.tid & GCFLAG_TRACK_YOUNG_PTRS == 0:
+        if self.get_flags(dest_addr) & GCFLAG_TRACK_YOUNG_PTRS == 0:
             return True
         # ^^^ a fast path of write-barrier
         #
-        if source_hdr.tid & GCFLAG_HAS_CARDS != 0:
+        if self.get_flags(source_addr) & GCFLAG_HAS_CARDS != 0:
             #
-            if source_hdr.tid & GCFLAG_TRACK_YOUNG_PTRS == 0:
+            if self.get_flags(source_addr) & GCFLAG_TRACK_YOUNG_PTRS == 0:
                 # The source object may have random young pointers.
                 # Return False to mean "do it manually in ll_arraycopy".
                 return False
             #
-            if source_hdr.tid & GCFLAG_CARDS_SET == 0:
+            if self.get_flags(source_addr) & GCFLAG_CARDS_SET == 0:
                 # The source object has no young pointers at all.  Done.
                 return True
             #
-            if dest_hdr.tid & GCFLAG_HAS_CARDS == 0:
+            if self.get_flags(dest_addr) & GCFLAG_HAS_CARDS == 0:
                 # The dest object doesn't have cards.  Do it manually.
                 return False
             #
@@ -1519,14 +1516,14 @@
             self.manually_copy_card_bits(source_addr, dest_addr, length)
             return True
         #
-        if source_hdr.tid & GCFLAG_TRACK_YOUNG_PTRS == 0:
+        if self.get_flags(source_addr) & GCFLAG_TRACK_YOUNG_PTRS == 0:
             # there might be in source a pointer to a young object
             self.old_objects_pointing_to_young.append(dest_addr)
-            dest_hdr.tid &= ~GCFLAG_TRACK_YOUNG_PTRS
+            self.remove_flags(dest_addr, GCFLAG_TRACK_YOUNG_PTRS)
         #
-        if dest_hdr.tid & GCFLAG_NO_HEAP_PTRS:
-            if source_hdr.tid & GCFLAG_NO_HEAP_PTRS == 0:
-                dest_hdr.tid &= ~GCFLAG_NO_HEAP_PTRS
+        if self.get_flags(dest_addr) & GCFLAG_NO_HEAP_PTRS:
+            if self.get_flags(source_addr) & GCFLAG_NO_HEAP_PTRS == 0:
+                self.remove_flags(dest_addr, GCFLAG_NO_HEAP_PTRS)
                 self.prebuilt_root_objects.append(dest_addr)
         return True
 
@@ -1547,9 +1544,9 @@
         #
         if anybyte:
             dest_hdr = self.header(dest_addr)
-            if dest_hdr.tid & GCFLAG_CARDS_SET == 0:
+            if self.get_flags(dest_addr) & GCFLAG_CARDS_SET == 0:
                 self.old_objects_with_cards_set.append(dest_addr)
-                dest_hdr.tid |= GCFLAG_CARDS_SET
+                self.add_flags(dest_addr, GCFLAG_CARDS_SET)
 
     def _wb_old_object_pointing_to_pinned(self, obj, ignore):
         self.write_barrier(obj)
@@ -1947,7 +1944,6 @@
             return
             #
         elif self._is_pinned(obj):
-            hdr = self.header(obj)
             #
             # track parent of pinned object specially. This mus be done before
             # checking for GCFLAG_VISITED: it may be that the same pinned 
object
@@ -1963,10 +1959,10 @@
                 self.updated_old_objects_pointing_to_pinned = True
                 self.set_flags(parent, GCFLAG_PINNED_OBJECT_PARENT_KNOWN)
             #
-            if hdr.tid & GCFLAG_VISITED:
+            if self.get_flags(obj) & GCFLAG_VISITED:
                 return
             #
-            hdr.tid |= GCFLAG_VISITED
+            self.add_flags(obj, GCFLAG_VISITED)
             #
             self.surviving_pinned_objects.append(
                 llarena.getfakearenaaddress(obj - size_gc_header))
@@ -2031,10 +2027,9 @@
         # a bug in which dying young arrays with card marks would
         # still be scanned before being freed, keeping a lot of
         # objects unnecessarily alive.
-        hdr = self.header(obj)
-        if hdr.tid & GCFLAG_VISITED_RMY:
+        if self.get_flags(obj) & GCFLAG_VISITED_RMY:
             return
-        hdr.tid |= GCFLAG_VISITED_RMY
+        self.add_flags(obj, GCFLAG_VISITED_RMY)
         #
         # Accounting
         size_gc_header = self.gcheaderbuilder.size_gc_header
@@ -2044,12 +2039,12 @@
         # we just made 'obj' old, so we need to add it to the correct lists
         added_somewhere = False
         #
-        if hdr.tid & GCFLAG_TRACK_YOUNG_PTRS == 0:
+        if self.get_flags(obj) & GCFLAG_TRACK_YOUNG_PTRS == 0:
             self.old_objects_pointing_to_young.append(obj)
             added_somewhere = True
         #
-        if hdr.tid & GCFLAG_HAS_CARDS != 0:
-            ll_assert(hdr.tid & GCFLAG_CARDS_SET != 0,
+        if self.get_flags(obj) & GCFLAG_HAS_CARDS != 0:
+            ll_assert(self.get_flags(obj) & GCFLAG_CARDS_SET != 0,
                       "young array: GCFLAG_HAS_CARDS without GCFLAG_CARDS_SET")
             self.old_objects_with_cards_set.append(obj)
             added_somewhere = True
@@ -2476,19 +2471,19 @@
         # flag GCFLAG_PINNED_OBJECT_PARENT_KNOWN is used during minor
         # collections and shouldn't be set here either.
         #
-        hdr = self.header(obj)
-        ll_assert((hdr.tid & GCFLAG_PINNED) == 0,
+        flags = self.get_flags(obj)
+        ll_assert((flags & GCFLAG_PINNED) == 0,
                   "pinned object in 'objects_to_trace'")
         ll_assert(not self.is_in_nursery(obj),
                   "nursery object in 'objects_to_trace'")
-        if hdr.tid & (GCFLAG_VISITED | GCFLAG_NO_HEAP_PTRS):
+        if flags & (GCFLAG_VISITED | GCFLAG_NO_HEAP_PTRS):
             return 0
         #
         # It's the first time.  We set the flag VISITED.  The trick is
         # to also set TRACK_YOUNG_PTRS here, for the write barrier.
-        hdr.tid |= GCFLAG_VISITED | GCFLAG_TRACK_YOUNG_PTRS
+        self.add_flags(obj, GCFLAG_VISITED | GCFLAG_TRACK_YOUNG_PTRS)
 
-        if self.has_gcptr(llop.extract_ushort(llgroup.HALFWORD, hdr.tid)):
+        if self.has_gcptr(self.get_type_id(obj)):
             #
             # Trace the content of the object and put all objects it references
             # into the 'objects_to_trace' list.
@@ -2691,8 +2686,7 @@
     def _bump_finalization_state_from_0_to_1(self, obj):
         ll_assert(self._finalization_state(obj) == 0,
                   "unexpected finalization state != 0")
-        hdr = self.header(obj)
-        hdr.tid |= GCFLAG_FINALIZATION_ORDERING
+        self.add_flags(obj, GCFLAG_FINALIZATION_ORDERING)
 
     def _recursively_bump_finalization_state_from_2_to_3(self, obj):
         ll_assert(self._finalization_state(obj) == 2,
@@ -2702,9 +2696,8 @@
         pending.append(obj)
         while pending.non_empty():
             y = pending.pop()
-            hdr = self.header(y)
-            if hdr.tid & GCFLAG_FINALIZATION_ORDERING:     # state 2 ?
-                hdr.tid &= ~GCFLAG_FINALIZATION_ORDERING   # change to state 3
+            if self.get_flags(y) & GCFLAG_FINALIZATION_ORDERING:     # state 2 
?
+                self.remove_flags(y, GCFLAG_FINALIZATION_ORDERING)   # change 
to state 3
                 self.trace(y, self._append_if_nonnull, pending)
 
     def _recursively_bump_finalization_state_from_1_to_2(self, obj):
@@ -3050,10 +3043,10 @@
         return self.header(obj).tid
 
     def set_flags(self, obj, flags):
-        self.header(obj).tid=flags
+        self.header(obj).tid = flags
 
     def add_flags(self, obj, flags):
-        self.header(obj).tid|=flags
+        self.header(obj).tid |= flags
 
     def remove_flags(self, obj, flags):
-        self.header(obj).tid&=~flags
+        self.header(obj).tid &= ~flags
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to