diff --git a/build_wasm.sh b/build_wasm.sh index 9d5e1026..b301fb0a 100644 --- a/build_wasm.sh +++ b/build_wasm.sh @@ -1,3 +1,3 @@ rm -rf web/lib/ mkdir -p web/lib/ -em++ src/main.cpp -fno-rtti -fexceptions -O3 -sEXPORTED_FUNCTIONS=_pkpy_delete,_pkpy_new_repl,_pkpy_repl_input,_pkpy_new_tvm,_pkpy_tvm_exec_async,_pkpy_tvm_get_state,_pkpy_tvm_read_jsonrpc_request,_pkpy_tvm_reset_state,_pkpy_tvm_terminate,_pkpy_tvm_write_jsonrpc_response,_pkpy_new_vm,_pkpy_vm_add_module,_pkpy_vm_eval,_pkpy_vm_exec,_pkpy_vm_get_global,_pkpy_vm_read_output -sASYNCIFY -sEXPORTED_RUNTIME_METHODS=ccall -sASYNCIFY_IMPORTS=pkpy_tvm_exec_async -o web/lib/pocketpy.js \ No newline at end of file +em++ src/main.cpp -fno-rtti -fexceptions -sASYNCIFY_STACK_SIZE=131072 -O0 -sEXPORTED_FUNCTIONS=_pkpy_delete,_pkpy_new_repl,_pkpy_repl_input,_pkpy_new_tvm,_pkpy_tvm_exec_async,_pkpy_tvm_get_state,_pkpy_tvm_read_jsonrpc_request,_pkpy_tvm_reset_state,_pkpy_tvm_terminate,_pkpy_tvm_write_jsonrpc_response,_pkpy_new_vm,_pkpy_vm_add_module,_pkpy_vm_eval,_pkpy_vm_exec,_pkpy_vm_get_global,_pkpy_vm_read_output -sASYNCIFY -sEXPORTED_RUNTIME_METHODS=ccall -sASYNCIFY_IMPORTS=pkpy_tvm_exec_async,pkpy_repl_input -o web/lib/pocketpy.js \ No newline at end of file diff --git a/plugins/flutter/CHANGELOG.md b/plugins/flutter/CHANGELOG.md index 83f6c305..db502947 100644 --- a/plugins/flutter/CHANGELOG.md +++ b/plugins/flutter/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.6.0+4 +## 0.6.1+1 + Break change diff --git a/plugins/flutter/example/pubspec.lock b/plugins/flutter/example/pubspec.lock index 5c0cda11..8dd1df6b 100644 --- a/plugins/flutter/example/pubspec.lock +++ b/plugins/flutter/example/pubspec.lock @@ -108,7 +108,7 @@ packages: path: ".." relative: true source: path - version: "0.5.2+1" + version: "0.6.1+1" sky_engine: dependency: transitive description: flutter diff --git a/plugins/flutter/lib/web.dart b/plugins/flutter/lib/web.dart index 5cc14c64..ddb94807 100644 --- a/plugins/flutter/lib/web.dart +++ b/plugins/flutter/lib/web.dart @@ -3,28 +3,35 @@ import 'dart:convert' as cvt; import 'package:js/js.dart'; import 'common.dart'; +@JS() +@anonymous +class Opt { + external bool get async; + external factory Opt({bool async}); +} + @JS("Module.ccall") -external dynamic ccall(String name, String? returnType, List argTypes, List args); +external dynamic ccall(String name, String? returnType, List argTypes, List args, Opt opt); class _Bindings { - static final pkpy_delete = (dynamic p) => ccall("pkpy_delete", null, ["number"], [p]); - static final pkpy_new_repl = (dynamic vm) => ccall("pkpy_new_repl", "number", ["number"], [vm]); - static final pkpy_repl_input = (dynamic r, String line) => ccall("pkpy_repl_input", null, ["number", "string"], [r, line]); - static final pkpy_repl_last_input_result = (dynamic r) => ccall("pkpy_repl_last_input_result", "number", ["number"], [r]); - static final pkpy_new_tvm = (bool use_stdio) => ccall("pkpy_new_tvm", "number", ["boolean"], [use_stdio]); - static final pkpy_tvm_exec_async = (dynamic vm, String source) => ccall("pkpy_tvm_exec_async", null, ["number", "string"], [vm, source]); - static final pkpy_tvm_get_state = (dynamic vm) => ccall("pkpy_tvm_get_state", "number", ["number"], [vm]); - static final pkpy_tvm_read_jsonrpc_request = (dynamic vm) => ccall("pkpy_tvm_read_jsonrpc_request", "string", ["number"], [vm]); - static final pkpy_tvm_reset_state = (dynamic vm) => ccall("pkpy_tvm_reset_state", null, ["number"], [vm]); - static final pkpy_tvm_terminate = (dynamic vm) => ccall("pkpy_tvm_terminate", null, ["number"], [vm]); - static final pkpy_tvm_write_jsonrpc_response = (dynamic vm, String value) => ccall("pkpy_tvm_write_jsonrpc_response", null, ["number", "string"], [vm, value]); - static final pkpy_new_vm = (bool use_stdio) => ccall("pkpy_new_vm", "number", ["boolean"], [use_stdio]); - static final pkpy_vm_add_module = (dynamic vm, String name, String source) => ccall("pkpy_vm_add_module", null, ["number", "string", "string"], [vm, name, source]); - static final pkpy_vm_eval = (dynamic vm, String source) => ccall("pkpy_vm_eval", "string", ["number", "string"], [vm, source]); - static final pkpy_vm_exec = (dynamic vm, String source) => ccall("pkpy_vm_exec", null, ["number", "string"], [vm, source]); - static final pkpy_vm_get_global = (dynamic vm, String name) => ccall("pkpy_vm_get_global", "string", ["number", "string"], [vm, name]); - static final pkpy_vm_read_output = (dynamic vm) => ccall("pkpy_vm_read_output", "string", ["number"], [vm]); + static final pkpy_delete = (dynamic p) => ccall("pkpy_delete", null, ["number"], [p], Opt(async: false)); + static final pkpy_new_repl = (dynamic vm) => ccall("pkpy_new_repl", "number", ["number"], [vm], Opt(async: false)); + static final pkpy_repl_input = (dynamic r, String line) => ccall("pkpy_repl_input", null, ["number", "string"], [r, line], Opt(async: true)); + static final pkpy_repl_last_input_result = (dynamic r) => ccall("pkpy_repl_last_input_result", "number", ["number"], [r], Opt(async: false)); + static final pkpy_new_tvm = (bool use_stdio) => ccall("pkpy_new_tvm", "number", ["boolean"], [use_stdio], Opt(async: false)); + static final pkpy_tvm_exec_async = (dynamic vm, String source) => ccall("pkpy_tvm_exec_async", null, ["number", "string"], [vm, source], Opt(async: true)); + static final pkpy_tvm_get_state = (dynamic vm) => ccall("pkpy_tvm_get_state", "number", ["number"], [vm], Opt(async: false)); + static final pkpy_tvm_read_jsonrpc_request = (dynamic vm) => ccall("pkpy_tvm_read_jsonrpc_request", "string", ["number"], [vm], Opt(async: false)); + static final pkpy_tvm_reset_state = (dynamic vm) => ccall("pkpy_tvm_reset_state", null, ["number"], [vm], Opt(async: false)); + static final pkpy_tvm_terminate = (dynamic vm) => ccall("pkpy_tvm_terminate", null, ["number"], [vm], Opt(async: false)); + static final pkpy_tvm_write_jsonrpc_response = (dynamic vm, String value) => ccall("pkpy_tvm_write_jsonrpc_response", null, ["number", "string"], [vm, value], Opt(async: false)); + static final pkpy_new_vm = (bool use_stdio) => ccall("pkpy_new_vm", "number", ["boolean"], [use_stdio], Opt(async: false)); + static final pkpy_vm_add_module = (dynamic vm, String name, String source) => ccall("pkpy_vm_add_module", null, ["number", "string", "string"], [vm, name, source], Opt(async: false)); + static final pkpy_vm_eval = (dynamic vm, String source) => ccall("pkpy_vm_eval", "string", ["number", "string"], [vm, source], Opt(async: false)); + static final pkpy_vm_exec = (dynamic vm, String source) => ccall("pkpy_vm_exec", null, ["number", "string"], [vm, source], Opt(async: false)); + static final pkpy_vm_get_global = (dynamic vm, String name) => ccall("pkpy_vm_get_global", "string", ["number", "string"], [vm, name], Opt(async: false)); + static final pkpy_vm_read_output = (dynamic vm) => ccall("pkpy_vm_read_output", "string", ["number"], [vm], Opt(async: false)); } class VM { diff --git a/plugins/flutter/pubspec.yaml b/plugins/flutter/pubspec.yaml index f10e662f..73390323 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+4 +version: 0.6.1+1 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 09aea6ad..a0ca7a51 100644 --- a/plugins/flutter/src/pocketpy.h +++ b/plugins/flutter/src/pocketpy.h @@ -1837,7 +1837,7 @@ private: #include #endif -#define PK_VERSION "0.6.0" +#define PK_VERSION "0.6.1" //#define PKPY_NO_TYPE_CHECK //#define PKPY_NO_INDEX_CHECK @@ -5005,7 +5005,9 @@ class ThreadedVM : public VM { } } #else - void __deleteThread(){} + void __deleteThread(){ + terminate(); + } #endif public: @@ -5024,7 +5026,13 @@ public: void terminate(){ if(_state == THREAD_RUNNING || _state == THREAD_SUSPENDED){ keyboardInterrupt(); - while(_state != THREAD_FINISHED); + while(_state != THREAD_FINISHED) { +#ifdef __EMSCRIPTEN__ + emscripten_sleep(20); +#else + std::this_thread::sleep_for(std::chrono::milliseconds(20)); +#endif + } } } diff --git a/plugins/godot/godot-cpp b/plugins/godot/godot-cpp index 484bb4f2..3b6f3c85 160000 --- a/plugins/godot/godot-cpp +++ b/plugins/godot/godot-cpp @@ -1 +1 @@ -Subproject commit 484bb4f281a60bda5ccb121b753b05fa4deead60 +Subproject commit 3b6f3c85037a67fe1f8817ffa40532b3c1ecc728 diff --git a/src/__stl__.h b/src/__stl__.h index 7634cfb4..34276032 100644 --- a/src/__stl__.h +++ b/src/__stl__.h @@ -37,7 +37,7 @@ #include #endif -#define PK_VERSION "0.6.0" +#define PK_VERSION "0.6.1" //#define PKPY_NO_TYPE_CHECK //#define PKPY_NO_INDEX_CHECK \ No newline at end of file diff --git a/src/vm.h b/src/vm.h index aca0071f..b8fb5db3 100644 --- a/src/vm.h +++ b/src/vm.h @@ -1099,7 +1099,9 @@ class ThreadedVM : public VM { } } #else - void __deleteThread(){} + void __deleteThread(){ + terminate(); + } #endif public: @@ -1118,7 +1120,13 @@ public: void terminate(){ if(_state == THREAD_RUNNING || _state == THREAD_SUSPENDED){ keyboardInterrupt(); - while(_state != THREAD_FINISHED); + while(_state != THREAD_FINISHED) { +#ifdef __EMSCRIPTEN__ + emscripten_sleep(20); +#else + std::this_thread::sleep_for(std::chrono::milliseconds(20)); +#endif + } } }