static Box* importSub(const std::string& name, BoxedString* full_name, Box* parent_module) { BoxedDict* sys_modules = getSysModulesDict(); if (sys_modules->d.find(full_name) != sys_modules->d.end()) { return sys_modules->d[full_name]; } BoxedList* path_list; if (parent_module == NULL || parent_module == None) { path_list = NULL; } else { static BoxedString* path_str = internStringImmortal("__path__"); path_list = static_cast<BoxedList*>(getattrInternal<ExceptionStyle::CXX>(parent_module, path_str)); if (path_list == NULL || path_list->cls != list_cls) { return None; } } SearchResult sr = findModule(name, full_name, path_list); if (sr.type != SearchResult::SEARCH_ERROR) { Box* module; try { if (sr.type == SearchResult::PY_SOURCE) module = createAndRunModule(full_name, sr.path); else if (sr.type == SearchResult::PKG_DIRECTORY) module = createAndRunModule(full_name, sr.path + "/__init__.py", sr.path); else if (sr.type == SearchResult::C_EXTENSION) module = importCExtension(full_name, name, sr.path); else if (sr.type == SearchResult::IMP_HOOK) { static BoxedString* loadmodule_str = internStringImmortal("load_module"); CallattrFlags callattr_flags{.cls_only = false, .null_on_nonexistent = false, .argspec = ArgPassSpec(1) }; module = callattr(sr.loader, loadmodule_str, callattr_flags, full_name, NULL, NULL, NULL, NULL); } else RELEASE_ASSERT(0, "%d", sr.type); } catch (ExcInfo e) { removeModule(full_name); throw e; } if (parent_module && parent_module != None) parent_module->setattr(internStringMortal(name), module, NULL); return module; }
static Box* importSub(const std::string* name, Box* parent_module) { BoxedList* path_list; if (parent_module == NULL) { path_list = getSysPath(); if (path_list == NULL || path_list->cls != list_cls) { raiseExcHelper(RuntimeError, "sys.path must be a list of directory names"); } } else { path_list = static_cast<BoxedList*>(parent_module->getattr("__path__", NULL)); if (path_list == NULL || path_list->cls != list_cls) { raiseExcHelper(ImportError, "No module named %s", name->c_str()); } } llvm::SmallString<128> joined_path; for (int i = 0; i < path_list->size; i++) { Box* _p = path_list->elts->elts[i]; if (_p->cls != str_cls) continue; BoxedString* p = static_cast<BoxedString*>(_p); joined_path.clear(); llvm::sys::path::append(joined_path, p->s, *name + ".py"); std::string fn(joined_path.str()); if (VERBOSITY() >= 2) printf("Searching for %s at %s...\n", name->c_str(), fn.c_str()); bool exists; llvm::error_code code = llvm::sys::fs::exists(joined_path.str(), exists); assert(LLVM_SYS_FS_EXISTS_CODE_OKAY(code)); if (!exists) continue; if (VERBOSITY() >= 1) printf("Importing %s from %s\n", name->c_str(), fn.c_str()); BoxedModule* module = createAndRunModule(*name, fn); return module; } if (*name == "test") { return importTestExtension(); } raiseExcHelper(ImportError, "No module named %s", name->c_str()); }