cleanup
This commit is contained in:
parent
968965d430
commit
073f583830
72
njvm.c
72
njvm.c
@ -326,18 +326,17 @@ void tests(void) {
|
||||
|
||||
ObjRef *heap;
|
||||
int heapSizeKiB;
|
||||
char *memTargetPtr; //zielspeicherzeiger
|
||||
char *freeHeapPtr; //freizeiger
|
||||
char *halfHeapPtr; //halbspeicherende
|
||||
char *memTargetPtr;
|
||||
char *freeHeapPtr;
|
||||
char *halfHeapPtr;
|
||||
int gcCount = 0;
|
||||
|
||||
#define MSB (1 << (8 * sizeof(unsigned int) - 1))
|
||||
#define IS_PRIMITIVE(objRef) (((objRef)->size & MSB) == 0)
|
||||
#define GET_SIZE(objRef)((objRef)->size& ~MSB) //Gets the size of an ObjRef
|
||||
#define GET_REFS(objRef)((ObjRef *)((objRef)->data)) //Pointer on first ObjRef in Object
|
||||
#define GET_SIZE(objRef)((objRef)->size& ~MSB)
|
||||
#define GET_REFS(objRef)((ObjRef *)((objRef)->data))
|
||||
|
||||
ObjRef copyObjectToFreeMem(ObjRef orig) {
|
||||
//printf("%s%d\n", "Size in CpyObj: ", GET_SIZE(orig) );
|
||||
int size;
|
||||
if (IS_PRIMITIVE(orig)) {
|
||||
size = GET_SIZE(orig);
|
||||
@ -346,32 +345,18 @@ ObjRef copyObjectToFreeMem(ObjRef orig) {
|
||||
}
|
||||
memcpy(freeHeapPtr, orig, size);
|
||||
ObjRef oldPtr = (ObjRef) freeHeapPtr;
|
||||
//printf("%s%d\n","size after memcpy ", GET_SIZE(oldPtr));
|
||||
//printf("%s%d\n","actual Size: ", size);
|
||||
//oldPtr->size = size;
|
||||
freeHeapPtr += size;
|
||||
return oldPtr;
|
||||
}
|
||||
|
||||
ObjRef relocate(ObjRef orig) {
|
||||
/* if (orig == NULL) {
|
||||
printf("%s\n", "null");
|
||||
} else {
|
||||
printf("%s%d\n","Size in relocate ", GET_SIZE(orig));
|
||||
}
|
||||
*/
|
||||
ObjRef copy;
|
||||
if (orig == NULL) {
|
||||
/* relocate(nil) = nil */
|
||||
copy = NULL;
|
||||
} else {
|
||||
if (orig->brokenHeart == 1) {
|
||||
/* Objekt ist bereits kopiert */
|
||||
copy = orig->forwardPointer;
|
||||
//copy->size =orig->size;
|
||||
//printf("%s\n", "already copied");
|
||||
} else {
|
||||
/* Objekt muss noch kopiert werden*/
|
||||
copy = copyObjectToFreeMem(orig);
|
||||
orig->brokenHeart = true;
|
||||
orig->forwardPointer = copy;
|
||||
@ -385,32 +370,25 @@ ObjRef relocate(ObjRef orig) {
|
||||
void scan(void) {
|
||||
char *scanPtr = memTargetPtr;
|
||||
while (scanPtr < freeHeapPtr) {
|
||||
/* es gibt noch Objekte, die
|
||||
* gescannt werden müssen.
|
||||
*/ ObjRef scanOr = (ObjRef) scanPtr;
|
||||
// printf("%d\n", GET_SIZE(scanOr));
|
||||
ObjRef scanOr = (ObjRef) scanPtr;
|
||||
|
||||
if (!IS_PRIMITIVE(scanOr)) {
|
||||
/* Ist ein Verbundobjekt */
|
||||
for (int i = 0; i < GET_SIZE(scanOr); i++) {
|
||||
GET_REFS(scanOr)[i] = relocate(GET_REFS(scanOr)[i]);
|
||||
}
|
||||
scanPtr += sizeof(bool) + (GET_SIZE(scanOr) * sizeof(ObjRef *)) + sizeof(unsigned int) + sizeof(void *);
|
||||
} else {
|
||||
//printf("%s %d\n", "is primitive, size: ", GET_SIZE(scanOr));
|
||||
scanPtr += GET_SIZE(scanOr);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void swap() {
|
||||
if (memTargetPtr == (char *) heap) {
|
||||
//printf("%s\n", "swapped to second half");
|
||||
freeHeapPtr = halfHeapPtr;
|
||||
memTargetPtr = halfHeapPtr;
|
||||
halfHeapPtr = ((char *) heap) + (heapSizeKiB * 1024);
|
||||
} else {
|
||||
//printf("%s\n", "swapped to first half");
|
||||
freeHeapPtr = ((char *) heap);
|
||||
memTargetPtr = ((char *) heap);
|
||||
halfHeapPtr = ((char *) heap) + ((heapSizeKiB * 1024) / 2);
|
||||
@ -418,57 +396,33 @@ void swap() {
|
||||
}
|
||||
|
||||
void garbageCollector() {
|
||||
|
||||
char *memToPurgePtr = halfHeapPtr - ((heapSizeKiB * 1024) / 2);
|
||||
swap();
|
||||
// printf("%s\n", "stack");
|
||||
|
||||
for (int i = 0; i < *stack.current; i++) {
|
||||
if (stack.stack[i].isObjRef) {
|
||||
stack.stack[i].u.objRef = relocate(stack.stack[i].u.objRef);
|
||||
}
|
||||
}
|
||||
// printf("%s\n", "globals");
|
||||
|
||||
for (int i = 0; i < *sda.size; i++) {
|
||||
sda.sda[i] = relocate(sda.sda[i]);
|
||||
}
|
||||
// printf("%s\n", "retVal");
|
||||
//returnValue = relocate(returnValue);
|
||||
|
||||
// printf("%s\n", "op1");
|
||||
// bip.op1 = relocate(bip.op1);
|
||||
// ObjRef b = bip.op1;
|
||||
//
|
||||
// if (b != NULL)
|
||||
// //printf("%d\n", GET_SIZE(b));
|
||||
//
|
||||
// //printf("%s\n", "op2");
|
||||
// bip.op2 = relocate(bip.op2);
|
||||
//
|
||||
// b = bip.op2;
|
||||
// if (b != NULL)
|
||||
// //printf("%d\n", GET_SIZE(b));
|
||||
//
|
||||
// //printf("%s\n", "res");
|
||||
// bip.res = relocate(bip.res);
|
||||
// b = bip.res;
|
||||
//
|
||||
// if (b != NULL) {
|
||||
// //printf("%d\n", GET_SIZE(b));
|
||||
//
|
||||
// printf("%s\n", "rem");
|
||||
// bip.op1 = bip.rem;
|
||||
// bigPrint(stdout);
|
||||
// bip.rem = relocate(bip.rem);
|
||||
// printf("%s\n", "rem");
|
||||
// }
|
||||
//
|
||||
// b = bip.rem;
|
||||
// printf("bip finished\n");
|
||||
// if (b != NULL)
|
||||
//printf("%d\n", GET_SIZE(b));
|
||||
//
|
||||
//
|
||||
// bip.rem = relocate(bip.rem);
|
||||
// b = bip.rem;
|
||||
// if (b != NULL)
|
||||
// scan();
|
||||
|
||||
if (purgeFlag) {
|
||||
memset(memToPurgePtr, 0, heapSizeKiB * 1024 / 2);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user