From 07ffe75102c31944144596c2daf57484de9b7958 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Fri, 30 Dec 2022 20:26:45 +0800 Subject: [PATCH] up --- plugins/flutter/CHANGELOG.md | 2 +- plugins/flutter/pubspec.yaml | 2 +- plugins/flutter/src/pocketpy.h | 30 +++++++++++++++++------------- plugins/godot/godot-cpp | 2 +- src/pocketpy.h | 8 ++++---- src/repl.h | 8 ++++++-- src/vm.h | 14 +++++++------- 7 files changed, 37 insertions(+), 29 deletions(-) diff --git a/plugins/flutter/CHANGELOG.md b/plugins/flutter/CHANGELOG.md index f124983e..b0732c47 100644 --- a/plugins/flutter/CHANGELOG.md +++ b/plugins/flutter/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.6.0+1 +## 0.6.0+2 + Break change diff --git a/plugins/flutter/pubspec.yaml b/plugins/flutter/pubspec.yaml index 80cbaa71..c5b8145b 100644 --- a/plugins/flutter/pubspec.yaml +++ b/plugins/flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: pocketpy description: A lightweight Python interpreter for game engines. -version: 0.6.0+1 +version: 0.6.0+2 homepage: https://pocketpy.dev repository: https://github.com/blueloveth/pocketpy diff --git a/plugins/flutter/src/pocketpy.h b/plugins/flutter/src/pocketpy.h index 538004f1..fbef8666 100644 --- a/plugins/flutter/src/pocketpy.h +++ b/plugins/flutter/src/pocketpy.h @@ -4214,7 +4214,7 @@ protected: _error("ImportError", "module '" + name + "' not found"); }else{ const _Str& source = it2->second; - _Code code = compile(source.c_str(), name, EXEC_MODE); + _Code code = compile(source, name, EXEC_MODE); PyVar _m = newModule(name); _exec(code, _m, {}); frame->push(_m); @@ -4452,7 +4452,7 @@ public: // repl mode is only for setting `frame->id` to 0 - virtual PyVarOrNull exec(const char* source, _Str filename, CompileMode mode, PyVar _module=nullptr){ + virtual PyVarOrNull exec(_Str source, _Str filename, CompileMode mode, PyVar _module=nullptr){ if(_module == nullptr) _module = _main; try { _Code code = compile(source, filename, mode); @@ -4466,7 +4466,7 @@ public: return nullptr; } - virtual void execAsync(const char* source, _Str filename, CompileMode mode) { + virtual void execAsync(_Str source, _Str filename, CompileMode mode) { exec(source, filename, mode); } @@ -4536,7 +4536,7 @@ public: return obj; } - void addLazyModule(_Str name, const char* source){ + void addLazyModule(_Str name, _Str source){ _lazyModules[name] = source; } @@ -4857,7 +4857,7 @@ public: } } - _Code compile(const char* source, _Str filename, CompileMode mode); + _Code compile(_Str source, _Str filename, CompileMode mode); }; /***** Pointers' Impl *****/ @@ -5047,7 +5047,7 @@ public: _state = THREAD_RUNNING; } - void execAsync(const char* source, _Str filename, CompileMode mode) override { + void execAsync(_Str source, _Str filename, CompileMode mode) override { if(_state != THREAD_READY) UNREACHABLE(); #ifdef __EMSCRIPTEN__ @@ -5064,7 +5064,7 @@ public: #endif } - PyVarOrNull exec(const char* source, _Str filename, CompileMode mode, PyVar _module=nullptr) override { + PyVarOrNull exec(_Str source, _Str filename, CompileMode mode, PyVar _module=nullptr) override { if(_state == THREAD_READY) return VM::exec(source, filename, mode, _module); auto callstackBackup = std::move(callstack); callstack.clear(); @@ -6196,20 +6196,24 @@ __NOT_ENOUGH_LINES: } try{ - vm->execAsync(line.c_str(), "", SINGLE_MODE); - return EXEC_DONE; + // duplicated compile to catch NeedMoreLines + vm->compile(line, "", SINGLE_MODE); }catch(NeedMoreLines& ne){ buffer += line; buffer += '\n'; need_more_lines = ne.isClassDef ? 3 : 2; return NEED_MORE_LINES; + }catch(...){ + // do nothing } + vm->execAsync(line, "", SINGLE_MODE); + return EXEC_DONE; } }; -_Code VM::compile(const char* source, _Str filename, CompileMode mode) { - Compiler compiler(this, source, filename, mode); +_Code VM::compile(_Str source, _Str filename, CompileMode mode) { + Compiler compiler(this, source.c_str(), filename, mode); try{ return compiler.__fillCode(); }catch(_Error& e){ @@ -6270,7 +6274,7 @@ void __initializeBuiltinFunctions(VM* _vm) { _vm->bindBuiltinFunc("eval", [](VM* vm, const pkpy::ArgList& args) { vm->__checkArgSize(args, 1); const _Str& expr = vm->PyStr_AS_C(args[0]); - _Code code = vm->compile(expr.c_str(), "", EVAL_MODE); + _Code code = vm->compile(expr, "", EVAL_MODE); return vm->_exec(code, vm->topFrame()->_module, vm->topFrame()->copy_f_locals()); }); @@ -6854,7 +6858,7 @@ void __addModuleJson(VM* vm){ vm->bindFunc(mod, "loads", [](VM* vm, const pkpy::ArgList& args) { vm->__checkArgSize(args, 1); const _Str& expr = vm->PyStr_AS_C(args[0]); - _Code code = vm->compile(expr.c_str(), "", JSON_MODE); + _Code code = vm->compile(expr, "", JSON_MODE); return vm->_exec(code, vm->topFrame()->_module, vm->topFrame()->copy_f_locals()); }); diff --git a/plugins/godot/godot-cpp b/plugins/godot/godot-cpp index fb90950a..9766382d 160000 --- a/plugins/godot/godot-cpp +++ b/plugins/godot/godot-cpp @@ -1 +1 @@ -Subproject commit fb90950aa1d0967579661690fb17048fa93456cf +Subproject commit 9766382dcb2bdeace0d209b9bf2813cf62c88fb7 diff --git a/src/pocketpy.h b/src/pocketpy.h index 55589aa7..caac1e98 100644 --- a/src/pocketpy.h +++ b/src/pocketpy.h @@ -4,8 +4,8 @@ #include "compiler.h" #include "repl.h" -_Code VM::compile(const char* source, _Str filename, CompileMode mode) { - Compiler compiler(this, source, filename, mode); +_Code VM::compile(_Str source, _Str filename, CompileMode mode) { + Compiler compiler(this, source.c_str(), filename, mode); try{ return compiler.__fillCode(); }catch(_Error& e){ @@ -66,7 +66,7 @@ void __initializeBuiltinFunctions(VM* _vm) { _vm->bindBuiltinFunc("eval", [](VM* vm, const pkpy::ArgList& args) { vm->__checkArgSize(args, 1); const _Str& expr = vm->PyStr_AS_C(args[0]); - _Code code = vm->compile(expr.c_str(), "", EVAL_MODE); + _Code code = vm->compile(expr, "", EVAL_MODE); return vm->_exec(code, vm->topFrame()->_module, vm->topFrame()->copy_f_locals()); }); @@ -652,7 +652,7 @@ void __addModuleJson(VM* vm){ vm->bindFunc(mod, "loads", [](VM* vm, const pkpy::ArgList& args) { vm->__checkArgSize(args, 1); const _Str& expr = vm->PyStr_AS_C(args[0]); - _Code code = vm->compile(expr.c_str(), "", JSON_MODE); + _Code code = vm->compile(expr, "", JSON_MODE); return vm->_exec(code, vm->topFrame()->_module, vm->topFrame()->copy_f_locals()); }); diff --git a/src/repl.h b/src/repl.h index 1f33ab5d..92c1972a 100644 --- a/src/repl.h +++ b/src/repl.h @@ -54,13 +54,17 @@ __NOT_ENOUGH_LINES: } try{ - vm->execAsync(line.c_str(), "", SINGLE_MODE); - return EXEC_DONE; + // duplicated compile to catch NeedMoreLines + vm->compile(line, "", SINGLE_MODE); }catch(NeedMoreLines& ne){ buffer += line; buffer += '\n'; need_more_lines = ne.isClassDef ? 3 : 2; return NEED_MORE_LINES; + }catch(...){ + // do nothing } + vm->execAsync(line, "", SINGLE_MODE); + return EXEC_DONE; } }; \ No newline at end of file diff --git a/src/vm.h b/src/vm.h index 53d82d25..4dd04396 100644 --- a/src/vm.h +++ b/src/vm.h @@ -314,7 +314,7 @@ protected: _error("ImportError", "module '" + name + "' not found"); }else{ const _Str& source = it2->second; - _Code code = compile(source.c_str(), name, EXEC_MODE); + _Code code = compile(source, name, EXEC_MODE); PyVar _m = newModule(name); _exec(code, _m, {}); frame->push(_m); @@ -552,7 +552,7 @@ public: // repl mode is only for setting `frame->id` to 0 - virtual PyVarOrNull exec(const char* source, _Str filename, CompileMode mode, PyVar _module=nullptr){ + virtual PyVarOrNull exec(_Str source, _Str filename, CompileMode mode, PyVar _module=nullptr){ if(_module == nullptr) _module = _main; try { _Code code = compile(source, filename, mode); @@ -566,7 +566,7 @@ public: return nullptr; } - virtual void execAsync(const char* source, _Str filename, CompileMode mode) { + virtual void execAsync(_Str source, _Str filename, CompileMode mode) { exec(source, filename, mode); } @@ -636,7 +636,7 @@ public: return obj; } - void addLazyModule(_Str name, const char* source){ + void addLazyModule(_Str name, _Str source){ _lazyModules[name] = source; } @@ -957,7 +957,7 @@ public: } } - _Code compile(const char* source, _Str filename, CompileMode mode); + _Code compile(_Str source, _Str filename, CompileMode mode); }; /***** Pointers' Impl *****/ @@ -1147,7 +1147,7 @@ public: _state = THREAD_RUNNING; } - void execAsync(const char* source, _Str filename, CompileMode mode) override { + void execAsync(_Str source, _Str filename, CompileMode mode) override { if(_state != THREAD_READY) UNREACHABLE(); #ifdef __EMSCRIPTEN__ @@ -1164,7 +1164,7 @@ public: #endif } - PyVarOrNull exec(const char* source, _Str filename, CompileMode mode, PyVar _module=nullptr) override { + PyVarOrNull exec(_Str source, _Str filename, CompileMode mode, PyVar _module=nullptr) override { if(_state == THREAD_READY) return VM::exec(source, filename, mode, _module); auto callstackBackup = std::move(callstack); callstack.clear();