From 35aca12e5046588c85b1bc9d54b782e70e1ee677 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Mon, 5 Dec 2022 23:16:04 +0800 Subject: [PATCH] up Update CHANGELOG.md --- plugins/flutter/CHANGELOG.md | 2 +- plugins/flutter/README.md | 2 +- plugins/flutter/lib/jsonrpc.dart | 13 ++++++---- plugins/flutter/lib/pocketpy.dart | 42 +++++++++++++++---------------- plugins/flutter/pubspec.yaml | 2 +- 5 files changed, 32 insertions(+), 29 deletions(-) diff --git a/plugins/flutter/CHANGELOG.md b/plugins/flutter/CHANGELOG.md index bb0d193c..1f7d9ff3 100644 --- a/plugins/flutter/CHANGELOG.md +++ b/plugins/flutter/CHANGELOG.md @@ -1,3 +1,3 @@ -## 0.4.7 +## 0.4.7+1 The initial version. Hello, world! diff --git a/plugins/flutter/README.md b/plugins/flutter/README.md index c3ebd594..93c9789b 100644 --- a/plugins/flutter/README.md +++ b/plugins/flutter/README.md @@ -2,7 +2,7 @@ PocketPy is a lightweight Python interpreter for game engines. -![logo](https://pocketpy.dev/static/logo_flat.png) +![](https://pocketpy.dev/static/logo_flat.png) ## Features diff --git a/plugins/flutter/lib/jsonrpc.dart b/plugins/flutter/lib/jsonrpc.dart index 8d8e3207..a2e57f8c 100644 --- a/plugins/flutter/lib/jsonrpc.dart +++ b/plugins/flutter/lib/jsonrpc.dart @@ -6,10 +6,10 @@ import 'dart:io'; import 'package:pocketpy/pocketpy.dart'; -class JsonRpcError { +class _JsonRpcError { final Map payload = {}; - JsonRpcError(int code, String message, {dynamic data}) { + _JsonRpcError(int code, String message, {dynamic data}) { payload['code'] = code; payload['message'] = message; if (data != null) { @@ -33,6 +33,7 @@ class JsonRpcServer { registerOS(this); } + /// Register a JSONRPC handler. void register(String name, FutureOr Function(List) method) { _methods[name] = method; } @@ -43,14 +44,15 @@ class JsonRpcServer { if (json == null) throw Exception("JSONRPC request is null"); var request = jsonDecode(json); var f = _methods[request['method']]; - if (f == null) throw JsonRpcError(-32601, "Method not found"); + if (f == null) throw _JsonRpcError(-32601, "Method not found"); try { return f(request['params'] as List); } catch (e) { - throw JsonRpcError(-32000, e.toString()); + throw _JsonRpcError(-32000, e.toString()); } } + /// Dispatch a JSONRPC request. FutureOr dispatch(ThreadedVM vm) async { onPreDispatch?.call(); try { @@ -58,12 +60,13 @@ class JsonRpcServer { if (ret is Future) ret = await ret; vm.write_jsonrpc_response(jsonEncode({"result": ret})); onPostDispatch?.call(); - } on JsonRpcError catch (e) { + } on _JsonRpcError catch (e) { vm.write_jsonrpc_response(jsonEncode({"error": e.payload})); return; } } + /// Attach the JsonRpcServer into a ThreadedVM. Once the ThreadedVM encounters JSONRPC request, it takes care of it automatically. This process will be stopped when the whole execution is done. Future attach(ThreadedVM vm, {Duration? spinFreq = const Duration(milliseconds: 20)}) async { while (vm.state.index <= ThreadState.running.index) { diff --git a/plugins/flutter/lib/pocketpy.dart b/plugins/flutter/lib/pocketpy.dart index 29608ed9..b364d425 100644 --- a/plugins/flutter/lib/pocketpy.dart +++ b/plugins/flutter/lib/pocketpy.dart @@ -7,7 +7,7 @@ import 'package:ffi/ffi.dart'; export 'jsonrpc.dart'; -class Bindings +class _Bindings { static ffi.DynamicLibrary _load() { String _libName = "pocketpy"; @@ -53,11 +53,11 @@ class PyOutput { : stdout = json['stdout'], stderr = json['stderr']; } -class Str { +class _Str { static final Finalizer> finalizer = Finalizer((p) => calloc.free(p)); late final ffi.Pointer _p; - Str(String s) { + _Str(String s) { _p = s.toNativeUtf8(); finalizer.attach(this, _p); } @@ -70,35 +70,35 @@ class VM { VM() { if (this is ThreadedVM) { - pointer = Bindings.pkpy_new_tvm(false); + pointer = _Bindings.pkpy_new_tvm(false); } else { - pointer = Bindings.pkpy_new_vm(false); + pointer = _Bindings.pkpy_new_vm(false); } } void dispose() { - Bindings.pkpy_delete(pointer); + _Bindings.pkpy_delete(pointer); } PyOutput read_output() { - var _o = Bindings.pkpy_vm_read_output(pointer); + var _o = _Bindings.pkpy_vm_read_output(pointer); String _j = _o.toDartString(); var ret = PyOutput.fromJson(cvt.jsonDecode(_j)); - Bindings.pkpy_delete(_o); + _Bindings.pkpy_delete(_o); return ret; } /// Add a source module into a virtual machine. Return `true` if there is no complie error. bool add_module(String name, String source) { - var ret = Bindings.pkpy_vm_add_module(pointer, Str(name).p, Str(source).p); + var ret = _Bindings.pkpy_vm_add_module(pointer, _Str(name).p, _Str(source).p); return ret; } /// Evaluate an expression. Return a json representing the result. If there is any error, return `nullptr`. String? eval(String source) { - var ret = Bindings.pkpy_vm_eval(pointer, Str(source).p); + var ret = _Bindings.pkpy_vm_eval(pointer, _Str(source).p); if (ret == ffi.nullptr) return null; String s = ret.toDartString(); calloc.free(ret); @@ -108,14 +108,14 @@ class VM { /// Run a given source on a virtual machine. Return `true` if there is no compile error. bool exec(String source) { - var ret = Bindings.pkpy_vm_exec(pointer, Str(source).p); + var ret = _Bindings.pkpy_vm_exec(pointer, _Str(source).p); return ret; } /// Get a global variable of a virtual machine. Return a json representing the result. If the variable is not found, return `nullptr`. String? get_global(String name) { - var ret = Bindings.pkpy_vm_get_global(pointer, Str(name).p); + var ret = _Bindings.pkpy_vm_get_global(pointer, _Str(name).p); if (ret == ffi.nullptr) return null; String s = ret.toDartString(); calloc.free(ret); @@ -127,19 +127,19 @@ class VM { enum ThreadState { ready, running, suspended, finished } class ThreadedVM extends VM { - ThreadState get state => ThreadState.values[Bindings.pkpy_tvm_get_state(pointer)]; + ThreadState get state => ThreadState.values[_Bindings.pkpy_tvm_get_state(pointer)]; /// Run a given source on a threaded virtual machine. The excution will be started in a new thread. Return `true` if there is no compile error. bool exec_async(String source) { - var ret = Bindings.pkpy_tvm_exec_async(pointer, Str(source).p); + var ret = _Bindings.pkpy_tvm_exec_async(pointer, _Str(source).p); return ret; } /// Read the current JSONRPC request from shared string buffer. String? read_jsonrpc_request() { - var ret = Bindings.pkpy_tvm_read_jsonrpc_request(pointer); + var ret = _Bindings.pkpy_tvm_read_jsonrpc_request(pointer); if (ret == ffi.nullptr) return null; String s = ret.toDartString(); calloc.free(ret); @@ -149,19 +149,19 @@ class ThreadedVM extends VM { /// Set the state of a threaded virtual machine to `THREAD_READY`. The current state should be `THREAD_FINISHED`. void reset_state() { - Bindings.pkpy_tvm_reset_state(pointer); + _Bindings.pkpy_tvm_reset_state(pointer); } /// Emit a KeyboardInterrupt signal to stop a running threaded virtual machine. void terminate() { - Bindings.pkpy_tvm_terminate(pointer); + _Bindings.pkpy_tvm_terminate(pointer); } /// Write a JSONRPC response to shared string buffer. void write_jsonrpc_response(String value) { - Bindings.pkpy_tvm_write_jsonrpc_response(pointer, Str(value).p); + _Bindings.pkpy_tvm_write_jsonrpc_response(pointer, _Str(value).p); } } @@ -170,17 +170,17 @@ class REPL { late final ffi.Pointer pointer; REPL(VM vm) { - pointer = Bindings.pkpy_new_repl(vm.pointer); + pointer = _Bindings.pkpy_new_repl(vm.pointer); } void dispose() { - Bindings.pkpy_delete(pointer); + _Bindings.pkpy_delete(pointer); } /// Input a source line to an interactive console. Return `0` if need more lines, `1` if execution happened, `2` if execution skipped (compile error or empty input). int input(String line) { - var ret = Bindings.pkpy_repl_input(pointer, Str(line).p); + var ret = _Bindings.pkpy_repl_input(pointer, _Str(line).p); return ret; } diff --git a/plugins/flutter/pubspec.yaml b/plugins/flutter/pubspec.yaml index cbd60930..16d927a2 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.4.7 +version: 0.4.7+1 homepage: https://pocketpy.dev repository: https://github.com/blueloveth/pocketpy