From 9f01810981efc2586f47b1a827e66469e569001c Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Mon, 6 Feb 2023 20:49:39 +0800 Subject: [PATCH] up --- plugins/flutter/example/lib/main.dart | 4 ++++ plugins/flutter/example/pubspec.lock | 2 +- plugins/flutter/lib/_ffi.dart | 1 - plugins/flutter/lib/no_web.dart | 2 +- plugins/flutter/pubspec.yaml | 2 +- plugins/flutter/src/pocketpy.h | 34 ++++++++++++++------------- plugins/godot/godot-cpp | 2 +- plugins/macos/pocketpy/pocketpy.h | 34 ++++++++++++++------------- src/pocketpy.h | 30 +++++++++++++---------- src/str.h | 4 ---- 10 files changed, 62 insertions(+), 53 deletions(-) diff --git a/plugins/flutter/example/lib/main.dart b/plugins/flutter/example/lib/main.dart index 42a42a3e..2cb338ff 100644 --- a/plugins/flutter/example/lib/main.dart +++ b/plugins/flutter/example/lib/main.dart @@ -32,6 +32,10 @@ class _MyAppState extends State { // create a REPL repl = pkpy.REPL(vm); + // create a binding + vm.bind("builtins", "add", (int x, int y) => x + y); + vm.bind("builtins", "test", (String x) => x.split(',').join('|')); + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { refresh(); }); diff --git a/plugins/flutter/example/pubspec.lock b/plugins/flutter/example/pubspec.lock index 6fa18319..05701c6e 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.8.0+1" + version: "0.8.1" sky_engine: dependency: transitive description: flutter diff --git a/plugins/flutter/lib/_ffi.dart b/plugins/flutter/lib/_ffi.dart index 35430819..81edf484 100644 --- a/plugins/flutter/lib/_ffi.dart +++ b/plugins/flutter/lib/_ffi.dart @@ -21,7 +21,6 @@ class StrWrapper { dynamic invoke_f_any(ffi.Pointer p) { String s = p.toDartString(); - malloc.free(p); var parts = s.split(' '); List args = []; for (int i = 1; i < parts.length; i++) { diff --git a/plugins/flutter/lib/no_web.dart b/plugins/flutter/lib/no_web.dart index 2e43ea3a..206eec4e 100644 --- a/plugins/flutter/lib/no_web.dart +++ b/plugins/flutter/lib/no_web.dart @@ -124,7 +124,7 @@ class VM { pointer, StrWrapper(mod).p, StrWrapper(name).p, t_code()); if (p == ffi.nullptr) throw Exception("vm.bind() failed"); String s = p.toDartString(); - malloc.free(p); + _Bindings.pkpy_delete(p); register(s, f); } } diff --git a/plugins/flutter/pubspec.yaml b/plugins/flutter/pubspec.yaml index 148cd8f0..2895b7f1 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. It supports Android/iOS/Web. -version: 0.8.0+2 +version: 0.8.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 6c3bd580..9284507c 100644 --- a/plugins/flutter/src/pocketpy.h +++ b/plugins/flutter/src/pocketpy.h @@ -2055,10 +2055,6 @@ public: return *this; } - operator const char*() const { - return c_str(); - } - ~_Str(){ if(_u8_index != nullptr) delete _u8_index; } @@ -6719,11 +6715,11 @@ extern "C" { return strdup(ss.str().c_str()); } - typedef i64 (*f_int_t)(const char*); - typedef f64 (*f_float_t)(const char*); - typedef bool (*f_bool_t)(const char*); - typedef const char* (*f_str_t)(const char*); - typedef void (*f_None_t)(const char*); + typedef i64 (*f_int_t)(char*); + typedef f64 (*f_float_t)(char*); + typedef bool (*f_bool_t)(char*); + typedef char* (*f_str_t)(char*); + typedef void (*f_None_t)(char*); static f_int_t f_int = nullptr; static f_float_t f_float = nullptr; @@ -6752,19 +6748,25 @@ extern "C" { PyVar obj = vm->new_module_if_not_existed(mod); vm->bindFunc<-1>(obj, name, [ret_code, f_header](VM* vm, const pkpy::Args& args){ _StrStream ss; - ss << f_header << ' '; + ss << f_header; for(int i=0; icall(args[i], __json__); ss << vm->PyStr_AS_C(x); - if(i != args.size() - 1) ss << ' '; } + char* packet = strdup(ss.str().c_str()); switch(ret_code){ - case 'i': return vm->PyInt(f_int(ss.str().c_str())); - case 'f': return vm->PyFloat(f_float(ss.str().c_str())); - case 'b': return vm->PyBool(f_bool(ss.str().c_str())); - case 's': return vm->PyStr(f_str(ss.str().c_str())); - case 'N': f_None(ss.str().c_str()); return vm->None; + case 'i': return vm->PyInt(f_int(packet)); + case 'f': return vm->PyFloat(f_float(packet)); + case 'b': return vm->PyBool(f_bool(packet)); + case 's': { + char* p = f_str(packet); + if(p == nullptr) return vm->None; + return vm->PyStr(p); // no need to free(p) + } + case 'N': f_None(packet); return vm->None; } + free(packet); UNREACHABLE(); return vm->None; }); diff --git a/plugins/godot/godot-cpp b/plugins/godot/godot-cpp index 3765c554..d9f2b2d3 160000 --- a/plugins/godot/godot-cpp +++ b/plugins/godot/godot-cpp @@ -1 +1 @@ -Subproject commit 3765c55407d883e12457e44981c87062c446b529 +Subproject commit d9f2b2d3e282cf420b360b12bb1a985f8cfb836c diff --git a/plugins/macos/pocketpy/pocketpy.h b/plugins/macos/pocketpy/pocketpy.h index 6c3bd580..9284507c 100644 --- a/plugins/macos/pocketpy/pocketpy.h +++ b/plugins/macos/pocketpy/pocketpy.h @@ -2055,10 +2055,6 @@ public: return *this; } - operator const char*() const { - return c_str(); - } - ~_Str(){ if(_u8_index != nullptr) delete _u8_index; } @@ -6719,11 +6715,11 @@ extern "C" { return strdup(ss.str().c_str()); } - typedef i64 (*f_int_t)(const char*); - typedef f64 (*f_float_t)(const char*); - typedef bool (*f_bool_t)(const char*); - typedef const char* (*f_str_t)(const char*); - typedef void (*f_None_t)(const char*); + typedef i64 (*f_int_t)(char*); + typedef f64 (*f_float_t)(char*); + typedef bool (*f_bool_t)(char*); + typedef char* (*f_str_t)(char*); + typedef void (*f_None_t)(char*); static f_int_t f_int = nullptr; static f_float_t f_float = nullptr; @@ -6752,19 +6748,25 @@ extern "C" { PyVar obj = vm->new_module_if_not_existed(mod); vm->bindFunc<-1>(obj, name, [ret_code, f_header](VM* vm, const pkpy::Args& args){ _StrStream ss; - ss << f_header << ' '; + ss << f_header; for(int i=0; icall(args[i], __json__); ss << vm->PyStr_AS_C(x); - if(i != args.size() - 1) ss << ' '; } + char* packet = strdup(ss.str().c_str()); switch(ret_code){ - case 'i': return vm->PyInt(f_int(ss.str().c_str())); - case 'f': return vm->PyFloat(f_float(ss.str().c_str())); - case 'b': return vm->PyBool(f_bool(ss.str().c_str())); - case 's': return vm->PyStr(f_str(ss.str().c_str())); - case 'N': f_None(ss.str().c_str()); return vm->None; + case 'i': return vm->PyInt(f_int(packet)); + case 'f': return vm->PyFloat(f_float(packet)); + case 'b': return vm->PyBool(f_bool(packet)); + case 's': { + char* p = f_str(packet); + if(p == nullptr) return vm->None; + return vm->PyStr(p); // no need to free(p) + } + case 'N': f_None(packet); return vm->None; } + free(packet); UNREACHABLE(); return vm->None; }); diff --git a/src/pocketpy.h b/src/pocketpy.h index c50c0aee..e41fbb1d 100644 --- a/src/pocketpy.h +++ b/src/pocketpy.h @@ -793,11 +793,11 @@ extern "C" { return strdup(ss.str().c_str()); } - typedef i64 (*f_int_t)(const char*); - typedef f64 (*f_float_t)(const char*); - typedef bool (*f_bool_t)(const char*); - typedef const char* (*f_str_t)(const char*); - typedef void (*f_None_t)(const char*); + typedef i64 (*f_int_t)(char*); + typedef f64 (*f_float_t)(char*); + typedef bool (*f_bool_t)(char*); + typedef char* (*f_str_t)(char*); + typedef void (*f_None_t)(char*); static f_int_t f_int = nullptr; static f_float_t f_float = nullptr; @@ -826,19 +826,25 @@ extern "C" { PyVar obj = vm->new_module_if_not_existed(mod); vm->bindFunc<-1>(obj, name, [ret_code, f_header](VM* vm, const pkpy::Args& args){ _StrStream ss; - ss << f_header << ' '; + ss << f_header; for(int i=0; icall(args[i], __json__); ss << vm->PyStr_AS_C(x); - if(i != args.size() - 1) ss << ' '; } + char* packet = strdup(ss.str().c_str()); switch(ret_code){ - case 'i': return vm->PyInt(f_int(ss.str().c_str())); - case 'f': return vm->PyFloat(f_float(ss.str().c_str())); - case 'b': return vm->PyBool(f_bool(ss.str().c_str())); - case 's': return vm->PyStr(f_str(ss.str().c_str())); - case 'N': f_None(ss.str().c_str()); return vm->None; + case 'i': return vm->PyInt(f_int(packet)); + case 'f': return vm->PyFloat(f_float(packet)); + case 'b': return vm->PyBool(f_bool(packet)); + case 's': { + char* p = f_str(packet); + if(p == nullptr) return vm->None; + return vm->PyStr(p); // no need to free(p) + } + case 'N': f_None(packet); return vm->None; } + free(packet); UNREACHABLE(); return vm->None; }); diff --git a/src/str.h b/src/str.h index 668fc5e2..0671057d 100644 --- a/src/str.h +++ b/src/str.h @@ -133,10 +133,6 @@ public: return *this; } - operator const char*() const { - return c_str(); - } - ~_Str(){ if(_u8_index != nullptr) delete _u8_index; }