static Box* createAndRunModule(BoxedString* name, const std::string& fn, const std::string& module_path) { BoxedModule* module = createModule(name, fn.c_str()); Box* b_path = boxString(module_path); BoxedList* path_list = new BoxedList(); listAppendInternal(path_list, b_path); static BoxedString* path_str = internStringImmortal("__path__"); module->setattr(path_str, path_list, NULL); AST_Module* ast = caching_parse_file(fn.c_str(), /* future_flags = */ 0); assert(ast); try { compileAndRunModule(ast, module); } catch (ExcInfo e) { removeModule(name); throw e; } Box* r = getSysModulesDict()->getOrNull(name); if (!r) raiseExcHelper(ImportError, "Loaded module %.200s not found in sys.modules", name->c_str()); return r; }
BoxedModule* importTestExtension(const std::string& name) { std::string pathname_name = "test/test_extension/" + name + ".pyston.so"; const char* pathname = pathname_name.c_str(); void* handle = dlopen(pathname, RTLD_NOW); if (!handle) { fprintf(stderr, "%s\n", dlerror()); exit(1); } assert(handle); std::string initname = "init" + name; void (*init)() = (void (*)())dlsym(handle, initname.c_str()); char* error; if ((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); exit(1); } assert(init); (*init)(); BoxedDict* sys_modules = getSysModulesDict(); Box* s = boxStrConstant(name.c_str()); Box* _m = sys_modules->d[s]; RELEASE_ASSERT(_m, "module failed to initialize properly?"); assert(_m->cls == module_cls); BoxedModule* m = static_cast<BoxedModule*>(_m); m->setattr("__file__", boxStrConstant(pathname), NULL); m->fn = pathname; return m; }