Box* JitFragmentWriter::callattrHelper(Box* obj, BoxedString* attr, CallattrFlags flags, TypeRecorder* type_recorder, Box** args, std::vector<BoxedString*>* keyword_names) { auto arg_tuple = getTupleFromArgsArray(&args[0], flags.argspec.totalPassed()); Box* r = callattr(obj, attr, flags, std::get<0>(arg_tuple), std::get<1>(arg_tuple), std::get<2>(arg_tuple), std::get<3>(arg_tuple), keyword_names); assert(gc::isValidGCObject(r)); return recordType(type_recorder, r); }
llvm::iterator_range<BoxIterator> Box::pyElements() { static std::string iter_str("__iter__"); Box* iter = callattr(const_cast<Box*>(this), &iter_str, true, ArgPassSpec(0), NULL, NULL, NULL, NULL, NULL); if (iter) { return llvm::iterator_range<BoxIterator>(++BoxIterator(iter), BoxIterator(nullptr)); } raiseExcHelper(TypeError, "'%s' object is not iterable", getTypeName(this)->c_str()); }
void prependToSysPath(llvm::StringRef path) { BoxedList* sys_path = getSysPath(); static BoxedString* insert_str = getStaticString("insert"); CallattrFlags callattr_flags{.cls_only = false, .null_on_nonexistent = false, .argspec = ArgPassSpec(2) }; autoDecref(callattr(sys_path, insert_str, callattr_flags, autoDecref(boxInt(0)), autoDecref(boxString(path)), NULL, NULL, NULL)); } static std::string generateVersionString() { std::ostringstream oss; oss << PY_MAJOR_VERSION << '.' << PY_MINOR_VERSION << '.' << PY_MICRO_VERSION; oss << '\n'; oss << "[Pyston " << PYSTON_VERSION_MAJOR << '.' << PYSTON_VERSION_MINOR << '.' << PYSTON_VERSION_MICRO << "]"; return oss.str(); }
void prependToSysPath(llvm::StringRef path) { BoxedList* sys_path = getSysPath(); static BoxedString* insert_str = internStringImmortal("insert"); CallattrFlags callattr_flags{.cls_only = false, .null_on_nonexistent = false, .argspec = ArgPassSpec(2) }; callattr(sys_path, insert_str, callattr_flags, boxInt(0), boxString(path), NULL, NULL, NULL); } static BoxedClass* sys_flags_cls; class BoxedSysFlags : public Box { public: Box* division_warning, *bytes_warning, *no_user_site, *optimize; BoxedSysFlags() { auto zero = boxInt(0); assert(zero); division_warning = zero; bytes_warning = zero; no_user_site = zero; optimize = zero; } DEFAULT_CLASS(sys_flags_cls); static void gcHandler(GCVisitor* v, Box* _b) { assert(_b->cls == sys_flags_cls); Box::gcHandler(v, _b); BoxedSysFlags* self = static_cast<BoxedSysFlags*>(_b); v->visit(self->division_warning); v->visit(self->bytes_warning); v->visit(self->no_user_site); v->visit(self->optimize); } static Box* __new__(Box* cls, Box* args, Box* kwargs) { raiseExcHelper(TypeError, "cannot create 'sys.flags' instances"); } }; static std::string generateVersionString() { std::ostringstream oss; oss << PYTHON_VERSION_MAJOR << '.' << PYTHON_VERSION_MINOR << '.' << PYTHON_VERSION_MICRO; oss << '\n'; oss << "[Pyston " << PYSTON_VERSION_MAJOR << '.' << PYSTON_VERSION_MINOR << "]"; return oss.str(); }
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; }
void prependToSysPath(llvm::StringRef path) { BoxedList* sys_path = getSysPath(); static BoxedString* insert_str = getStaticString("insert"); CallattrFlags callattr_flags{.cls_only = false, .null_on_nonexistent = false, .argspec = ArgPassSpec(2) }; autoDecref(callattr(sys_path, insert_str, callattr_flags, autoDecref(boxInt(0)), autoDecref(boxString(path)), NULL, NULL, NULL)); } static BoxedClass* sys_flags_cls; class BoxedSysFlags : public Box { public: Box* division_warning, *bytes_warning, *no_user_site, *optimize; BoxedSysFlags() { auto zero = boxInt(0); assert(zero); division_warning = incref(zero); bytes_warning = incref(zero); no_user_site = incref(zero); optimize = incref(zero); Py_DECREF(zero); } DEFAULT_CLASS(sys_flags_cls); static Box* __new__(Box* cls, Box* args, Box* kwargs) { raiseExcHelper(TypeError, "cannot create 'sys.flags' instances"); } static void dealloc(BoxedSysFlags* self) { Py_DECREF(self->division_warning); Py_DECREF(self->bytes_warning); Py_DECREF(self->no_user_site); Py_DECREF(self->optimize); } }; static std::string generateVersionString() { std::ostringstream oss; oss << PY_MAJOR_VERSION << '.' << PY_MINOR_VERSION << '.' << PY_MICRO_VERSION; oss << '\n'; oss << "[Pyston " << PYSTON_VERSION_MAJOR << '.' << PYSTON_VERSION_MINOR << '.' << PYSTON_VERSION_MICRO << "]"; return oss.str(); }
void prependToSysPath(const std::string& path) { BoxedList* sys_path = getSysPath(); static std::string attr = "insert"; callattr(sys_path, &attr, false, ArgPassSpec(2), boxInt(0), new BoxedString(path), NULL, NULL, NULL); }
SearchResult findModule(const std::string& name, BoxedString* full_name, BoxedList* path_list) { static BoxedString* meta_path_str = internStringImmortal("meta_path"); BoxedList* meta_path = static_cast<BoxedList*>(sys_module->getattr(meta_path_str)); if (!meta_path || meta_path->cls != list_cls) raiseExcHelper(RuntimeError, "sys.meta_path must be a list of import hooks"); static BoxedString* findmodule_str = internStringImmortal("find_module"); for (int i = 0; i < meta_path->size; i++) { Box* finder = meta_path->elts->elts[i]; auto path_pass = path_list ? path_list : None; CallattrFlags callattr_flags{.cls_only = false, .null_on_nonexistent = false, .argspec = ArgPassSpec(2) }; Box* loader = callattr(finder, findmodule_str, callattr_flags, full_name, path_pass, NULL, NULL, NULL); if (loader != None) return SearchResult(loader); } if (!path_list) path_list = getSysPath(); if (path_list == NULL || path_list->cls != list_cls) { raiseExcHelper(RuntimeError, "sys.path must be a list of directory names"); } static BoxedString* path_hooks_str = internStringImmortal("path_hooks"); BoxedList* path_hooks = static_cast<BoxedList*>(sys_module->getattr(path_hooks_str)); if (!path_hooks || path_hooks->cls != list_cls) raiseExcHelper(RuntimeError, "sys.path_hooks must be a list of import hooks"); static BoxedString* path_importer_cache_str = internStringImmortal("path_importer_cache"); BoxedDict* path_importer_cache = static_cast<BoxedDict*>(sys_module->getattr(path_importer_cache_str)); if (!path_importer_cache || path_importer_cache->cls != dict_cls) raiseExcHelper(RuntimeError, "sys.path_importer_cache must be a dict"); 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); std::string dn(joined_path.str()); llvm::sys::path::append(joined_path, "__init__.py"); std::string fn(joined_path.str()); PyObject* importer = get_path_importer(path_importer_cache, path_hooks, _p); if (importer == NULL) throwCAPIException(); if (importer != None) { CallattrFlags callattr_flags{.cls_only = false, .null_on_nonexistent = false, .argspec = ArgPassSpec(1) }; Box* loader = callattr(importer, findmodule_str, callattr_flags, full_name, NULL, NULL, NULL, NULL); if (loader != None) return SearchResult(loader); } if (pathExists(fn)) return SearchResult(std::move(dn), SearchResult::PKG_DIRECTORY); joined_path.clear(); llvm::sys::path::append(joined_path, std::string(p->s()), name + ".py"); fn = joined_path.str(); if (pathExists(fn)) return SearchResult(std::move(fn), SearchResult::PY_SOURCE); joined_path.clear(); llvm::sys::path::append(joined_path, p->s(), name + ".pyston.so"); fn = joined_path.str(); if (pathExists(fn)) return SearchResult(std::move(fn), SearchResult::C_EXTENSION); } return SearchResult("", SearchResult::SEARCH_ERROR); } PyObject* PyImport_GetImporter(PyObject* path) noexcept { PyObject* importer = NULL, * path_importer_cache = NULL, * path_hooks = NULL; if ((path_importer_cache = PySys_GetObject("path_importer_cache"))) { if ((path_hooks = PySys_GetObject("path_hooks"))) { importer = get_path_importer(path_importer_cache, path_hooks, path); } } Py_XINCREF(importer); /* get_path_importer returns a borrowed reference */ return importer; }