diff --git a/source/toy_opcodes.h b/source/toy_opcodes.h index 82703f9..99614f7 100644 --- a/source/toy_opcodes.h +++ b/source/toy_opcodes.h @@ -45,7 +45,6 @@ typedef enum Toy_OpcodeType { TOY_OPCODE_PRINT, TOY_OPCODE_CONCAT, TOY_OPCODE_INDEX, - //URGENT: clear the program stack - much needed //meta instructions TOY_OPCODE_PASS, diff --git a/source/toy_table.c b/source/toy_table.c index 98ee437..67f663f 100644 --- a/source/toy_table.c +++ b/source/toy_table.c @@ -58,7 +58,8 @@ Toy_Table* Toy_private_adjustTableCapacity(Toy_Table* oldTable, unsigned int new Toy_Table* newTable = malloc(newCapacity * sizeof(Toy_TableEntry) + sizeof(Toy_Table)); if (newTable == NULL) { - Toy_error(TOY_CC_ERROR "ERROR: Failed to allocate a 'Toy_Table'\n" TOY_CC_RESET); + fprintf(stderr, TOY_CC_ERROR "ERROR: Failed to allocate a 'Toy_Table'\n" TOY_CC_RESET); + exit(1); } newTable->capacity = newCapacity; @@ -103,7 +104,8 @@ void Toy_freeTable(Toy_Table* table) { void Toy_insertTable(Toy_Table** tableHandle, Toy_Value key, Toy_Value value) { if (TOY_VALUE_IS_NULL(key) || TOY_VALUE_IS_BOOLEAN(key)) { //TODO: disallow functions and opaques - Toy_error(TOY_CC_ERROR "ERROR: Bad table key\n" TOY_CC_RESET); + fprintf(stderr, TOY_CC_ERROR "ERROR: Bad table key\n" TOY_CC_RESET); + exit(1); } //expand the capacity @@ -116,7 +118,8 @@ void Toy_insertTable(Toy_Table** tableHandle, Toy_Value key, Toy_Value value) { Toy_TableEntry* Toy_private_lookupTableEntryPtr(Toy_Table** tableHandle, Toy_Value key) { if (TOY_VALUE_IS_NULL(key) || TOY_VALUE_IS_BOOLEAN(key)) { //TODO: disallow functions and opaques - Toy_error(TOY_CC_ERROR "ERROR: Bad table key\n" TOY_CC_RESET); + fprintf(stderr, TOY_CC_ERROR "ERROR: Bad table key\n" TOY_CC_RESET); + exit(1); } //lookup @@ -153,7 +156,8 @@ Toy_Value Toy_lookupTable(Toy_Table** tableHandle, Toy_Value key) { void Toy_removeTable(Toy_Table** tableHandle, Toy_Value key) { if (TOY_VALUE_IS_NULL(key) || TOY_VALUE_IS_BOOLEAN(key)) { //TODO: disallow functions and opaques - Toy_error(TOY_CC_ERROR "ERROR: Bad table key\n" TOY_CC_RESET); + fprintf(stderr, TOY_CC_ERROR "ERROR: Bad table key\n" TOY_CC_RESET); + exit(1); } //lookup diff --git a/source/toy_vm.c b/source/toy_vm.c index 4053705..e3f8db7 100644 --- a/source/toy_vm.c +++ b/source/toy_vm.c @@ -81,7 +81,7 @@ static void processRead(Toy_VM* vm) { value = TOY_VALUE_FROM_STRING(Toy_createNameStringLength(&vm->stringBucket, cstring, len, valueType, false)); } else { - Toy_error("Invalid string type found"); + Toy_error("Invalid string type found in opcode read"); } break; @@ -270,6 +270,7 @@ static void processAssignCompound(Toy_VM* vm) { Toy_freeValue(target); Toy_freeValue(key); Toy_freeValue(value); + return; } //set the value @@ -303,6 +304,7 @@ static void processAccess(Toy_VM* vm) { //check name string type if (!TOY_VALUE_IS_STRING(name) && TOY_VALUE_AS_STRING(name)->info.type != TOY_STRING_NAME) { + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); Toy_error("Invalid access target"); return; } @@ -312,6 +314,7 @@ static void processAccess(Toy_VM* vm) { if (valuePtr == NULL) { Toy_freeValue(name); + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } @@ -352,6 +355,7 @@ static void processArithmetic(Toy_VM* vm, Toy_OpcodeType opcode) { Toy_freeValue(left); Toy_freeValue(right); + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } @@ -361,6 +365,7 @@ static void processArithmetic(Toy_VM* vm, Toy_OpcodeType opcode) { Toy_error("Can't divide or modulo by zero"); Toy_freeValue(left); Toy_freeValue(right); + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } } @@ -370,6 +375,7 @@ static void processArithmetic(Toy_VM* vm, Toy_OpcodeType opcode) { Toy_error("Can't modulo by a float"); Toy_freeValue(left); Toy_freeValue(right); + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } @@ -443,6 +449,7 @@ static void processComparison(Toy_VM* vm, Toy_OpcodeType opcode) { Toy_freeValue(left); Toy_freeValue(right); + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } @@ -608,6 +615,7 @@ static void processConcat(Toy_VM* vm) { Toy_error("Failed to concatenate a value that is not a string"); Toy_freeValue(left); Toy_freeValue(right); + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } @@ -634,7 +642,7 @@ static void processIndex(Toy_VM* vm) { } else { Toy_error("Incorrect number of elements found in index"); - //TODO: clear stack, then leave null + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } @@ -646,6 +654,7 @@ static void processIndex(Toy_VM* vm) { Toy_freeValue(value); Toy_freeValue(index); Toy_freeValue(length); + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } @@ -654,6 +663,7 @@ static void processIndex(Toy_VM* vm) { Toy_freeValue(value); Toy_freeValue(index); Toy_freeValue(length); + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } @@ -668,6 +678,7 @@ static void processIndex(Toy_VM* vm) { Toy_freeValue(value); Toy_freeValue(index); Toy_freeValue(length); + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } @@ -700,6 +711,7 @@ static void processIndex(Toy_VM* vm) { Toy_freeValue(value); Toy_freeValue(index); Toy_freeValue(length); + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } @@ -708,6 +720,7 @@ static void processIndex(Toy_VM* vm) { Toy_freeValue(value); Toy_freeValue(index); Toy_freeValue(length); + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } @@ -722,6 +735,7 @@ static void processIndex(Toy_VM* vm) { Toy_freeValue(value); Toy_freeValue(index); Toy_freeValue(length); + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } @@ -742,6 +756,7 @@ static void processIndex(Toy_VM* vm) { Toy_freeValue(value); Toy_freeValue(index); Toy_freeValue(length); + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } @@ -754,6 +769,7 @@ static void processIndex(Toy_VM* vm) { Toy_freeValue(value); Toy_freeValue(index); Toy_freeValue(length); + Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL()); return; } diff --git a/source/toy_vm.h b/source/toy_vm.h index 75b440d..97062f0 100644 --- a/source/toy_vm.h +++ b/source/toy_vm.h @@ -39,8 +39,6 @@ typedef struct Toy_VM { //easy access to memory Toy_Bucket* stringBucket; //stores the string literals Toy_Bucket* scopeBucket; //stores the scopes - - //URGENT: panic/failed state flag } Toy_VM; TOY_API void Toy_initVM(Toy_VM* vm);