static ModulePtr loadModuleByName(DottedNamePtr name, vector<string> *sourceFiles, bool verbose) { string key = toKey(name); llvm::StringMap<ModulePtr>::iterator i = globalModules.find(key); if (i != globalModules.end()) return i->second; ModulePtr module; if (key == "__primitives__") { module = makePrimitivesModule(); } else if (key == "__operators__") { module = makeOperatorsModule(); } else if (key == "__intrinsics__") { module = makeIntrinsicsModule(); } else { PathString path = locateModule(name); if (verbose) { llvm::errs() << "loading module " << name->join() << " from " << path << "\n"; } module = parse(key, loadFile(path, sourceFiles)); } globalModules[key] = module; loadDependents(module, sourceFiles, verbose); installGlobals(module); return module; }
static ModulePtr loadModuleByName(DottedNamePtr name, vector<string> *sourceFiles) { string key = toKey(name); map<string, ModulePtr>::iterator i = globalModules.find(key); if (i != globalModules.end()) return i->second; ModulePtr module; if (key == "__primitives__") { module = makePrimitivesModule(); } else if (key == "__operators__") { module = makeOperatorsModule(); } else { string path = locateModule(name); module = parse(key, loadFile(path, sourceFiles)); } globalModules[key] = module; loadDependents(module, sourceFiles); installGlobals(module); return module; }
Module* VM::addModule(ErrorReporter& reporter, gc<String> name, gc<String> path) { if (name.isNull()) { ASSERT(!path.isNull(), "Must be given a path or a name."); // Infer the name from the script file name. // TODO(bob): Should take the file name without an extension. name = path; } // Make sure it hasn't already been added. // TODO(bob): Could make modules_ a hash table for performance. for (int i = 0; i < modules_.count(); i++) { if (modules_[i]->name() == name) { return modules_[i]; } } // Locate the path to the module if we aren't given it. if (path.isNull()) { ASSERT(!name.isNull(), "Must be given a path or a name."); path = locateModule(programDir_, name); if (path.isNull()) { reporter.error(NULL, "Could not find module \"%s\".", name->cString()); return NULL; } } Module* module = new Module(name, path); modules_.add(module); if (!module->parse(reporter)) return NULL; module->addImports(*this, reporter); return module; }