This commit is contained in:
Elias Bennour 2024-01-28 18:57:48 +01:00
parent 968965d430
commit 073f583830

72
njvm.c
View File

@ -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);
}