Replace FetchAddress with (original) SYSTEM.GET.

This commit is contained in:
David Brown 2016-09-14 14:01:31 +01:00
parent 7efd5a0158
commit a36e04ebd7
7 changed files with 151 additions and 207 deletions

View file

@ -82,7 +82,6 @@ export LONGINT *Heap__1__typ;
static void Heap_CheckFin (void); static void Heap_CheckFin (void);
static void Heap_ExtendHeap (address blksz); static void Heap_ExtendHeap (address blksz);
export void Heap_FINALL (void); export void Heap_FINALL (void);
static address Heap_FetchAddress (address pointer);
static void Heap_Finalize (void); static void Heap_Finalize (void);
export void Heap_GC (BOOLEAN markStack); export void Heap_GC (BOOLEAN markStack);
static void Heap_HeapSort (address n, address *a, LONGINT a__len); static void Heap_HeapSort (address n, address *a, LONGINT a__len);
@ -188,15 +187,6 @@ static address Heap_NewChunk (address blksz)
return _o_result; return _o_result;
} }
static address Heap_FetchAddress (address pointer)
{
address _o_result;
address r;
__GET(pointer, r, address);
_o_result = r;
return _o_result;
}
static void Heap_ExtendHeap (address blksz) static void Heap_ExtendHeap (address blksz)
{ {
address size, chnk, j, next; address size, chnk, j, next;
@ -212,16 +202,16 @@ static void Heap_ExtendHeap (address blksz)
Heap_heap = chnk; Heap_heap = chnk;
} else { } else {
j = Heap_heap; j = Heap_heap;
next = Heap_FetchAddress(j); __GET(j, next, address);
while ((next != 0 && chnk > next)) { while ((next != 0 && chnk > next)) {
j = next; j = next;
next = Heap_FetchAddress(j); __GET(j, next, address);
} }
__PUT(chnk, next, address); __PUT(chnk, next, address);
__PUT(j, chnk, address); __PUT(j, chnk, address);
} }
if (next == 0) { if (next == 0) {
Heap_heapend = Heap_FetchAddress(chnk + 4); __GET(chnk + 4, Heap_heapend, address);
} }
} }
} }
@ -232,7 +222,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
address i, i0, di, blksz, restsize, t, adr, end, next, prev; address i, i0, di, blksz, restsize, t, adr, end, next, prev;
SYSTEM_PTR new; SYSTEM_PTR new;
Heap_Lock(); Heap_Lock();
blksz = Heap_FetchAddress(tag); __GET(tag, blksz, address);
i0 = __ASHR(blksz, 4); i0 = __ASHR(blksz, 4);
i = i0; i = i0;
if (i < 9) { if (i < 9) {
@ -243,7 +233,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
} }
} }
if (i < 9) { if (i < 9) {
next = Heap_FetchAddress(adr + 12); __GET(adr + 12, next, address);
Heap_freeList[i] = next; Heap_freeList[i] = next;
if (i != i0) { if (i != i0) {
di = i - i0; di = i - i0;
@ -284,12 +274,12 @@ SYSTEM_PTR Heap_NEWREC (address tag)
return _o_result; return _o_result;
} }
} }
t = Heap_FetchAddress(adr + 4); __GET(adr + 4, t, address);
if (t >= blksz) { if (t >= blksz) {
break; break;
} }
prev = adr; prev = adr;
adr = Heap_FetchAddress(adr + 12); __GET(adr + 12, adr, address);
} }
restsize = t - blksz; restsize = t - blksz;
end = adr + restsize; end = adr + restsize;
@ -299,7 +289,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
if (restsize > 144) { if (restsize > 144) {
__PUT(adr + 4, restsize, address); __PUT(adr + 4, restsize, address);
} else { } else {
next = Heap_FetchAddress(adr + 12); __GET(adr + 12, next, address);
if (prev == 0) { if (prev == 0) {
Heap_bigBlocks = next; Heap_bigBlocks = next;
} else { } else {
@ -355,7 +345,7 @@ static void Heap_Mark (address q)
{ {
address p, tag, offset, fld, n, tagbits; address p, tag, offset, fld, n, tagbits;
if (q != 0) { if (q != 0) {
tagbits = Heap_FetchAddress(q - 4); __GET(q - 4, tagbits, address);
if (!__ODD(tagbits)) { if (!__ODD(tagbits)) {
__PUT(q - 4, tagbits + 1, address); __PUT(q - 4, tagbits + 1, address);
p = 0; p = 0;
@ -369,17 +359,17 @@ static void Heap_Mark (address q)
} }
n = q; n = q;
q = p; q = p;
tag = Heap_FetchAddress(q - 4); __GET(q - 4, tag, address);
tag -= 1; tag -= 1;
__GET(tag, offset, address); __GET(tag, offset, address);
fld = q + offset; fld = q + offset;
p = Heap_FetchAddress(fld); __GET(fld, p, address);
__PUT(fld, (SYSTEM_PTR)(address)n, SYSTEM_PTR); __PUT(fld, (SYSTEM_PTR)(address)n, SYSTEM_PTR);
} else { } else {
fld = q + offset; fld = q + offset;
n = Heap_FetchAddress(fld); __GET(fld, n, address);
if (n != 0) { if (n != 0) {
tagbits = Heap_FetchAddress(n - 4); __GET(n - 4, tagbits, address);
if (!__ODD(tagbits)) { if (!__ODD(tagbits)) {
__PUT(n - 4, tagbits + 1, address); __PUT(n - 4, tagbits + 1, address);
__PUT(q - 4, tag + 1, address); __PUT(q - 4, tag + 1, address);
@ -415,9 +405,9 @@ static void Heap_Scan (void)
chnk = Heap_heap; chnk = Heap_heap;
while (chnk != 0) { while (chnk != 0) {
adr = chnk + 12; adr = chnk + 12;
end = Heap_FetchAddress(chnk + 4); __GET(chnk + 4, end, address);
while (adr < end) { while (adr < end) {
tag = Heap_FetchAddress(adr); __GET(adr, tag, address);
if (__ODD(tag)) { if (__ODD(tag)) {
if (freesize > 0) { if (freesize > 0) {
start = adr - freesize; start = adr - freesize;
@ -436,11 +426,11 @@ static void Heap_Scan (void)
} }
tag -= 1; tag -= 1;
__PUT(adr, tag, address); __PUT(adr, tag, address);
size = Heap_FetchAddress(tag); __GET(tag, size, address);
Heap_allocated += size; Heap_allocated += size;
adr += size; adr += size;
} else { } else {
size = Heap_FetchAddress(tag); __GET(tag, size, address);
freesize += size; freesize += size;
adr += size; adr += size;
} }
@ -460,7 +450,7 @@ static void Heap_Scan (void)
Heap_bigBlocks = start; Heap_bigBlocks = start;
} }
} }
chnk = Heap_FetchAddress(chnk); __GET(chnk, chnk, address);
} }
} }
@ -509,17 +499,17 @@ static void Heap_MarkCandidates (address n, address *cand, LONGINT cand__len)
lim = cand[n - 1]; lim = cand[n - 1];
while ((chnk != 0 && chnk < lim)) { while ((chnk != 0 && chnk < lim)) {
adr = chnk + 12; adr = chnk + 12;
lim1 = Heap_FetchAddress(chnk + 4); __GET(chnk + 4, lim1, address);
if (lim < lim1) { if (lim < lim1) {
lim1 = lim; lim1 = lim;
} }
while (adr < lim1) { while (adr < lim1) {
tag = Heap_FetchAddress(adr); __GET(adr, tag, address);
if (__ODD(tag)) { if (__ODD(tag)) {
size = Heap_FetchAddress(tag - 1); __GET(tag - 1, size, address);
adr += size; adr += size;
} else { } else {
size = Heap_FetchAddress(tag); __GET(tag, size, address);
ptr = adr + 4; ptr = adr + 4;
while (cand[i] < ptr) { while (cand[i] < ptr) {
i += 1; i += 1;
@ -534,7 +524,7 @@ static void Heap_MarkCandidates (address n, address *cand, LONGINT cand__len)
adr = next; adr = next;
} }
} }
chnk = Heap_FetchAddress(chnk); __GET(chnk, chnk, address);
} }
} }
@ -544,7 +534,7 @@ static void Heap_CheckFin (void)
address tag; address tag;
n = Heap_fin; n = Heap_fin;
while (n != NIL) { while (n != NIL) {
tag = Heap_FetchAddress(n->obj - 4); __GET(n->obj - 4, tag, address);
if (!__ODD(tag)) { if (!__ODD(tag)) {
n->marked = 0; n->marked = 0;
Heap_Mark(n->obj); Heap_Mark(n->obj);
@ -723,7 +713,7 @@ void Heap_RegisterFinalizer (SYSTEM_PTR obj, Heap_Finalizer finalize)
void Heap_InitHeap (void) void Heap_InitHeap (void)
{ {
Heap_heap = Heap_NewChunk(128000); Heap_heap = Heap_NewChunk(128000);
Heap_heapend = Heap_FetchAddress(Heap_heap + 4); __GET(Heap_heap + 4, Heap_heapend, address);
__PUT(Heap_heap, 0, address); __PUT(Heap_heap, 0, address);
Heap_allocated = 0; Heap_allocated = 0;
Heap_firstTry = 1; Heap_firstTry = 1;

View file

@ -82,7 +82,6 @@ export LONGINT *Heap__1__typ;
static void Heap_CheckFin (void); static void Heap_CheckFin (void);
static void Heap_ExtendHeap (address blksz); static void Heap_ExtendHeap (address blksz);
export void Heap_FINALL (void); export void Heap_FINALL (void);
static address Heap_FetchAddress (address pointer);
static void Heap_Finalize (void); static void Heap_Finalize (void);
export void Heap_GC (BOOLEAN markStack); export void Heap_GC (BOOLEAN markStack);
static void Heap_HeapSort (address n, address *a, LONGINT a__len); static void Heap_HeapSort (address n, address *a, LONGINT a__len);
@ -188,15 +187,6 @@ static address Heap_NewChunk (address blksz)
return _o_result; return _o_result;
} }
static address Heap_FetchAddress (address pointer)
{
address _o_result;
address r;
__GET(pointer, r, address);
_o_result = r;
return _o_result;
}
static void Heap_ExtendHeap (address blksz) static void Heap_ExtendHeap (address blksz)
{ {
address size, chnk, j, next; address size, chnk, j, next;
@ -212,16 +202,16 @@ static void Heap_ExtendHeap (address blksz)
Heap_heap = chnk; Heap_heap = chnk;
} else { } else {
j = Heap_heap; j = Heap_heap;
next = Heap_FetchAddress(j); __GET(j, next, address);
while ((next != 0 && chnk > next)) { while ((next != 0 && chnk > next)) {
j = next; j = next;
next = Heap_FetchAddress(j); __GET(j, next, address);
} }
__PUT(chnk, next, address); __PUT(chnk, next, address);
__PUT(j, chnk, address); __PUT(j, chnk, address);
} }
if (next == 0) { if (next == 0) {
Heap_heapend = Heap_FetchAddress(chnk + 4); __GET(chnk + 4, Heap_heapend, address);
} }
} }
} }
@ -232,7 +222,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
address i, i0, di, blksz, restsize, t, adr, end, next, prev; address i, i0, di, blksz, restsize, t, adr, end, next, prev;
SYSTEM_PTR new; SYSTEM_PTR new;
Heap_Lock(); Heap_Lock();
blksz = Heap_FetchAddress(tag); __GET(tag, blksz, address);
i0 = __ASHR(blksz, 4); i0 = __ASHR(blksz, 4);
i = i0; i = i0;
if (i < 9) { if (i < 9) {
@ -243,7 +233,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
} }
} }
if (i < 9) { if (i < 9) {
next = Heap_FetchAddress(adr + 12); __GET(adr + 12, next, address);
Heap_freeList[i] = next; Heap_freeList[i] = next;
if (i != i0) { if (i != i0) {
di = i - i0; di = i - i0;
@ -284,12 +274,12 @@ SYSTEM_PTR Heap_NEWREC (address tag)
return _o_result; return _o_result;
} }
} }
t = Heap_FetchAddress(adr + 4); __GET(adr + 4, t, address);
if (t >= blksz) { if (t >= blksz) {
break; break;
} }
prev = adr; prev = adr;
adr = Heap_FetchAddress(adr + 12); __GET(adr + 12, adr, address);
} }
restsize = t - blksz; restsize = t - blksz;
end = adr + restsize; end = adr + restsize;
@ -299,7 +289,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
if (restsize > 144) { if (restsize > 144) {
__PUT(adr + 4, restsize, address); __PUT(adr + 4, restsize, address);
} else { } else {
next = Heap_FetchAddress(adr + 12); __GET(adr + 12, next, address);
if (prev == 0) { if (prev == 0) {
Heap_bigBlocks = next; Heap_bigBlocks = next;
} else { } else {
@ -355,7 +345,7 @@ static void Heap_Mark (address q)
{ {
address p, tag, offset, fld, n, tagbits; address p, tag, offset, fld, n, tagbits;
if (q != 0) { if (q != 0) {
tagbits = Heap_FetchAddress(q - 4); __GET(q - 4, tagbits, address);
if (!__ODD(tagbits)) { if (!__ODD(tagbits)) {
__PUT(q - 4, tagbits + 1, address); __PUT(q - 4, tagbits + 1, address);
p = 0; p = 0;
@ -369,17 +359,17 @@ static void Heap_Mark (address q)
} }
n = q; n = q;
q = p; q = p;
tag = Heap_FetchAddress(q - 4); __GET(q - 4, tag, address);
tag -= 1; tag -= 1;
__GET(tag, offset, address); __GET(tag, offset, address);
fld = q + offset; fld = q + offset;
p = Heap_FetchAddress(fld); __GET(fld, p, address);
__PUT(fld, (SYSTEM_PTR)(address)n, SYSTEM_PTR); __PUT(fld, (SYSTEM_PTR)(address)n, SYSTEM_PTR);
} else { } else {
fld = q + offset; fld = q + offset;
n = Heap_FetchAddress(fld); __GET(fld, n, address);
if (n != 0) { if (n != 0) {
tagbits = Heap_FetchAddress(n - 4); __GET(n - 4, tagbits, address);
if (!__ODD(tagbits)) { if (!__ODD(tagbits)) {
__PUT(n - 4, tagbits + 1, address); __PUT(n - 4, tagbits + 1, address);
__PUT(q - 4, tag + 1, address); __PUT(q - 4, tag + 1, address);
@ -415,9 +405,9 @@ static void Heap_Scan (void)
chnk = Heap_heap; chnk = Heap_heap;
while (chnk != 0) { while (chnk != 0) {
adr = chnk + 12; adr = chnk + 12;
end = Heap_FetchAddress(chnk + 4); __GET(chnk + 4, end, address);
while (adr < end) { while (adr < end) {
tag = Heap_FetchAddress(adr); __GET(adr, tag, address);
if (__ODD(tag)) { if (__ODD(tag)) {
if (freesize > 0) { if (freesize > 0) {
start = adr - freesize; start = adr - freesize;
@ -436,11 +426,11 @@ static void Heap_Scan (void)
} }
tag -= 1; tag -= 1;
__PUT(adr, tag, address); __PUT(adr, tag, address);
size = Heap_FetchAddress(tag); __GET(tag, size, address);
Heap_allocated += size; Heap_allocated += size;
adr += size; adr += size;
} else { } else {
size = Heap_FetchAddress(tag); __GET(tag, size, address);
freesize += size; freesize += size;
adr += size; adr += size;
} }
@ -460,7 +450,7 @@ static void Heap_Scan (void)
Heap_bigBlocks = start; Heap_bigBlocks = start;
} }
} }
chnk = Heap_FetchAddress(chnk); __GET(chnk, chnk, address);
} }
} }
@ -509,17 +499,17 @@ static void Heap_MarkCandidates (address n, address *cand, LONGINT cand__len)
lim = cand[n - 1]; lim = cand[n - 1];
while ((chnk != 0 && chnk < lim)) { while ((chnk != 0 && chnk < lim)) {
adr = chnk + 12; adr = chnk + 12;
lim1 = Heap_FetchAddress(chnk + 4); __GET(chnk + 4, lim1, address);
if (lim < lim1) { if (lim < lim1) {
lim1 = lim; lim1 = lim;
} }
while (adr < lim1) { while (adr < lim1) {
tag = Heap_FetchAddress(adr); __GET(adr, tag, address);
if (__ODD(tag)) { if (__ODD(tag)) {
size = Heap_FetchAddress(tag - 1); __GET(tag - 1, size, address);
adr += size; adr += size;
} else { } else {
size = Heap_FetchAddress(tag); __GET(tag, size, address);
ptr = adr + 4; ptr = adr + 4;
while (cand[i] < ptr) { while (cand[i] < ptr) {
i += 1; i += 1;
@ -534,7 +524,7 @@ static void Heap_MarkCandidates (address n, address *cand, LONGINT cand__len)
adr = next; adr = next;
} }
} }
chnk = Heap_FetchAddress(chnk); __GET(chnk, chnk, address);
} }
} }
@ -544,7 +534,7 @@ static void Heap_CheckFin (void)
address tag; address tag;
n = Heap_fin; n = Heap_fin;
while (n != NIL) { while (n != NIL) {
tag = Heap_FetchAddress(n->obj - 4); __GET(n->obj - 4, tag, address);
if (!__ODD(tag)) { if (!__ODD(tag)) {
n->marked = 0; n->marked = 0;
Heap_Mark(n->obj); Heap_Mark(n->obj);
@ -723,7 +713,7 @@ void Heap_RegisterFinalizer (SYSTEM_PTR obj, Heap_Finalizer finalize)
void Heap_InitHeap (void) void Heap_InitHeap (void)
{ {
Heap_heap = Heap_NewChunk(128000); Heap_heap = Heap_NewChunk(128000);
Heap_heapend = Heap_FetchAddress(Heap_heap + 4); __GET(Heap_heap + 4, Heap_heapend, address);
__PUT(Heap_heap, 0, address); __PUT(Heap_heap, 0, address);
Heap_allocated = 0; Heap_allocated = 0;
Heap_firstTry = 1; Heap_firstTry = 1;

View file

@ -82,7 +82,6 @@ export LONGINT *Heap__1__typ;
static void Heap_CheckFin (void); static void Heap_CheckFin (void);
static void Heap_ExtendHeap (address blksz); static void Heap_ExtendHeap (address blksz);
export void Heap_FINALL (void); export void Heap_FINALL (void);
static address Heap_FetchAddress (address pointer);
static void Heap_Finalize (void); static void Heap_Finalize (void);
export void Heap_GC (BOOLEAN markStack); export void Heap_GC (BOOLEAN markStack);
static void Heap_HeapSort (address n, address *a, LONGINT a__len); static void Heap_HeapSort (address n, address *a, LONGINT a__len);
@ -188,15 +187,6 @@ static address Heap_NewChunk (address blksz)
return _o_result; return _o_result;
} }
static address Heap_FetchAddress (address pointer)
{
address _o_result;
address r;
__GET(pointer, r, address);
_o_result = r;
return _o_result;
}
static void Heap_ExtendHeap (address blksz) static void Heap_ExtendHeap (address blksz)
{ {
address size, chnk, j, next; address size, chnk, j, next;
@ -212,16 +202,16 @@ static void Heap_ExtendHeap (address blksz)
Heap_heap = chnk; Heap_heap = chnk;
} else { } else {
j = Heap_heap; j = Heap_heap;
next = Heap_FetchAddress(j); __GET(j, next, address);
while ((next != 0 && chnk > next)) { while ((next != 0 && chnk > next)) {
j = next; j = next;
next = Heap_FetchAddress(j); __GET(j, next, address);
} }
__PUT(chnk, next, address); __PUT(chnk, next, address);
__PUT(j, chnk, address); __PUT(j, chnk, address);
} }
if (next == 0) { if (next == 0) {
Heap_heapend = Heap_FetchAddress(chnk + 8); __GET(chnk + 8, Heap_heapend, address);
} }
} }
} }
@ -232,7 +222,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
address i, i0, di, blksz, restsize, t, adr, end, next, prev; address i, i0, di, blksz, restsize, t, adr, end, next, prev;
SYSTEM_PTR new; SYSTEM_PTR new;
Heap_Lock(); Heap_Lock();
blksz = Heap_FetchAddress(tag); __GET(tag, blksz, address);
i0 = __ASHR(blksz, 5); i0 = __ASHR(blksz, 5);
i = i0; i = i0;
if (i < 9) { if (i < 9) {
@ -243,7 +233,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
} }
} }
if (i < 9) { if (i < 9) {
next = Heap_FetchAddress(adr + 24); __GET(adr + 24, next, address);
Heap_freeList[i] = next; Heap_freeList[i] = next;
if (i != i0) { if (i != i0) {
di = i - i0; di = i - i0;
@ -284,12 +274,12 @@ SYSTEM_PTR Heap_NEWREC (address tag)
return _o_result; return _o_result;
} }
} }
t = Heap_FetchAddress(adr + 8); __GET(adr + 8, t, address);
if (t >= blksz) { if (t >= blksz) {
break; break;
} }
prev = adr; prev = adr;
adr = Heap_FetchAddress(adr + 24); __GET(adr + 24, adr, address);
} }
restsize = t - blksz; restsize = t - blksz;
end = adr + restsize; end = adr + restsize;
@ -299,7 +289,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
if (restsize > 288) { if (restsize > 288) {
__PUT(adr + 8, restsize, address); __PUT(adr + 8, restsize, address);
} else { } else {
next = Heap_FetchAddress(adr + 24); __GET(adr + 24, next, address);
if (prev == 0) { if (prev == 0) {
Heap_bigBlocks = next; Heap_bigBlocks = next;
} else { } else {
@ -355,7 +345,7 @@ static void Heap_Mark (address q)
{ {
address p, tag, offset, fld, n, tagbits; address p, tag, offset, fld, n, tagbits;
if (q != 0) { if (q != 0) {
tagbits = Heap_FetchAddress(q - 8); __GET(q - 8, tagbits, address);
if (!__ODD(tagbits)) { if (!__ODD(tagbits)) {
__PUT(q - 8, tagbits + 1, address); __PUT(q - 8, tagbits + 1, address);
p = 0; p = 0;
@ -369,17 +359,17 @@ static void Heap_Mark (address q)
} }
n = q; n = q;
q = p; q = p;
tag = Heap_FetchAddress(q - 8); __GET(q - 8, tag, address);
tag -= 1; tag -= 1;
__GET(tag, offset, address); __GET(tag, offset, address);
fld = q + offset; fld = q + offset;
p = Heap_FetchAddress(fld); __GET(fld, p, address);
__PUT(fld, (SYSTEM_PTR)(address)n, SYSTEM_PTR); __PUT(fld, (SYSTEM_PTR)(address)n, SYSTEM_PTR);
} else { } else {
fld = q + offset; fld = q + offset;
n = Heap_FetchAddress(fld); __GET(fld, n, address);
if (n != 0) { if (n != 0) {
tagbits = Heap_FetchAddress(n - 8); __GET(n - 8, tagbits, address);
if (!__ODD(tagbits)) { if (!__ODD(tagbits)) {
__PUT(n - 8, tagbits + 1, address); __PUT(n - 8, tagbits + 1, address);
__PUT(q - 8, tag + 1, address); __PUT(q - 8, tag + 1, address);
@ -415,9 +405,9 @@ static void Heap_Scan (void)
chnk = Heap_heap; chnk = Heap_heap;
while (chnk != 0) { while (chnk != 0) {
adr = chnk + 24; adr = chnk + 24;
end = Heap_FetchAddress(chnk + 8); __GET(chnk + 8, end, address);
while (adr < end) { while (adr < end) {
tag = Heap_FetchAddress(adr); __GET(adr, tag, address);
if (__ODD(tag)) { if (__ODD(tag)) {
if (freesize > 0) { if (freesize > 0) {
start = adr - freesize; start = adr - freesize;
@ -436,11 +426,11 @@ static void Heap_Scan (void)
} }
tag -= 1; tag -= 1;
__PUT(adr, tag, address); __PUT(adr, tag, address);
size = Heap_FetchAddress(tag); __GET(tag, size, address);
Heap_allocated += size; Heap_allocated += size;
adr += size; adr += size;
} else { } else {
size = Heap_FetchAddress(tag); __GET(tag, size, address);
freesize += size; freesize += size;
adr += size; adr += size;
} }
@ -460,7 +450,7 @@ static void Heap_Scan (void)
Heap_bigBlocks = start; Heap_bigBlocks = start;
} }
} }
chnk = Heap_FetchAddress(chnk); __GET(chnk, chnk, address);
} }
} }
@ -509,17 +499,17 @@ static void Heap_MarkCandidates (address n, address *cand, LONGINT cand__len)
lim = cand[n - 1]; lim = cand[n - 1];
while ((chnk != 0 && chnk < lim)) { while ((chnk != 0 && chnk < lim)) {
adr = chnk + 24; adr = chnk + 24;
lim1 = Heap_FetchAddress(chnk + 8); __GET(chnk + 8, lim1, address);
if (lim < lim1) { if (lim < lim1) {
lim1 = lim; lim1 = lim;
} }
while (adr < lim1) { while (adr < lim1) {
tag = Heap_FetchAddress(adr); __GET(adr, tag, address);
if (__ODD(tag)) { if (__ODD(tag)) {
size = Heap_FetchAddress(tag - 1); __GET(tag - 1, size, address);
adr += size; adr += size;
} else { } else {
size = Heap_FetchAddress(tag); __GET(tag, size, address);
ptr = adr + 8; ptr = adr + 8;
while (cand[i] < ptr) { while (cand[i] < ptr) {
i += 1; i += 1;
@ -534,7 +524,7 @@ static void Heap_MarkCandidates (address n, address *cand, LONGINT cand__len)
adr = next; adr = next;
} }
} }
chnk = Heap_FetchAddress(chnk); __GET(chnk, chnk, address);
} }
} }
@ -544,7 +534,7 @@ static void Heap_CheckFin (void)
address tag; address tag;
n = Heap_fin; n = Heap_fin;
while (n != NIL) { while (n != NIL) {
tag = Heap_FetchAddress(n->obj - 8); __GET(n->obj - 8, tag, address);
if (!__ODD(tag)) { if (!__ODD(tag)) {
n->marked = 0; n->marked = 0;
Heap_Mark(n->obj); Heap_Mark(n->obj);
@ -723,7 +713,7 @@ void Heap_RegisterFinalizer (SYSTEM_PTR obj, Heap_Finalizer finalize)
void Heap_InitHeap (void) void Heap_InitHeap (void)
{ {
Heap_heap = Heap_NewChunk(256000); Heap_heap = Heap_NewChunk(256000);
Heap_heapend = Heap_FetchAddress(Heap_heap + 8); __GET(Heap_heap + 8, Heap_heapend, address);
__PUT(Heap_heap, 0, address); __PUT(Heap_heap, 0, address);
Heap_allocated = 0; Heap_allocated = 0;
Heap_firstTry = 1; Heap_firstTry = 1;

View file

@ -82,7 +82,6 @@ export LONGINT *Heap__1__typ;
static void Heap_CheckFin (void); static void Heap_CheckFin (void);
static void Heap_ExtendHeap (address blksz); static void Heap_ExtendHeap (address blksz);
export void Heap_FINALL (void); export void Heap_FINALL (void);
static address Heap_FetchAddress (address pointer);
static void Heap_Finalize (void); static void Heap_Finalize (void);
export void Heap_GC (BOOLEAN markStack); export void Heap_GC (BOOLEAN markStack);
static void Heap_HeapSort (address n, address *a, LONGINT a__len); static void Heap_HeapSort (address n, address *a, LONGINT a__len);
@ -188,15 +187,6 @@ static address Heap_NewChunk (address blksz)
return _o_result; return _o_result;
} }
static address Heap_FetchAddress (address pointer)
{
address _o_result;
address r;
__GET(pointer, r, address);
_o_result = r;
return _o_result;
}
static void Heap_ExtendHeap (address blksz) static void Heap_ExtendHeap (address blksz)
{ {
address size, chnk, j, next; address size, chnk, j, next;
@ -212,16 +202,16 @@ static void Heap_ExtendHeap (address blksz)
Heap_heap = chnk; Heap_heap = chnk;
} else { } else {
j = Heap_heap; j = Heap_heap;
next = Heap_FetchAddress(j); __GET(j, next, address);
while ((next != 0 && chnk > next)) { while ((next != 0 && chnk > next)) {
j = next; j = next;
next = Heap_FetchAddress(j); __GET(j, next, address);
} }
__PUT(chnk, next, address); __PUT(chnk, next, address);
__PUT(j, chnk, address); __PUT(j, chnk, address);
} }
if (next == 0) { if (next == 0) {
Heap_heapend = Heap_FetchAddress(chnk + 4); __GET(chnk + 4, Heap_heapend, address);
} }
} }
} }
@ -232,7 +222,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
address i, i0, di, blksz, restsize, t, adr, end, next, prev; address i, i0, di, blksz, restsize, t, adr, end, next, prev;
SYSTEM_PTR new; SYSTEM_PTR new;
Heap_Lock(); Heap_Lock();
blksz = Heap_FetchAddress(tag); __GET(tag, blksz, address);
i0 = __ASHR(blksz, 4); i0 = __ASHR(blksz, 4);
i = i0; i = i0;
if (i < 9) { if (i < 9) {
@ -243,7 +233,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
} }
} }
if (i < 9) { if (i < 9) {
next = Heap_FetchAddress(adr + 12); __GET(adr + 12, next, address);
Heap_freeList[i] = next; Heap_freeList[i] = next;
if (i != i0) { if (i != i0) {
di = i - i0; di = i - i0;
@ -284,12 +274,12 @@ SYSTEM_PTR Heap_NEWREC (address tag)
return _o_result; return _o_result;
} }
} }
t = Heap_FetchAddress(adr + 4); __GET(adr + 4, t, address);
if (t >= blksz) { if (t >= blksz) {
break; break;
} }
prev = adr; prev = adr;
adr = Heap_FetchAddress(adr + 12); __GET(adr + 12, adr, address);
} }
restsize = t - blksz; restsize = t - blksz;
end = adr + restsize; end = adr + restsize;
@ -299,7 +289,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
if (restsize > 144) { if (restsize > 144) {
__PUT(adr + 4, restsize, address); __PUT(adr + 4, restsize, address);
} else { } else {
next = Heap_FetchAddress(adr + 12); __GET(adr + 12, next, address);
if (prev == 0) { if (prev == 0) {
Heap_bigBlocks = next; Heap_bigBlocks = next;
} else { } else {
@ -355,7 +345,7 @@ static void Heap_Mark (address q)
{ {
address p, tag, offset, fld, n, tagbits; address p, tag, offset, fld, n, tagbits;
if (q != 0) { if (q != 0) {
tagbits = Heap_FetchAddress(q - 4); __GET(q - 4, tagbits, address);
if (!__ODD(tagbits)) { if (!__ODD(tagbits)) {
__PUT(q - 4, tagbits + 1, address); __PUT(q - 4, tagbits + 1, address);
p = 0; p = 0;
@ -369,17 +359,17 @@ static void Heap_Mark (address q)
} }
n = q; n = q;
q = p; q = p;
tag = Heap_FetchAddress(q - 4); __GET(q - 4, tag, address);
tag -= 1; tag -= 1;
__GET(tag, offset, address); __GET(tag, offset, address);
fld = q + offset; fld = q + offset;
p = Heap_FetchAddress(fld); __GET(fld, p, address);
__PUT(fld, (SYSTEM_PTR)(address)n, SYSTEM_PTR); __PUT(fld, (SYSTEM_PTR)(address)n, SYSTEM_PTR);
} else { } else {
fld = q + offset; fld = q + offset;
n = Heap_FetchAddress(fld); __GET(fld, n, address);
if (n != 0) { if (n != 0) {
tagbits = Heap_FetchAddress(n - 4); __GET(n - 4, tagbits, address);
if (!__ODD(tagbits)) { if (!__ODD(tagbits)) {
__PUT(n - 4, tagbits + 1, address); __PUT(n - 4, tagbits + 1, address);
__PUT(q - 4, tag + 1, address); __PUT(q - 4, tag + 1, address);
@ -415,9 +405,9 @@ static void Heap_Scan (void)
chnk = Heap_heap; chnk = Heap_heap;
while (chnk != 0) { while (chnk != 0) {
adr = chnk + 12; adr = chnk + 12;
end = Heap_FetchAddress(chnk + 4); __GET(chnk + 4, end, address);
while (adr < end) { while (adr < end) {
tag = Heap_FetchAddress(adr); __GET(adr, tag, address);
if (__ODD(tag)) { if (__ODD(tag)) {
if (freesize > 0) { if (freesize > 0) {
start = adr - freesize; start = adr - freesize;
@ -436,11 +426,11 @@ static void Heap_Scan (void)
} }
tag -= 1; tag -= 1;
__PUT(adr, tag, address); __PUT(adr, tag, address);
size = Heap_FetchAddress(tag); __GET(tag, size, address);
Heap_allocated += size; Heap_allocated += size;
adr += size; adr += size;
} else { } else {
size = Heap_FetchAddress(tag); __GET(tag, size, address);
freesize += size; freesize += size;
adr += size; adr += size;
} }
@ -460,7 +450,7 @@ static void Heap_Scan (void)
Heap_bigBlocks = start; Heap_bigBlocks = start;
} }
} }
chnk = Heap_FetchAddress(chnk); __GET(chnk, chnk, address);
} }
} }
@ -509,17 +499,17 @@ static void Heap_MarkCandidates (address n, address *cand, LONGINT cand__len)
lim = cand[n - 1]; lim = cand[n - 1];
while ((chnk != 0 && chnk < lim)) { while ((chnk != 0 && chnk < lim)) {
adr = chnk + 12; adr = chnk + 12;
lim1 = Heap_FetchAddress(chnk + 4); __GET(chnk + 4, lim1, address);
if (lim < lim1) { if (lim < lim1) {
lim1 = lim; lim1 = lim;
} }
while (adr < lim1) { while (adr < lim1) {
tag = Heap_FetchAddress(adr); __GET(adr, tag, address);
if (__ODD(tag)) { if (__ODD(tag)) {
size = Heap_FetchAddress(tag - 1); __GET(tag - 1, size, address);
adr += size; adr += size;
} else { } else {
size = Heap_FetchAddress(tag); __GET(tag, size, address);
ptr = adr + 4; ptr = adr + 4;
while (cand[i] < ptr) { while (cand[i] < ptr) {
i += 1; i += 1;
@ -534,7 +524,7 @@ static void Heap_MarkCandidates (address n, address *cand, LONGINT cand__len)
adr = next; adr = next;
} }
} }
chnk = Heap_FetchAddress(chnk); __GET(chnk, chnk, address);
} }
} }
@ -544,7 +534,7 @@ static void Heap_CheckFin (void)
address tag; address tag;
n = Heap_fin; n = Heap_fin;
while (n != NIL) { while (n != NIL) {
tag = Heap_FetchAddress(n->obj - 4); __GET(n->obj - 4, tag, address);
if (!__ODD(tag)) { if (!__ODD(tag)) {
n->marked = 0; n->marked = 0;
Heap_Mark(n->obj); Heap_Mark(n->obj);
@ -723,7 +713,7 @@ void Heap_RegisterFinalizer (SYSTEM_PTR obj, Heap_Finalizer finalize)
void Heap_InitHeap (void) void Heap_InitHeap (void)
{ {
Heap_heap = Heap_NewChunk(128000); Heap_heap = Heap_NewChunk(128000);
Heap_heapend = Heap_FetchAddress(Heap_heap + 4); __GET(Heap_heap + 4, Heap_heapend, address);
__PUT(Heap_heap, 0, address); __PUT(Heap_heap, 0, address);
Heap_allocated = 0; Heap_allocated = 0;
Heap_firstTry = 1; Heap_firstTry = 1;

View file

@ -82,7 +82,6 @@ export LONGINT *Heap__1__typ;
static void Heap_CheckFin (void); static void Heap_CheckFin (void);
static void Heap_ExtendHeap (address blksz); static void Heap_ExtendHeap (address blksz);
export void Heap_FINALL (void); export void Heap_FINALL (void);
static address Heap_FetchAddress (address pointer);
static void Heap_Finalize (void); static void Heap_Finalize (void);
export void Heap_GC (BOOLEAN markStack); export void Heap_GC (BOOLEAN markStack);
static void Heap_HeapSort (address n, address *a, LONGINT a__len); static void Heap_HeapSort (address n, address *a, LONGINT a__len);
@ -188,15 +187,6 @@ static address Heap_NewChunk (address blksz)
return _o_result; return _o_result;
} }
static address Heap_FetchAddress (address pointer)
{
address _o_result;
address r;
__GET(pointer, r, address);
_o_result = r;
return _o_result;
}
static void Heap_ExtendHeap (address blksz) static void Heap_ExtendHeap (address blksz)
{ {
address size, chnk, j, next; address size, chnk, j, next;
@ -212,16 +202,16 @@ static void Heap_ExtendHeap (address blksz)
Heap_heap = chnk; Heap_heap = chnk;
} else { } else {
j = Heap_heap; j = Heap_heap;
next = Heap_FetchAddress(j); __GET(j, next, address);
while ((next != 0 && chnk > next)) { while ((next != 0 && chnk > next)) {
j = next; j = next;
next = Heap_FetchAddress(j); __GET(j, next, address);
} }
__PUT(chnk, next, address); __PUT(chnk, next, address);
__PUT(j, chnk, address); __PUT(j, chnk, address);
} }
if (next == 0) { if (next == 0) {
Heap_heapend = Heap_FetchAddress(chnk + 8); __GET(chnk + 8, Heap_heapend, address);
} }
} }
} }
@ -232,7 +222,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
address i, i0, di, blksz, restsize, t, adr, end, next, prev; address i, i0, di, blksz, restsize, t, adr, end, next, prev;
SYSTEM_PTR new; SYSTEM_PTR new;
Heap_Lock(); Heap_Lock();
blksz = Heap_FetchAddress(tag); __GET(tag, blksz, address);
i0 = __ASHR(blksz, 5); i0 = __ASHR(blksz, 5);
i = i0; i = i0;
if (i < 9) { if (i < 9) {
@ -243,7 +233,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
} }
} }
if (i < 9) { if (i < 9) {
next = Heap_FetchAddress(adr + 24); __GET(adr + 24, next, address);
Heap_freeList[i] = next; Heap_freeList[i] = next;
if (i != i0) { if (i != i0) {
di = i - i0; di = i - i0;
@ -284,12 +274,12 @@ SYSTEM_PTR Heap_NEWREC (address tag)
return _o_result; return _o_result;
} }
} }
t = Heap_FetchAddress(adr + 8); __GET(adr + 8, t, address);
if (t >= blksz) { if (t >= blksz) {
break; break;
} }
prev = adr; prev = adr;
adr = Heap_FetchAddress(adr + 24); __GET(adr + 24, adr, address);
} }
restsize = t - blksz; restsize = t - blksz;
end = adr + restsize; end = adr + restsize;
@ -299,7 +289,7 @@ SYSTEM_PTR Heap_NEWREC (address tag)
if (restsize > 288) { if (restsize > 288) {
__PUT(adr + 8, restsize, address); __PUT(adr + 8, restsize, address);
} else { } else {
next = Heap_FetchAddress(adr + 24); __GET(adr + 24, next, address);
if (prev == 0) { if (prev == 0) {
Heap_bigBlocks = next; Heap_bigBlocks = next;
} else { } else {
@ -355,7 +345,7 @@ static void Heap_Mark (address q)
{ {
address p, tag, offset, fld, n, tagbits; address p, tag, offset, fld, n, tagbits;
if (q != 0) { if (q != 0) {
tagbits = Heap_FetchAddress(q - 8); __GET(q - 8, tagbits, address);
if (!__ODD(tagbits)) { if (!__ODD(tagbits)) {
__PUT(q - 8, tagbits + 1, address); __PUT(q - 8, tagbits + 1, address);
p = 0; p = 0;
@ -369,17 +359,17 @@ static void Heap_Mark (address q)
} }
n = q; n = q;
q = p; q = p;
tag = Heap_FetchAddress(q - 8); __GET(q - 8, tag, address);
tag -= 1; tag -= 1;
__GET(tag, offset, address); __GET(tag, offset, address);
fld = q + offset; fld = q + offset;
p = Heap_FetchAddress(fld); __GET(fld, p, address);
__PUT(fld, (SYSTEM_PTR)(address)n, SYSTEM_PTR); __PUT(fld, (SYSTEM_PTR)(address)n, SYSTEM_PTR);
} else { } else {
fld = q + offset; fld = q + offset;
n = Heap_FetchAddress(fld); __GET(fld, n, address);
if (n != 0) { if (n != 0) {
tagbits = Heap_FetchAddress(n - 8); __GET(n - 8, tagbits, address);
if (!__ODD(tagbits)) { if (!__ODD(tagbits)) {
__PUT(n - 8, tagbits + 1, address); __PUT(n - 8, tagbits + 1, address);
__PUT(q - 8, tag + 1, address); __PUT(q - 8, tag + 1, address);
@ -415,9 +405,9 @@ static void Heap_Scan (void)
chnk = Heap_heap; chnk = Heap_heap;
while (chnk != 0) { while (chnk != 0) {
adr = chnk + 24; adr = chnk + 24;
end = Heap_FetchAddress(chnk + 8); __GET(chnk + 8, end, address);
while (adr < end) { while (adr < end) {
tag = Heap_FetchAddress(adr); __GET(adr, tag, address);
if (__ODD(tag)) { if (__ODD(tag)) {
if (freesize > 0) { if (freesize > 0) {
start = adr - freesize; start = adr - freesize;
@ -436,11 +426,11 @@ static void Heap_Scan (void)
} }
tag -= 1; tag -= 1;
__PUT(adr, tag, address); __PUT(adr, tag, address);
size = Heap_FetchAddress(tag); __GET(tag, size, address);
Heap_allocated += size; Heap_allocated += size;
adr += size; adr += size;
} else { } else {
size = Heap_FetchAddress(tag); __GET(tag, size, address);
freesize += size; freesize += size;
adr += size; adr += size;
} }
@ -460,7 +450,7 @@ static void Heap_Scan (void)
Heap_bigBlocks = start; Heap_bigBlocks = start;
} }
} }
chnk = Heap_FetchAddress(chnk); __GET(chnk, chnk, address);
} }
} }
@ -509,17 +499,17 @@ static void Heap_MarkCandidates (address n, address *cand, LONGINT cand__len)
lim = cand[n - 1]; lim = cand[n - 1];
while ((chnk != 0 && chnk < lim)) { while ((chnk != 0 && chnk < lim)) {
adr = chnk + 24; adr = chnk + 24;
lim1 = Heap_FetchAddress(chnk + 8); __GET(chnk + 8, lim1, address);
if (lim < lim1) { if (lim < lim1) {
lim1 = lim; lim1 = lim;
} }
while (adr < lim1) { while (adr < lim1) {
tag = Heap_FetchAddress(adr); __GET(adr, tag, address);
if (__ODD(tag)) { if (__ODD(tag)) {
size = Heap_FetchAddress(tag - 1); __GET(tag - 1, size, address);
adr += size; adr += size;
} else { } else {
size = Heap_FetchAddress(tag); __GET(tag, size, address);
ptr = adr + 8; ptr = adr + 8;
while (cand[i] < ptr) { while (cand[i] < ptr) {
i += 1; i += 1;
@ -534,7 +524,7 @@ static void Heap_MarkCandidates (address n, address *cand, LONGINT cand__len)
adr = next; adr = next;
} }
} }
chnk = Heap_FetchAddress(chnk); __GET(chnk, chnk, address);
} }
} }
@ -544,7 +534,7 @@ static void Heap_CheckFin (void)
address tag; address tag;
n = Heap_fin; n = Heap_fin;
while (n != NIL) { while (n != NIL) {
tag = Heap_FetchAddress(n->obj - 8); __GET(n->obj - 8, tag, address);
if (!__ODD(tag)) { if (!__ODD(tag)) {
n->marked = 0; n->marked = 0;
Heap_Mark(n->obj); Heap_Mark(n->obj);
@ -723,7 +713,7 @@ void Heap_RegisterFinalizer (SYSTEM_PTR obj, Heap_Finalizer finalize)
void Heap_InitHeap (void) void Heap_InitHeap (void)
{ {
Heap_heap = Heap_NewChunk(256000); Heap_heap = Heap_NewChunk(256000);
Heap_heapend = Heap_FetchAddress(Heap_heap + 8); __GET(Heap_heap + 8, Heap_heapend, address);
__PUT(Heap_heap, 0, address); __PUT(Heap_heap, 0, address);
Heap_allocated = 0; Heap_allocated = 0;
Heap_firstTry = 1; Heap_firstTry = 1;

View file

@ -183,12 +183,6 @@ MODULE Heap;
RETURN chnk RETURN chnk
END NewChunk; END NewChunk;
(*
PROCEDURE -FetchAddress(pointer: Address): Address "(address)(*((void**)((address)pointer)))";
*)
PROCEDURE FetchAddress(pointer: Address): Address; VAR r: Address; BEGIN SYSTEM.GET(pointer, r); RETURN r END FetchAddress;
PROCEDURE ExtendHeap(blksz: Address); PROCEDURE ExtendHeap(blksz: Address);
VAR size, chnk, j, next: Address; VAR size, chnk, j, next: Address;
BEGIN BEGIN
@ -201,14 +195,14 @@ MODULE Heap;
IF chnk < heap THEN IF chnk < heap THEN
SYSTEM.PUT(chnk, heap); heap := chnk SYSTEM.PUT(chnk, heap); heap := chnk
ELSE ELSE
j := heap; next := FetchAddress(j); j := heap; SYSTEM.GET(j, next);
WHILE (next # 0) & (chnk > next) DO WHILE (next # 0) & (chnk > next) DO
j := next; j := next;
next := FetchAddress(j) SYSTEM.GET(j, next)
END; END;
SYSTEM.PUT(chnk, next); SYSTEM.PUT(j, chnk) SYSTEM.PUT(chnk, next); SYSTEM.PUT(j, chnk)
END ; END ;
IF next = 0 THEN heapend := FetchAddress(chnk+endOff) END IF next = 0 THEN SYSTEM.GET(chnk+endOff, heapend) END
END END
END ExtendHeap; END ExtendHeap;
@ -220,7 +214,7 @@ MODULE Heap;
new: SYSTEM.PTR; new: SYSTEM.PTR;
BEGIN BEGIN
Lock(); Lock();
blksz := FetchAddress(tag); SYSTEM.GET(tag, blksz);
ASSERT((Unit = 16) OR (Unit = 32)); ASSERT((Unit = 16) OR (Unit = 32));
ASSERT(SIZE(SYSTEM.PTR) = SIZE(Address)); ASSERT(SIZE(SYSTEM.PTR) = SIZE(Address));
@ -231,7 +225,7 @@ MODULE Heap;
WHILE adr = 0 DO INC(i); adr := freeList[i] END WHILE adr = 0 DO INC(i); adr := freeList[i] END
END ; END ;
IF i < nofLists THEN (* unlink *) IF i < nofLists THEN (* unlink *)
next := FetchAddress(adr + nextOff); SYSTEM.GET(adr + nextOff, next);
freeList[i] := next; freeList[i] := next;
IF i # i0 THEN (* split *) IF i # i0 THEN (* split *)
di := i - i0; restsize := di * Unit; end := adr + restsize; di := i - i0; restsize := di * Unit; end := adr + restsize;
@ -265,9 +259,9 @@ MODULE Heap;
Unlock(); RETURN NIL Unlock(); RETURN NIL
END END
END ; END ;
t := FetchAddress(adr+sizeOff); SYSTEM.GET(adr+sizeOff, t);
IF t >= blksz THEN EXIT END ; IF t >= blksz THEN EXIT END ;
prev := adr; adr := FetchAddress(adr + nextOff) prev := adr; SYSTEM.GET(adr + nextOff, adr)
END ; END ;
restsize := t - blksz; end := adr + restsize; restsize := t - blksz; end := adr + restsize;
SYSTEM.PUT(end + sizeOff, blksz); SYSTEM.PUT(end + sizeOff, blksz);
@ -276,7 +270,7 @@ MODULE Heap;
IF restsize > nofLists * Unit THEN (*resize*) IF restsize > nofLists * Unit THEN (*resize*)
SYSTEM.PUT(adr + sizeOff, restsize) SYSTEM.PUT(adr + sizeOff, restsize)
ELSE (*unlink*) ELSE (*unlink*)
next := FetchAddress(adr + nextOff); SYSTEM.GET(adr + nextOff, next);
IF prev = 0 THEN bigBlocks := next IF prev = 0 THEN bigBlocks := next
ELSE SYSTEM.PUT(prev + nextOff, next); ELSE SYSTEM.PUT(prev + nextOff, next);
END ; END ;
@ -325,7 +319,7 @@ MODULE Heap;
VAR p, tag, offset, fld, n, tagbits: Address; VAR p, tag, offset, fld, n, tagbits: Address;
BEGIN BEGIN
IF q # 0 THEN IF q # 0 THEN
tagbits := FetchAddress(q - SZA); (* Load the tag for the record at q *) SYSTEM.GET(q - SZA, tagbits); (* Load the tag for the record at q *)
IF ~ODD(tagbits) THEN (* If it has not already been marked *) IF ~ODD(tagbits) THEN (* If it has not already been marked *)
SYSTEM.PUT(q - SZA, tagbits + 1); (* Mark it *) SYSTEM.PUT(q - SZA, tagbits + 1); (* Mark it *)
p := 0; p := 0;
@ -336,14 +330,14 @@ MODULE Heap;
SYSTEM.PUT(q - SZA, tag + offset + 1); (* Rotate base ptr into tag *) SYSTEM.PUT(q - SZA, tag + offset + 1); (* Rotate base ptr into tag *)
IF p = 0 THEN EXIT END ; IF p = 0 THEN EXIT END ;
n := q; q := p; n := q; q := p;
tag := FetchAddress(q - SZA); DEC(tag, 1); SYSTEM.GET(q - SZA, tag); DEC(tag, 1);
SYSTEM.GET(tag, offset); fld := q + offset; SYSTEM.GET(tag, offset); fld := q + offset;
p := FetchAddress(fld); SYSTEM.PUT(fld, SYSTEM.VAL(SYSTEM.PTR, n)) SYSTEM.GET(fld, p); SYSTEM.PUT(fld, SYSTEM.VAL(SYSTEM.PTR, n))
ELSE (* offset references a ptr field *) ELSE (* offset references a ptr field *)
fld := q + offset; (* Address the pointer *) fld := q + offset; (* Address the pointer *)
n := FetchAddress(fld); (* Load the pointer *) SYSTEM.GET(fld, n); (* Load the pointer *)
IF n # 0 THEN (* If pointer is not NIL *) IF n # 0 THEN (* If pointer is not NIL *)
tagbits := FetchAddress(n - SZA); (* Consider record pointed to by this field *) SYSTEM.GET(n - SZA, tagbits); (* Consider record pointed to by this field *)
IF ~ODD(tagbits) THEN IF ~ODD(tagbits) THEN
SYSTEM.PUT(n - SZA, tagbits + 1); SYSTEM.PUT(n - SZA, tagbits + 1);
SYSTEM.PUT(q - SZA, tag + 1); SYSTEM.PUT(q - SZA, tag + 1);
@ -371,9 +365,9 @@ MODULE Heap;
freesize := 0; allocated := 0; chnk := heap; freesize := 0; allocated := 0; chnk := heap;
WHILE chnk # 0 DO WHILE chnk # 0 DO
adr := chnk + blkOff; adr := chnk + blkOff;
end := FetchAddress(chnk + endOff); SYSTEM.GET(chnk + endOff, end);
WHILE adr < end DO WHILE adr < end DO
tag := FetchAddress(adr); SYSTEM.GET(adr, tag);
IF ODD(tag) THEN (*marked*) IF ODD(tag) THEN (*marked*)
IF freesize > 0 THEN IF freesize > 0 THEN
start := adr - freesize; start := adr - freesize;
@ -387,11 +381,11 @@ MODULE Heap;
END ; END ;
DEC(tag, 1); DEC(tag, 1);
SYSTEM.PUT(adr, tag); SYSTEM.PUT(adr, tag);
size := FetchAddress(tag); SYSTEM.GET(tag, size);
INC(allocated, size); INC(allocated, size);
INC(adr, size) INC(adr, size)
ELSE (*unmarked*) ELSE (*unmarked*)
size := FetchAddress(tag); SYSTEM.GET(tag, size);
INC(freesize, size); INC(freesize, size);
INC(adr, size) INC(adr, size)
END END
@ -406,7 +400,7 @@ MODULE Heap;
ELSE SYSTEM.PUT(start + nextOff, bigBlocks); bigBlocks := start ELSE SYSTEM.PUT(start + nextOff, bigBlocks); bigBlocks := start
END END
END ; END ;
chnk := FetchAddress(chnk) SYSTEM.GET(chnk, chnk)
END END
END Scan; END Scan;
@ -434,14 +428,14 @@ MODULE Heap;
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 ) & (chnk < lim) DO
adr := chnk + blkOff; adr := chnk + blkOff;
lim1 := FetchAddress(chnk + endOff); SYSTEM.GET(chnk + endOff, lim1);
IF lim < lim1 THEN lim1 := lim END ; IF lim < lim1 THEN lim1 := lim END ;
WHILE adr < lim1 DO WHILE adr < lim1 DO
tag := FetchAddress(adr); SYSTEM.GET(adr, tag);
IF ODD(tag) THEN (*already marked*) IF ODD(tag) THEN (*already marked*)
size := FetchAddress(tag-1); INC(adr, size) SYSTEM.GET(tag-1, size); INC(adr, size)
ELSE ELSE
size := FetchAddress(tag); SYSTEM.GET(tag, size);
ptr := adr + SZA; ptr := adr + SZA;
WHILE cand[i] < ptr DO INC(i) END ; WHILE cand[i] < ptr DO INC(i) END ;
IF i = n THEN RETURN END ; IF i = n THEN RETURN END ;
@ -450,7 +444,7 @@ MODULE Heap;
adr := next adr := next
END END
END ; END ;
chnk := FetchAddress(chnk) SYSTEM.GET(chnk, chnk)
END END
END MarkCandidates; END MarkCandidates;
@ -459,7 +453,7 @@ MODULE Heap;
BEGIN BEGIN
n := fin; n := fin;
WHILE n # NIL DO WHILE n # NIL DO
tag := FetchAddress(n.obj - SZA); SYSTEM.GET(n.obj - SZA, tag);
IF ~ODD(tag) THEN n.marked := FALSE; Mark(n.obj) IF ~ODD(tag) THEN n.marked := FALSE; Mark(n.obj)
ELSE n.marked := TRUE ELSE n.marked := TRUE
END ; END ;
@ -574,7 +568,7 @@ PROCEDURE -HeapModuleInit 'Heap__init()';
initialised, to enable NEW, SYSTEM.NEW *) initialised, to enable NEW, SYSTEM.NEW *)
BEGIN BEGIN
heap := NewChunk(heapSize0); heap := NewChunk(heapSize0);
heapend := FetchAddress(heap + endOff); SYSTEM.GET(heap + endOff, heapend);
SYSTEM.PUT(heap, AddressZero); SYSTEM.PUT(heap, AddressZero);
allocated := 0; firstTry := TRUE; freeList[nofLists] := 1; lockdepth := 0; allocated := 0; firstTry := TRUE; freeList[nofLists] := 1; lockdepth := 0;
FileCount := 0; modules := NIL; heapsize := 0; bigBlocks := 0; fin := NIL; FileCount := 0; modules := NIL; heapsize := 0; bigBlocks := 0; fin := NIL;

View file

@ -1 +1 @@
14 Sep 2016 13:00:54 14 Sep 2016 13:59:08