blueloveTH 3 лет назад
Родитель
Сommit
be4ce003a3
4 измененных файлов с 6 добавлено и 6 удалено
  1. 1 1
      src/ceval.h
  2. 2 2
      src/frame.h
  3. 2 2
      src/pocketpy.h
  4. 1 1
      src/vm.h

+ 1 - 1
src/ceval.h

@@ -282,7 +282,7 @@ PyVar VM::run_frame(Frame* frame){
                     const Str& source = it2->second;
                     const Str& source = it2->second;
                     CodeObject_ code = compile(source, name, EXEC_MODE);
                     CodeObject_ code = compile(source, name, EXEC_MODE);
                     PyVar _m = new_module(name);
                     PyVar _m = new_module(name);
-                    _exec(code, _m, pkpy::make_shared<pkpy::NameDict>());
+                    _exec(code, _m);
                     frame->push(_m);
                     frame->push(_m);
                     _lazy_modules.erase(it2);
                     _lazy_modules.erase(it2);
                 }
                 }

+ 2 - 2
src/frame.h

@@ -16,7 +16,7 @@ struct Frame {
     const i64 id;
     const i64 id;
     std::stack<std::pair<int, std::vector<PyVar>>> s_try_block;
     std::stack<std::pair<int, std::vector<PyVar>>> s_try_block;
 
 
-    inline pkpy::NameDict& f_locals() noexcept { return *_locals; }
+    inline pkpy::NameDict& f_locals() noexcept { return _locals != nullptr ? *_locals : _module->attr(); }
     inline pkpy::NameDict& f_globals() noexcept { return _module->attr(); }
     inline pkpy::NameDict& f_globals() noexcept { return _module->attr(); }
 
 
     inline PyVar* f_closure_try_get(const Str& name) noexcept {
     inline PyVar* f_closure_try_get(const Str& name) noexcept {
@@ -25,7 +25,7 @@ struct Frame {
     }
     }
 
 
     Frame(const CodeObject_ co, PyVar _module,
     Frame(const CodeObject_ co, PyVar _module,
-        pkpy::shared_ptr<pkpy::NameDict> _locals, pkpy::shared_ptr<pkpy::NameDict> _closure=nullptr)
+        pkpy::shared_ptr<pkpy::NameDict> _locals=nullptr, pkpy::shared_ptr<pkpy::NameDict> _closure=nullptr)
         : co(co), _module(_module), _locals(_locals), _closure(_closure), id(kFrameGlobalId++) { }
         : co(co), _module(_module), _locals(_locals), _closure(_closure), id(kFrameGlobalId++) { }
 
 
     inline const Bytecode& next_bytecode() {
     inline const Bytecode& next_bytecode() {

+ 2 - 2
src/pocketpy.h

@@ -768,7 +768,7 @@ void add_module_random(VM* vm){
     });
     });
 
 
     CodeObject_ code = vm->compile(kRandomCode, "random.py", EXEC_MODE);
     CodeObject_ code = vm->compile(kRandomCode, "random.py", EXEC_MODE);
-    vm->_exec(code, mod, pkpy::make_shared<pkpy::NameDict>());
+    vm->_exec(code, mod);
 }
 }
 
 
 
 
@@ -889,7 +889,7 @@ extern "C" {
         add_module_os(vm);
         add_module_os(vm);
 
 
         CodeObject_ code = vm->compile(kBuiltinsCode, "<builtins>", EXEC_MODE);
         CodeObject_ code = vm->compile(kBuiltinsCode, "<builtins>", EXEC_MODE);
-        vm->_exec(code, vm->builtins, pkpy::make_shared<pkpy::NameDict>());
+        vm->_exec(code, vm->builtins);
         return vm;
         return vm;
     }
     }
 
 

+ 1 - 1
src/vm.h

@@ -216,7 +216,7 @@ public:
         if(_module == nullptr) _module = _main;
         if(_module == nullptr) _module = _main;
         try {
         try {
             CodeObject_ code = compile(source, filename, mode);
             CodeObject_ code = compile(source, filename, mode);
-            return _exec(code, _module, pkpy::make_shared<pkpy::NameDict>());
+            return _exec(code, _module);
         }catch (const pkpy::Exception& e){
         }catch (const pkpy::Exception& e){
             *_stderr << e.summary() << '\n';
             *_stderr << e.summary() << '\n';
         }
         }