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