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