summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ptr_chck.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/ptr_chck.c b/ptr_chck.c
index d41a0ad2..8b760af0 100644
--- a/ptr_chck.c
+++ b/ptr_chck.c
@@ -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) {