diff --git a/src/pocketpy.h b/src/pocketpy.h index 755508ea..8456e1ed 100644 --- a/src/pocketpy.h +++ b/src/pocketpy.h @@ -509,7 +509,7 @@ void __initializeBuiltinFunctions(VM* _vm) { void __addModuleTime(VM* vm){ - PyVar mod = vm->newModule("time"); + PyVar mod = vm->new_module("time"); vm->bindFunc<0>(mod, "time", [](VM* vm, const pkpy::ArgList& args) { auto now = std::chrono::high_resolution_clock::now(); return vm->PyFloat(std::chrono::duration_cast(now.time_since_epoch()).count() / 1000000.0); @@ -517,7 +517,7 @@ void __addModuleTime(VM* vm){ } void __addModuleSys(VM* vm){ - PyVar mod = vm->newModule("sys"); + PyVar mod = vm->new_module("sys"); vm->bindFunc<1>(mod, "getrefcount", [](VM* vm, const pkpy::ArgList& args) { return vm->PyInt(args[0].use_count()); }); @@ -535,7 +535,7 @@ void __addModuleSys(VM* vm){ } void __addModuleJson(VM* vm){ - PyVar mod = vm->newModule("json"); + PyVar mod = vm->new_module("json"); vm->bindFunc<1>(mod, "loads", [](VM* vm, const pkpy::ArgList& args) { const _Str& expr = vm->PyStr_AS_C(args[0]); _Code code = vm->compile(expr, "", JSON_MODE); @@ -548,7 +548,7 @@ void __addModuleJson(VM* vm){ } void __addModuleMath(VM* vm){ - PyVar mod = vm->newModule("math"); + PyVar mod = vm->new_module("math"); vm->setattr(mod, "pi", vm->PyFloat(3.1415926535897932384)); vm->setattr(mod, "e" , vm->PyFloat(2.7182818284590452354)); @@ -647,7 +647,7 @@ PyVar __regex_search(const _Str& pattern, const _Str& string, bool fromStart, VM }; void __addModuleRe(VM* vm){ - PyVar mod = vm->newModule("re"); + PyVar mod = vm->new_module("re"); ReMatch::_bind(vm); vm->bindFunc<2>(mod, "match", [](VM* vm, const pkpy::ArgList& args) { @@ -783,7 +783,7 @@ extern "C" { __EXPORT /// Add a source module into a virtual machine. void pkpy_vm_add_module(VM* vm, const char* name, const char* source){ - vm->addLazyModule(name, source); + vm->_lazy_modules[name] = source; } void __vm_init(VM* vm){ diff --git a/src/vm.h b/src/vm.h index e18a9117..4d710bc3 100644 --- a/src/vm.h +++ b/src/vm.h @@ -22,7 +22,6 @@ class VM { std::vector _small_integers; // [-5, 256] - emhash8::HashMap<_Str, _Str> _lazy_modules; // lazy loaded modules protected: std::deque< std::unique_ptr > callstack; PyVar __py2py_call_signal; @@ -310,7 +309,7 @@ protected: }else{ const _Str& source = it2->second; _Code code = compile(source, name, EXEC_MODE); - PyVar _m = newModule(name); + PyVar _m = new_module(name); _exec(code, _m, pkpy::make_shared()); frame->push(_m); _lazy_modules.erase(it2); @@ -340,6 +339,7 @@ protected: public: PyVarDict _types; PyVarDict _modules; // loaded modules + emhash8::HashMap<_Str, _Str> _lazy_modules; // lazy loaded modules PyVar None, True, False, Ellipsis; bool use_stdio; @@ -598,17 +598,13 @@ public: return new_object(T::_tp(this), T(std::forward(args)...)); } - PyVar newModule(_Str name) { - PyVar obj = new_object(_tp_module, (i64)-2); + PyVar new_module(_Str name) { + PyVar obj = new_object(_tp_module, DUMMY_VAL); setattr(obj, __name__, PyStr(name)); _modules[name] = obj; return obj; } - void addLazyModule(_Str name, _Str source){ - _lazy_modules[name] = source; - } - PyVarOrNull getattr(const PyVar& obj, const _Str& name, bool throw_err=true) { PyVarDict::iterator it; PyObject* cls; @@ -860,8 +856,8 @@ public: this->Ellipsis = new_object(_types["ellipsis"], DUMMY_VAL); this->True = new_object(_tp_bool, true); this->False = new_object(_tp_bool, false); - this->builtins = newModule("builtins"); - this->_main = newModule("__main__"); + this->builtins = new_module("builtins"); + this->_main = new_module("__main__"); setattr(_tp_type, __base__, _tp_object); _tp_type->_type = _tp_type;