]> granicus.if.org Git - gc/commitdiff
Fix GC_is_valid_displacement and GC_is_visible for non-small objects
authorIvan Maidanski <ivmai@mail.ru>
Wed, 11 Jul 2018 20:09:00 +0000 (23:09 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Wed, 11 Jul 2018 20:09:00 +0000 (23:09 +0300)
* ptr_chck.c (GC_is_valid_displacement): Remove redundant
IS_FORWARDING_ADDR_OR_NIL(hhdr) call if GC_all_interior_pointers.
* ptr_chck.c (GC_is_valid_displacement): Do not goto fail if
p+sz-offset > h+1 but IS_FORWARDING_ADDR_OR_NIL(HDR(h+1)).
* ptr_chck.c (GC_is_visible): Transform comment about GC_base to
a TODO item; set hhdr to HDR(base) instead of HDR(p)
if HBLKPTR(base)!=HBLKPTR(p).

ptr_chck.c

index d41a0ad21187e4b5e6807f74ab2124a1d635b65c..8b760af03402621d7a97c6d1aace746152577aaf 100644 (file)
@@ -131,8 +131,7 @@ GC_API void * GC_CALL GC_is_valid_displacement(void *p)
            h = FORWARDED_ADDR(h, hhdr);
            hhdr = HDR(h);
         }
-    }
-    if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
+    } else if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) {
         goto fail;
     }
     sz = hhdr -> hb_sz;
@@ -140,7 +139,8 @@ GC_API void * GC_CALL GC_is_valid_displacement(void *p)
     offset = pdispl % sz;
     if ((sz > MAXOBJBYTES && (word)p >= (word)h + sz)
         || !GC_valid_offsets[offset]
-        || (word)p - offset + sz > (word)(h + 1)) {
+        || ((word)p + (sz - offset) > (word)(h + 1)
+            && !IS_FORWARDING_ADDR_OR_NIL(HDR(h + 1)))) {
         goto fail;
     }
     return(p);
@@ -215,10 +215,12 @@ GC_API void * GC_CALL GC_is_visible(void *p)
         } else {
             /* p points to the heap. */
             word descr;
-            ptr_t base = (ptr_t)GC_base(p); /* Should be manually inlined? */
+            ptr_t base = (ptr_t)GC_base(p);
+                        /* TODO: should GC_base be manually inlined? */
 
-            if (base == 0) goto fail;
-            if (HBLKPTR(base) != HBLKPTR(p)) hhdr = HDR((word)p);
+            if (NULL == base) goto fail;
+            if (HBLKPTR(base) != HBLKPTR(p))
+                hhdr = HDR(base);
             descr = hhdr -> hb_descr;
     retry:
             switch(descr & GC_DS_TAGS) {