diff --git a/makefile b/makefile index 1d812e2..d4869fb 100644 --- a/makefile +++ b/makefile @@ -27,9 +27,6 @@ repl: source .PHONY: tests tests: clean test-cases test-integrations -#.PHONY: test-all -#test-all: clean test-cases test-integrations - .PHONY: test-cases test-cases: $(MAKE) -C $(TOY_CASESDIR) -k @@ -62,6 +59,10 @@ test-cases-valgrind: test-integrations-valgrind: $(MAKE) -C $(TOY_INTEGRATIONSDIR) valgrind -k +#Run all tests +.PHONY: tests-all +tests-all: clean tests tests-gdb tests-valgrind + #TODO: mustfail tests #util targets diff --git a/scripts/a.toy b/scripts/a.toy index 4f6f3cc..b5fe55e 100644 --- a/scripts/a.toy +++ b/scripts/a.toy @@ -1,5 +1,5 @@ -//TODO: mustfails + var a = 0; var b = a = a + 1, 6; diff --git a/source/toy_string.c b/source/toy_string.c index c604320..9db205d 100644 --- a/source/toy_string.c +++ b/source/toy_string.c @@ -182,7 +182,7 @@ Toy_String* Toy_concatStrings(Toy_Bucket** bucketHandle, Toy_String* left, Toy_S ret->as.node.left = left; ret->as.node.right = right; - incrementRefCount(left);//URGENT: improve + incrementRefCount(left); incrementRefCount(right); return ret; @@ -253,12 +253,12 @@ static int deepCompareUtil(Toy_String* left, Toy_String* right, const char** lef } //BUGFIX: if we're not currently iterating through the left leaf (and leftHead is not null), skip out - if (left->type == TOY_STRING_LEAF && (*leftHead) != NULL && (**leftHead) != '\0' && ((*leftHead) < left->as.leaf.data || (*leftHead) > (left->as.leaf.data + strlen(left->as.leaf.data))) ) { //URGENT: replace strlen with the stored lengths + if (left->type == TOY_STRING_LEAF && (*leftHead) != NULL && (**leftHead) != '\0' && ((*leftHead) < left->as.leaf.data || (*leftHead) > (left->as.leaf.data + left->length)) ) { return result; } //BUGFIX: if we're not currently iterating through the right leaf (and rightHead is not null), skip out - if (right->type == TOY_STRING_LEAF && (*rightHead) != NULL && (**rightHead) != '\0' && ((*rightHead) < right->as.leaf.data || (*rightHead) > (right->as.leaf.data + strlen(right->as.leaf.data))) ) { + if (right->type == TOY_STRING_LEAF && (*rightHead) != NULL && (**rightHead) != '\0' && ((*rightHead) < right->as.leaf.data || (*rightHead) > (right->as.leaf.data + right->length)) ) { return result; } @@ -328,7 +328,7 @@ int Toy_compareStrings(Toy_String* left, Toy_String* right) { exit(-1); } - return strcmp(left->as.name.data, right->as.name.data); //URGENT: strncmp + return strncmp(left->as.name.data, right->as.name.data, left->length); } //util pointers @@ -343,7 +343,7 @@ unsigned int Toy_hashString(Toy_String* str) { return str->cachedHash; } else if (str->type == TOY_STRING_NODE) { - //TODO: I wonder if it would be possible to discretely swap the composite node string with a new leaf string here? Would that speed up other parts of the code by not having to walk the tree in future? + //TODO: I wonder if it would be possible to discretely swap the composite node string with a new leaf string here? Would that speed up other parts of the code by not having to walk the tree in future? - needs to be benchmarked char* buffer = Toy_getStringRawBuffer(str); str->cachedHash = hashCString(buffer); free(buffer); diff --git a/source/toy_vm.c b/source/toy_vm.c index 4ab61a1..8f84c4a 100644 --- a/source/toy_vm.c +++ b/source/toy_vm.c @@ -282,7 +282,7 @@ static void processArithmetic(Toy_VM* vm, Toy_OpcodeType opcode) { } static void processComparison(Toy_VM* vm, Toy_OpcodeType opcode) { - Toy_Value right = Toy_popStack(&vm->stack); //URGENT: These are not freed correctly + Toy_Value right = Toy_popStack(&vm->stack); Toy_Value left = Toy_popStack(&vm->stack); //most things can be equal, so handle it separately @@ -297,6 +297,8 @@ static void processComparison(Toy_VM* vm, Toy_OpcodeType opcode) { Toy_pushStack(&vm->stack, TOY_VALUE_FROM_BOOLEAN(!equal) ); } + Toy_freeValue(left); + Toy_freeValue(right); return; } @@ -330,6 +332,9 @@ static void processComparison(Toy_VM* vm, Toy_OpcodeType opcode) { else { Toy_pushStack(&vm->stack, TOY_VALUE_FROM_BOOLEAN(false)); } + + Toy_freeValue(left); + Toy_freeValue(right); } static void processLogical(Toy_VM* vm, Toy_OpcodeType opcode) {