diff --git a/source/toy_literal.h b/source/toy_literal.h index f205fbf..64df483 100644 --- a/source/toy_literal.h +++ b/source/toy_literal.h @@ -8,6 +8,7 @@ struct Toy_Literal; struct Toy_Interpreter; struct Toy_LiteralArray; +struct Toy_Scope; typedef int (*Toy_NativeFn)(struct Toy_Interpreter* interpreter, struct Toy_LiteralArray* arguments); typedef int (*Toy_HookFn)(struct Toy_Interpreter* interpreter, struct Toy_Literal identifier, struct Toy_Literal alias); typedef void (*Toy_PrintFn)(const char*); @@ -57,7 +58,7 @@ typedef struct Toy_Literal { Toy_NativeFn native; //8 Toy_HookFn hook; //8 } inner; //8 - void* scope; //8 + struct Toy_Scope* scope; //8 } function; //16 struct { //for variable names diff --git a/source/toy_literal_dictionary.c b/source/toy_literal_dictionary.c index 46b5de7..0d89545 100644 --- a/source/toy_literal_dictionary.c +++ b/source/toy_literal_dictionary.c @@ -17,6 +17,10 @@ static void setEntryValues(Toy_private_dictionary_entry* entry, Toy_Literal key, } static Toy_private_dictionary_entry* getEntryArray(Toy_private_dictionary_entry* array, int capacity, Toy_Literal key, unsigned int hash, bool mustExist) { + if (!capacity) { + return NULL; + } + //find "key", starting at index unsigned int index = hash % capacity; unsigned int start = index; @@ -122,10 +126,10 @@ static void freeEntryArray(Toy_private_dictionary_entry* array, int capacity) { void Toy_initLiteralDictionary(Toy_LiteralDictionary* dictionary) { //HACK: because modulo by 0 is undefined, set the capacity to a non-zero value (and allocate the arrays) dictionary->entries = NULL; - dictionary->capacity = TOY_GROW_CAPACITY(0); + dictionary->capacity = 0; dictionary->contains = 0; dictionary->count = 0; - adjustEntryCapacity(&dictionary->entries, 0, dictionary->capacity); + dictionary->capacity = 0; } void Toy_freeLiteralDictionary(Toy_LiteralDictionary* dictionary) { @@ -215,5 +219,5 @@ void Toy_removeLiteralDictionary(Toy_LiteralDictionary* dictionary, Toy_Literal bool Toy_existsLiteralDictionary(Toy_LiteralDictionary* dictionary, Toy_Literal key) { //null & not tombstoned Toy_private_dictionary_entry* entry = getEntryArray(dictionary->entries, dictionary->capacity, key, Toy_hashLiteral(key), false); - return !(TOY_IS_NULL(entry->key) && TOY_IS_NULL(entry->value)); + return entry != NULL && !(TOY_IS_NULL(entry->key) && TOY_IS_NULL(entry->value)); } diff --git a/source/toy_scope.c b/source/toy_scope.c index 9c2e979..61647ef 100644 --- a/source/toy_scope.c +++ b/source/toy_scope.c @@ -209,6 +209,10 @@ Toy_Scope* Toy_popScope(Toy_Scope* scope) { } Toy_Scope* Toy_copyScope(Toy_Scope* original) { + if (original == NULL) { + return NULL; + } + Toy_Scope* scope = TOY_ALLOCATE(Toy_Scope, 1); scope->ancestor = original->ancestor; Toy_initLiteralDictionary(&scope->variables);