Fix heap address comparisons for sign crossing.

This commit is contained in:
David Brown 2016-12-13 20:15:29 +00:00
parent 6507b4ede3
commit 41a239c5aa

View file

@ -224,7 +224,7 @@ MODULE Heap;
S.PUT(chnk, heap); heap := chnk S.PUT(chnk, heap); heap := chnk
ELSE ELSE
j := heap; S.GET(j, next); j := heap; S.GET(j, next);
WHILE (next # 0) & (chnk > next) DO WHILE (next # 0) & (chnk - next > 0) DO
j := next; j := next;
S.GET(j, next) S.GET(j, next)
END; END;
@ -311,7 +311,7 @@ MODULE Heap;
INC(adr, restsize) INC(adr, restsize)
END ; END ;
i := adr + 4*SZA; end := adr + blksz; i := adr + 4*SZA; end := adr + blksz;
WHILE i < end DO (*deliberately unrolled*) WHILE end - i > 0 DO (*deliberately unrolled*)
S.PUT(i, AddressZero); S.PUT(i, AddressZero);
S.PUT(i + SZA, AddressZero); S.PUT(i + SZA, AddressZero);
S.PUT(i + 2*SZA, AddressZero); S.PUT(i + 2*SZA, AddressZero);
@ -393,7 +393,7 @@ MODULE Heap;
WHILE chnk # 0 DO WHILE chnk # 0 DO
adr := chnk + blkOff; adr := chnk + blkOff;
S.GET(chnk + endOff, end); S.GET(chnk + endOff, end);
WHILE adr < end DO WHILE end - adr > 0 DO
S.GET(adr, tag); S.GET(adr, tag);
IF ODD(tag) THEN (*marked*) IF ODD(tag) THEN (*marked*)
IF freesize > 0 THEN IF freesize > 0 THEN
@ -453,21 +453,21 @@ MODULE Heap;
VAR chnk, adr, tag, next, lim, lim1, i, ptr, size: S.ADDRESS; VAR chnk, adr, tag, next, lim, lim1, i, ptr, size: S.ADDRESS;
BEGIN BEGIN
chnk := heap; i := 0; lim := cand[n-1]; chnk := heap; i := 0; lim := cand[n-1];
WHILE (chnk # 0 ) & (chnk < lim) DO WHILE (chnk # 0 ) & (lim - chnk > 0) DO
adr := chnk + blkOff; adr := chnk + blkOff;
S.GET(chnk + endOff, lim1); S.GET(chnk + endOff, lim1);
IF lim < lim1 THEN lim1 := lim END ; IF lim1 - lim > 0 THEN lim1 := lim END ;
WHILE adr < lim1 DO WHILE lim1 - adr > 0 DO
S.GET(adr, tag); S.GET(adr, tag);
IF ODD(tag) THEN (*already marked*) IF ODD(tag) THEN (*already marked*)
S.GET(tag-1, size); INC(adr, size) S.GET(tag-1, size); INC(adr, size)
ELSE ELSE
S.GET(tag, size); S.GET(tag, size);
ptr := adr + SZA; ptr := adr + SZA;
WHILE cand[i] < ptr DO INC(i) END ; WHILE ptr - cand[i] > 0 DO INC(i) END ;
IF i = n THEN RETURN END ; IF i = n THEN RETURN END ;
next := adr + size; next := adr + size;
IF cand[i] < next THEN Mark(ptr) END ; IF next - cand[i] > 0 THEN Mark(ptr) END ;
adr := next adr := next
END END
END ; END ;
@ -530,7 +530,7 @@ MODULE Heap;
stack0 := ModulesMainStackFrame(); stack0 := ModulesMainStackFrame();
(* check for minimum alignment of pointers *) (* check for minimum alignment of pointers *)
inc := S.ADR(align.p) - S.ADR(align); inc := S.ADR(align.p) - S.ADR(align);
IF sp > stack0 THEN inc := -inc END ; IF sp - stack0 > 0 THEN inc := -inc END ;
WHILE sp # stack0 DO WHILE sp # stack0 DO
S.GET(sp, p); S.GET(sp, p);
IF (p > 0) & (p >= heapPosMin) & (p < heapPosMax) IF (p > 0) & (p >= heapPosMin) & (p < heapPosMax)