Example #1
0
File: loader.cpp Project: Blei/clay
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;
}
Example #2
0
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;
}
Example #3
0
File: VM.cpp Project: relrod/magpie
  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;
  }