mirror of
https://github.com/vishapoberon/compiler.git
synced 2026-04-06 05:12:26 +00:00
Fix heap address comparisons for sign crossing.
This commit is contained in:
parent
6507b4ede3
commit
41a239c5aa
1 changed files with 9 additions and 9 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue