From 8ce4879de5e27c37dc5db16aaa6d3ecf7413ac2a Mon Sep 17 00:00:00 2001 From: Bob Nystrom Date: Tue, 23 Jun 2015 07:15:22 -0700 Subject: [PATCH] Clean up getting modules. Thanks, Michel! --- src/vm/wren_vm.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/vm/wren_vm.c b/src/vm/wren_vm.c index 03e12faa..0a804530 100644 --- a/src/vm/wren_vm.c +++ b/src/vm/wren_vm.c @@ -133,7 +133,7 @@ static void collectGarbage(WrenVM* vm) // already been freed. vm->bytesAllocated = 0; - wrenMarkObj(vm, (Obj*)vm->modules); + wrenMarkObj(vm, (Obj*)vm->modules); // Temporary roots. for (int i = 0; i < vm->numTempRoots; i++) @@ -142,7 +142,7 @@ static void collectGarbage(WrenVM* vm) } // The current fiber. - wrenMarkObj(vm, (Obj*)vm->fiber); + wrenMarkObj(vm, (Obj*)vm->fiber); // The method handles. for (WrenMethod* handle = vm->methodHandles; @@ -427,26 +427,29 @@ static inline void callFunction(ObjFiber* fiber, Obj* function, int numArgs) } } +// Looks up the previously loaded module with [name]. +// +// Returns `NULL` if no module with that name has been loaded. +static ObjModule* getModule(WrenVM* vm, Value name) +{ + Value moduleValue = wrenMapGet(vm->modules, name); + return !IS_UNDEFINED(moduleValue) ? AS_MODULE(moduleValue) : NULL; +} + // Looks up the core module in the module map. static ObjModule* getCoreModule(WrenVM* vm) { - Value moduleValue = wrenMapGet(vm->modules, NULL_VAL); - ASSERT(!IS_UNDEFINED(moduleValue), "Could not find core module."); - return AS_MODULE(moduleValue); + ObjModule* module = getModule(vm, NULL_VAL); + ASSERT(module != NULL, "Could not find core module."); + return module; } static ObjFiber* loadModule(WrenVM* vm, Value name, const char* source) { - ObjModule* module; - Value moduleValue = wrenMapGet(vm->modules, name); + ObjModule* module = getModule(vm, name); // See if the module has already been loaded. - if (!IS_UNDEFINED(moduleValue)) - { - // Execute the new code in the context of the existing module. - module = AS_MODULE(moduleValue); - } - else + if (module == NULL) { module = wrenNewModule(vm, AS_STRING(name)); @@ -505,10 +508,8 @@ static Value importModule(WrenVM* vm, Value name) static bool importVariable(WrenVM* vm, Value moduleName, Value variableName, Value* result) { - Value moduleValue = wrenMapGet(vm->modules, moduleName); - ASSERT(!IS_UNDEFINED(moduleValue), "Should only look up loaded modules."); - - ObjModule* module = AS_MODULE(moduleValue); + ObjModule* module = getModule(vm, moduleName); + ASSERT(module != NULL, "Should only look up loaded modules."); ObjString* variable = AS_STRING(variableName); uint32_t variableEntry = wrenSymbolTableFind(&module->variableNames, @@ -1225,9 +1226,8 @@ WrenMethod* wrenGetMethod(WrenVM* vm, const char* module, const char* variable, Value moduleName = wrenStringFormat(vm, "$", module); wrenPushRoot(vm, AS_OBJ(moduleName)); - Value moduleValue = wrenMapGet(vm->modules, moduleName); + ObjModule* moduleObj = getModule(vm, moduleName); // TODO: Handle module not being found. - ObjModule* moduleObj = AS_MODULE(moduleValue); int variableSlot = wrenSymbolTableFind(&moduleObj->variableNames, variable, strlen(variable));