mirror of
https://github.com/krgamestudios/Toy.git
synced 2026-04-15 14:54:07 +10:00
Fixed some error states and error messages, read more
By leaving 'null' on the stack, it won't cause stack underflows in a bunch of erroneous situations. This will allow the repl (and other situations) to continue if they want to. I've also fixed some error messages in toy_table.c, which were formatted badly. Closes #162
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user