From 0f841f9c22485c50da2d7e7937adfa8721f48661 Mon Sep 17 00:00:00 2001 From: nilspolek Date: Sun, 28 Jan 2024 18:38:34 +0100 Subject: [PATCH] gc --- bigint/build/bin/testbip | Bin 72952 -> 72952 bytes bigint/build/lib/libbigint.a | Bin 27544 -> 27544 bytes bigint/src/libbigint.a | Bin 27544 -> 27544 bytes bigint/tst/testbip | Bin 72952 -> 72952 bytes njvm.c | 54 +++++++++++++++++++++-------------- njvm.o | Bin 61600 -> 62288 bytes 6 files changed, 32 insertions(+), 22 deletions(-) diff --git a/bigint/build/bin/testbip b/bigint/build/bin/testbip index c09a5761bf02c9425f1d12183718fffb3fb731d9..19b0ef961a789d3394e9914a4c4b482de5b421cf 100755 GIT binary patch delta 137 zcmV;40CxZQxdiyR1h8lX5NB@jo>fjUx4zojSFYmg^n-W=mv{sLNCMuFx55Mg-Ub5R zke8wh0saEskhh`?0TK=%y`YXp4bDu7&#C9!A3~~;_A`#VGKN?1R;+31z8%3*x6~Q| r-~k}N$%FC}Z%fqQZ6oK}(N>Cd(K5IWqVeR#tCvP#wMng8#tCvPhDH{q8#tCvP#wMng8#tCvPhDH{q8fjUx4zojSFYmg^n-W=mv{sLNCMuFx55Mg-Ub5R zke8wh0saEskhh`?0TK=%y`YXp4bDu7&#C9!A3~~;_A`#VGKN?1R;+31z8%3*x6~Q| r-~k}N$%FC}Z%fqQZ6oK}(N>Cd(K5IWqVeR> 24) { case HALT: if (debug == 1) printf("halt\n"); @@ -260,25 +260,25 @@ void execute(struct program program) { case GETF: if (debug == 1) printf("getf\n"); tempObj = pop(stack).u.objRef; - push(stack, stackSlotWithObjRef(getField(tempObj,SIGN_EXTEND(IMMEDIATE(program.program[i]))))); + push(stack, stackSlotWithObjRef(getField(tempObj, SIGN_EXTEND(IMMEDIATE(program.program[i]))))); break; case PUTF: if (debug == 1) printf("putf\t%i\n", SIGN_EXTEND(IMMEDIATE(program.program[i]))); tempObj = pop(stack).u.objRef; tempObj2 = pop(stack).u.objRef; - setField(tempObj2, SIGN_EXTEND(IMMEDIATE(program.program[i])),tempObj); + setField(tempObj2, SIGN_EXTEND(IMMEDIATE(program.program[i])), tempObj); break; case NEWA: - if(debug == 1) printf("newa\n"); + if (debug == 1) printf("newa\n"); bip.op1 = pop(stack).u.objRef; push(stack, stackSlotWithObjRef(newRecord(bigToInt()))); break; case GETFA: - if(debug == 1) printf("getfa\n"); + if (debug == 1) printf("getfa\n"); bip.op1 = pop(stack).u.objRef; tempInt = bigToInt(); tempObj = pop(stack).u.objRef; - push(stack, stackSlotWithObjRef(getField(tempObj,bigToInt()))); + push(stack, stackSlotWithObjRef(getField(tempObj, bigToInt()))); break; case PUTFA: if (debug == 1) printf("putfa\n"); @@ -286,12 +286,12 @@ void execute(struct program program) { tempObj2 = pop(stack).u.objRef; // Index bip.op1 = tempObj2; tempInt = bigToInt(); - setField(pop(stack).u.objRef, tempInt,tempObj); + setField(pop(stack).u.objRef, tempInt, tempObj); break; case GETSZ: if (debug == 1) printf("getsz\n"); tempObj = pop(stack).u.objRef; - if(IS_PRIMITIVE(tempObj)) bigFromInt(-1); + if (IS_PRIMITIVE(tempObj)) bigFromInt(-1); else bigFromInt(GET_ELEMENT_COUNT(tempObj)); push(stack, stackSlotWithObjRef(bip.res)); break; @@ -301,13 +301,13 @@ void execute(struct program program) { break; case REFEQ: if (debug == 1) printf("refeq\n"); - if(pop(stack).u.objRef == pop(stack).u.objRef) bigFromInt(true); + if (pop(stack).u.objRef == pop(stack).u.objRef) bigFromInt(true); else bigFromInt(false); push(stack, stackSlotWithObjRef(bip.res)); break; case REFNE: if (debug == 1) printf("refeq\n"); - if(pop(stack).u.objRef != pop(stack).u.objRef) bigFromInt(true); + if (pop(stack).u.objRef != pop(stack).u.objRef) bigFromInt(true); else bigFromInt(false); push(stack, stackSlotWithObjRef(bip.res)); break; @@ -419,43 +419,53 @@ void swap() { } void garbageCollector() { + char *memToPurgePtr = halfHeapPtr - ((heapSizeKiB * 1024) / 2); swap(); - //printf("%s\n", "stack"); - for (int i = 0; i < stack.current; i++) { + 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++) { + printf("%s\n", "globals"); + for (int i = 0; i < *sda.size; i++) { sda.sda[i] = relocate(sda.sda[i]); } - //printf("%s\n", "retVal"); +// printf("%s\n", "retVal"); //returnValue = relocate(returnValue); - //printf("%s\n", "op1"); + printf("%s\n", "op1"); bip.op1 = relocate(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); + b = bip.op2; - if(b!= NULL) + if (b != NULL) //printf("%d\n", GET_SIZE(b)); //printf("%s\n", "res"); bip.res = relocate(bip.res); b = bip.res; - if(b!= NULL) + + if (b != NULL) { //printf("%d\n", GET_SIZE(b)); - //printf("%s\n", "rem"); + printf("%s\n", "rem"); + bip.op1 = bip.rem; + bigPrint(stdout); bip.rem = relocate(bip.rem); + printf("%s\n", "rem"); + } + b = bip.rem; - if(b!= NULL) + printf("bip finished\n"); + if (b != NULL) //printf("%d\n", GET_SIZE(b)); @@ -575,4 +585,4 @@ int main(int argc, char *argv[]) { printf("Error: no code file specified\n"); return 1; } -} \ No newline at end of file +} diff --git a/njvm.o b/njvm.o index 52dfb786c47f93fd77aa20ff651172a6dd2c6d0e..05e75a10209d2d11b879457763d090693be7eb5f 100644 GIT binary patch delta 20715 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 MEiWHbK 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