private Obj ImportModule(Obj name) { // If the module is already loaded, we don't need to do anything. if (_modules.Get(name) != Obj.Undefined) return Obj.Null; // Load the module's source code from the embedder. string source = LoadModuleFn(name.ToString()); if (source == null) { // Couldn't load the module. return Obj.MakeString(string.Format("Could not find module '{0}'.", name)); } ObjFiber moduleFiber = LoadModule(name, source); // Return the fiber that executes the module. return moduleFiber; }
private ObjFiber LoadModule(Obj name, string source) { ObjModule module = GetModule(name); // See if the module has already been loaded. if (module == null) { module = new ObjModule(name as ObjString); // Store it in the VM's module registry so we don't load the same module // multiple times. _modules.Set(name, module); // Implicitly import the core module. ObjModule coreModule = GetCoreModule(); foreach (ModuleVariable t in coreModule.Variables) { DefineVariable(module, t.Name, t.Container); } } ObjFn fn = Compiler.Compile(this, module, name.ToString(), source, true); if (fn == null) { // TODO: Should we still store the module even if it didn't compile? return null; } ObjFiber moduleFiber = new ObjFiber(fn); // Return the fiber that executes the module. return moduleFiber; }