blueloveTH %!s(int64=3) %!d(string=hai) anos
pai
achega
9f01810981

+ 4 - 0
plugins/flutter/example/lib/main.dart

@@ -32,6 +32,10 @@ class _MyAppState extends State<MyApp> {
     // create a REPL
     repl = pkpy.REPL(vm);
 
+    // create a binding
+    vm.bind<int>("builtins", "add", (int x, int y) => x + y);
+    vm.bind<String>("builtins", "test", (String x) => x.split(',').join('|'));
+
     WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
       refresh();
     });

+ 1 - 1
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

+ 0 - 1
plugins/flutter/lib/_ffi.dart

@@ -21,7 +21,6 @@ class StrWrapper {
 
 dynamic invoke_f_any(ffi.Pointer<Utf8> p) {
   String s = p.toDartString();
-  malloc.free(p);
   var parts = s.split(' ');
   List<dynamic> args = [];
   for (int i = 1; i < parts.length; i++) {

+ 1 - 1
plugins/flutter/lib/no_web.dart

@@ -124,7 +124,7 @@ class VM {
         pointer, StrWrapper(mod).p, StrWrapper(name).p, t_code<T>());
     if (p == ffi.nullptr) throw Exception("vm.bind() failed");
     String s = p.toDartString();
-    malloc.free(p);
+    _Bindings.pkpy_delete(p);
     register(s, f);
   }
 }

+ 1 - 1
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
 

+ 18 - 16
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; i<args.size(); i++){
+                ss << ' ';
                 PyVar x = vm->call(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;
         });

+ 1 - 1
plugins/godot/godot-cpp

@@ -1 +1 @@
-Subproject commit 3765c55407d883e12457e44981c87062c446b529
+Subproject commit d9f2b2d3e282cf420b360b12bb1a985f8cfb836c

+ 18 - 16
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; i<args.size(); i++){
+                ss << ' ';
                 PyVar x = vm->call(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;
         });

+ 18 - 12
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; i<args.size(); i++){
+                ss << ' ';
                 PyVar x = vm->call(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;
         });

+ 0 - 4
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;
     }