Moving Heap.Mod to SYSTEM.UINTPTR. Only 64 bit working for now.

This commit is contained in:
David Brown 2016-09-03 11:56:17 +01:00
parent 11de6b8512
commit cdd8a26481
205 changed files with 656 additions and 650 deletions

View file

@ -1,4 +1,4 @@
/* voc 1.95 [2016/09/02] for gcc LP64 on cygwin tskSfF */
/* voc 1.95 [2016/09/03] for gcc LP64 on cygwin tskSfF */
#define LARGE
#include "SYSTEM.h"
@ -35,7 +35,7 @@ typedef
typedef
struct Heap_FinDesc {
Heap_FinNode next;
int64 obj;
uintptr obj;
BOOLEAN marked;
Heap_Finalizer finalize;
} Heap_FinDesc;
@ -61,10 +61,10 @@ typedef
export SYSTEM_PTR Heap_modules;
static int64 Heap_freeList[10];
static int64 Heap_bigBlocks;
export int64 Heap_allocated;
export uintptr Heap_allocated;
static BOOLEAN Heap_firstTry;
static int64 Heap_heap, Heap_heapend;
export int64 Heap_heapsize;
static uintptr Heap_heap, Heap_heapend;
export uintptr Heap_heapsize;
static Heap_FinNode Heap_fin;
static int32 Heap_lockdepth;
static BOOLEAN Heap_interrupted;
@ -88,12 +88,12 @@ static void Heap_Mark (int64 q);
static void Heap_MarkCandidates (int64 n, int64 *cand, LONGINT cand__len);
static void Heap_MarkP (SYSTEM_PTR p);
static void Heap_MarkStack (int64 n, int64 *cand, LONGINT cand__len);
export SYSTEM_PTR Heap_NEWBLK (int64 size);
export SYSTEM_PTR Heap_NEWREC (int64 tag);
static int64 Heap_NewChunk (int64 blksz);
export SYSTEM_PTR Heap_NEWBLK (uintptr size);
export SYSTEM_PTR Heap_NEWREC (uintptr tag);
static uintptr Heap_NewChunk (uintptr blksz);
export void Heap_REGCMD (Heap_Module m, Heap_CmdName name, Heap_Command cmd);
export SYSTEM_PTR Heap_REGMOD (Heap_ModuleName name, Heap_EnumProc enumPtrs);
export void Heap_REGTYP (Heap_Module m, int64 typ);
export void Heap_REGTYP (Heap_Module m, uintptr typ);
export void Heap_RegisterFinalizer (SYSTEM_PTR obj, Heap_Finalizer finalize);
static void Heap_Scan (void);
static void Heap_Sift (int64 l, int64 r, int64 *a, LONGINT a__len);
@ -102,7 +102,7 @@ export void Heap_Unlock (void);
extern void *Heap__init();
extern LONGINT Platform_MainStackFrame;
extern uintptr Platform_OSAllocate(uintptr size);
#define Heap_FetchAddress(pointer) (LONGINT)(SYSTEM_ADRINT)(*((void**)((SYSTEM_ADRINT)pointer)))
#define Heap_FetchAddress(pointer) (uintptr)(*((void**)((uintptr)pointer)))
#define Heap_HeapModuleInit() Heap__init()
#define Heap_OSAllocate(size) Platform_OSAllocate(size)
#define Heap_PlatformHalt(code) Platform_Halt(code)
@ -135,7 +135,7 @@ SYSTEM_PTR Heap_REGMOD (Heap_ModuleName name, Heap_EnumProc enumPtrs)
__COPY(name, m->name, 20);
m->refcnt = 0;
m->enumPtrs = enumPtrs;
m->next = (Heap_Module)(SYSTEM_ADRINT)Heap_modules;
m->next = (Heap_Module)(uintptr)Heap_modules;
Heap_modules = (SYSTEM_PTR)m;
_o_result = (void*)m;
return _o_result;
@ -155,7 +155,7 @@ void Heap_REGCMD (Heap_Module m, Heap_CmdName name, Heap_Command cmd)
m->cmds = c;
}
void Heap_REGTYP (Heap_Module m, int64 typ)
void Heap_REGTYP (Heap_Module m, uintptr typ)
{
__PUT(typ, m->types, int64);
m->types = typ;
@ -166,15 +166,15 @@ void Heap_INCREF (Heap_Module m)
m->refcnt += 1;
}
static int64 Heap_NewChunk (int64 blksz)
static uintptr Heap_NewChunk (uintptr blksz)
{
int64 _o_result;
int64 chnk;
uintptr _o_result;
uintptr chnk;
chnk = Heap_OSAllocate(blksz + 24);
if (chnk != 0) {
__PUT(chnk + 8, chnk + (24 + blksz), int64);
__PUT(chnk + 24, chnk + 32, int64);
__PUT(chnk + 32, blksz, int64);
__PUT(chnk + 8, chnk + (24 + blksz), uintptr);
__PUT(chnk + 24, chnk + 32, uintptr);
__PUT(chnk + 32, blksz, uintptr);
__PUT(chnk + 40, -8, int64);
__PUT(chnk + 48, Heap_bigBlocks, int64);
Heap_bigBlocks = chnk + 24;
@ -195,7 +195,7 @@ static void Heap_ExtendHeap (int64 blksz)
chnk = Heap_NewChunk(size);
if (chnk != 0) {
if (chnk < Heap_heap) {
__PUT(chnk, Heap_heap, int64);
__PUT(chnk, Heap_heap, uintptr);
Heap_heap = chnk;
} else {
j = Heap_heap;
@ -213,10 +213,10 @@ static void Heap_ExtendHeap (int64 blksz)
}
}
SYSTEM_PTR Heap_NEWREC (int64 tag)
SYSTEM_PTR Heap_NEWREC (uintptr tag)
{
SYSTEM_PTR _o_result;
int64 i, i0, di, blksz, restsize, t, adr, end, next, prev;
uintptr i, i0, di, blksz, restsize, t, adr, end, next, prev;
SYSTEM_PTR new;
Heap_Lock();
blksz = Heap_FetchAddress(tag);
@ -236,10 +236,10 @@ SYSTEM_PTR Heap_NEWREC (int64 tag)
di = i - i0;
restsize = __ASHL(di, 5);
end = adr + restsize;
__PUT(end + 8, blksz, int64);
__PUT(end + 8, blksz, uintptr);
__PUT(end + 16, -8, int64);
__PUT(end, end + 8, int64);
__PUT(adr + 8, restsize, int64);
__PUT(adr + 8, restsize, uintptr);
__PUT(adr + 24, Heap_freeList[di], int64);
Heap_freeList[di] = adr;
adr += restsize;
@ -280,21 +280,21 @@ SYSTEM_PTR Heap_NEWREC (int64 tag)
}
restsize = t - blksz;
end = adr + restsize;
__PUT(end + 8, blksz, int64);
__PUT(end + 8, blksz, uintptr);
__PUT(end + 16, -8, int64);
__PUT(end, end + 8, int64);
if (restsize > 288) {
__PUT(adr + 8, restsize, int64);
__PUT(adr + 8, restsize, uintptr);
} else {
next = Heap_FetchAddress(adr + 24);
if (prev == 0) {
Heap_bigBlocks = next;
} else {
__PUT(prev + 24, next, int64);
__PUT(prev + 24, next, uintptr);
}
if (restsize > 0) {
di = __ASHR(restsize, 5);
__PUT(adr + 8, restsize, int64);
__PUT(adr + 8, restsize, uintptr);
__PUT(adr + 24, Heap_freeList[di], int64);
Heap_freeList[di] = adr;
}
@ -311,28 +311,28 @@ SYSTEM_PTR Heap_NEWREC (int64 tag)
i += 32;
}
__PUT(adr + 24, 0, int64);
__PUT(adr, tag, int64);
__PUT(adr, tag, uintptr);
__PUT(adr + 8, 0, int64);
__PUT(adr + 16, 0, int64);
Heap_allocated += blksz;
Heap_Unlock();
_o_result = (SYSTEM_PTR)(SYSTEM_ADRINT)(adr + 8);
_o_result = (SYSTEM_PTR)(uintptr)(adr + 8);
return _o_result;
}
SYSTEM_PTR Heap_NEWBLK (int64 size)
SYSTEM_PTR Heap_NEWBLK (uintptr size)
{
SYSTEM_PTR _o_result;
int64 blksz, tag;
uintptr blksz, tag;
SYSTEM_PTR new;
Heap_Lock();
blksz = __ASHL(__ASHR(size + 63, 5), 5);
new = Heap_NEWREC((SYSTEM_ADRINT)&blksz);
tag = ((int64)(SYSTEM_ADRINT)new + blksz) - 24;
new = Heap_NEWREC((uintptr)&blksz);
tag = (((int64)(uintptr)new) + blksz) - 24;
__PUT(tag - 8, 0, int64);
__PUT(tag, blksz, int64);
__PUT(tag, blksz, uintptr);
__PUT(tag + 8, -8, int64);
__PUT((int64)(SYSTEM_ADRINT)new - 8, tag, int64);
__PUT((int64)(uintptr)new - 8, tag, uintptr);
Heap_Unlock();
_o_result = new;
return _o_result;
@ -361,7 +361,7 @@ static void Heap_Mark (int64 q)
__GET(tag, offset, int64);
fld = q + offset;
p = Heap_FetchAddress(fld);
__PUT(fld, (SYSTEM_PTR)(SYSTEM_ADRINT)n, SYSTEM_PTR);
__PUT(fld, (SYSTEM_PTR)(uintptr)n, SYSTEM_PTR);
} else {
fld = q + offset;
n = Heap_FetchAddress(fld);
@ -370,7 +370,7 @@ static void Heap_Mark (int64 q)
if (!__ODD(tagbits)) {
__PUT(n - 8, tagbits + 1, int64);
__PUT(q - 8, tag + 1, int64);
__PUT(fld, (SYSTEM_PTR)(SYSTEM_ADRINT)p, SYSTEM_PTR);
__PUT(fld, (SYSTEM_PTR)(uintptr)p, SYSTEM_PTR);
p = q;
q = n;
tag = tagbits;
@ -385,12 +385,12 @@ static void Heap_Mark (int64 q)
static void Heap_MarkP (SYSTEM_PTR p)
{
Heap_Mark((int64)(SYSTEM_ADRINT)p);
Heap_Mark((int64)(uintptr)p);
}
static void Heap_Scan (void)
{
int64 chnk, adr, end, start, tag, i, size, freesize;
uintptr chnk, adr, end, start, tag, i, size, freesize;
Heap_bigBlocks = 0;
i = 1;
while (i < 9) {
@ -408,8 +408,8 @@ static void Heap_Scan (void)
if (__ODD(tag)) {
if (freesize > 0) {
start = adr - freesize;
__PUT(start, start + 8, int64);
__PUT(start + 8, freesize, int64);
__PUT(start, start + 8, uintptr);
__PUT(start + 8, freesize, uintptr);
__PUT(start + 16, -8, int64);
i = __ASHR(freesize, 5);
freesize = 0;
@ -422,7 +422,7 @@ static void Heap_Scan (void)
}
}
tag -= 1;
__PUT(adr, tag, int64);
__PUT(adr, tag, uintptr);
size = Heap_FetchAddress(tag);
Heap_allocated += size;
adr += size;
@ -434,8 +434,8 @@ static void Heap_Scan (void)
}
if (freesize > 0) {
start = adr - freesize;
__PUT(start, start + 8, int64);
__PUT(start + 8, freesize, int64);
__PUT(start, start + 8, uintptr);
__PUT(start + 8, freesize, uintptr);
__PUT(start + 16, -8, int64);
i = __ASHR(freesize, 5);
freesize = 0;
@ -554,7 +554,7 @@ static void Heap_Finalize (void)
} else {
prev->next = n->next;
}
(*n->finalize)((SYSTEM_PTR)(SYSTEM_ADRINT)n->obj);
(*n->finalize)((SYSTEM_PTR)(uintptr)n->obj);
if (prev == NIL) {
n = Heap_fin;
} else {
@ -573,7 +573,7 @@ void Heap_FINALL (void)
while (Heap_fin != NIL) {
n = Heap_fin;
Heap_fin = Heap_fin->next;
(*n->finalize)((SYSTEM_PTR)(SYSTEM_ADRINT)n->obj);
(*n->finalize)((SYSTEM_PTR)(uintptr)n->obj);
}
}
@ -590,9 +590,9 @@ static void Heap_MarkStack (int64 n, int64 *cand, LONGINT cand__len)
}
if (n == 0) {
nofcand = 0;
sp = (SYSTEM_ADRINT)&frame;
sp = (uintptr)&frame;
stack0 = Heap_PlatformMainStackFrame();
inc = (SYSTEM_ADRINT)&align.p - (SYSTEM_ADRINT)&align;
inc = (uintptr)&align.p - (uintptr)&align;
if (sp > stack0) {
inc = -inc;
}
@ -623,7 +623,7 @@ void Heap_GC (BOOLEAN markStack)
int64 cand[10000];
if (Heap_lockdepth == 0 || (Heap_lockdepth == 1 && !markStack)) {
Heap_Lock();
m = (Heap_Module)(SYSTEM_ADRINT)Heap_modules;
m = (Heap_Module)(uintptr)Heap_modules;
while (m != NIL) {
if (m->enumPtrs != NIL) {
(*m->enumPtrs)(Heap_MarkP);
@ -700,7 +700,7 @@ void Heap_RegisterFinalizer (SYSTEM_PTR obj, Heap_Finalizer finalize)
{
Heap_FinNode f;
__NEW(f, Heap_FinDesc);
f->obj = (int64)(SYSTEM_ADRINT)obj;
f->obj = (int64)(uintptr)obj;
f->finalize = finalize;
f->marked = 1;
f->next = Heap_fin;