浏览代码

fix a bug

blueloveTH 1 年之前
父节点
当前提交
7e06cc2e96
共有 4 个文件被更改,包括 20 次插入17 次删除
  1. 5 5
      include/pocketpy/bindings.h
  2. 1 0
      scripts/run_tests.py
  3. 10 10
      src/cffi.cpp
  4. 4 2
      src/compiler.cpp

+ 5 - 5
include/pocketpy/bindings.h

@@ -46,7 +46,7 @@ struct NativeProxyMethodC final: NativeProxyFuncCBase {
 
 
     template<typename __Ret, size_t... Is>
     template<typename __Ret, size_t... Is>
     PyVar call(VM* vm, ArgsView args, std::index_sequence<Is...>){
     PyVar call(VM* vm, ArgsView args, std::index_sequence<Is...>){
-        T& self = PK_OBJ_GET(T, args[0]);   // use unsafe cast for derived classes
+        obj_get_t<T> self = PK_OBJ_GET(T, args[0]);   // use unsafe cast for derived classes
         if constexpr(std::is_void_v<__Ret>){
         if constexpr(std::is_void_v<__Ret>){
             (self.*func)(py_cast<Params>(vm, args[Is+1])...);
             (self.*func)(py_cast<Params>(vm, args[Is+1])...);
             return vm->None;
             return vm->None;
@@ -93,7 +93,7 @@ PyVar VM::bind_field(PyVar obj, const char* name, F T::*field){
     std::string_view name_sv(name); int pos = name_sv.find(':');
     std::string_view name_sv(name); int pos = name_sv.find(':');
     if(pos > 0) name_sv = name_sv.substr(0, pos);
     if(pos > 0) name_sv = name_sv.substr(0, pos);
     auto fget = [](VM* vm, ArgsView args) -> PyVar{
     auto fget = [](VM* vm, ArgsView args) -> PyVar{
-        T& self = PK_OBJ_GET(T, args[0]);
+        obj_get_t<T> self = PK_OBJ_GET(T, args[0]);
         F T::*field = lambda_get_userdata<F T::*>(args.begin());
         F T::*field = lambda_get_userdata<F T::*>(args.begin());
         return VAR(self.*field);
         return VAR(self.*field);
     };
     };
@@ -101,7 +101,7 @@ PyVar VM::bind_field(PyVar obj, const char* name, F T::*field){
     PyVar _1 = vm->None;
     PyVar _1 = vm->None;
     if constexpr (!ReadOnly){
     if constexpr (!ReadOnly){
         auto fset = [](VM* vm, ArgsView args){
         auto fset = [](VM* vm, ArgsView args){
-            T& self = PK_OBJ_GET(T, args[0]);
+            obj_get_t<T> self = PK_OBJ_GET(T, args[0]);
             F T::*field = lambda_get_userdata<F T::*>(args.begin());
             F T::*field = lambda_get_userdata<F T::*>(args.begin());
             self.*field = py_cast<F>(vm, args[1]);
             self.*field = py_cast<F>(vm, args[1]);
             return vm->None;
             return vm->None;
@@ -198,13 +198,13 @@ template<typename Ret, typename T, typename... Params>
 
 
 #define PY_POINTER_SETGETITEM(T) \
 #define PY_POINTER_SETGETITEM(T) \
         vm->bind__getitem__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar _0, PyVar _1){     \
         vm->bind__getitem__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar _0, PyVar _1){     \
-            VoidP& self = PK_OBJ_GET(VoidP, _0);                                        \
+            obj_get_t<VoidP> self = PK_OBJ_GET(VoidP, _0);                                        \
             i64 i = CAST(i64, _1);                                                      \
             i64 i = CAST(i64, _1);                                                      \
             T* tgt = reinterpret_cast<T*>(self.ptr);                                    \
             T* tgt = reinterpret_cast<T*>(self.ptr);                                    \
             return VAR(tgt[i]);                                                         \
             return VAR(tgt[i]);                                                         \
         });                                                                             \
         });                                                                             \
         vm->bind__setitem__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar _0, PyVar _1, PyVar _2){   \
         vm->bind__setitem__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar _0, PyVar _1, PyVar _2){   \
-            VoidP& self = PK_OBJ_GET(VoidP, _0);                                                \
+            obj_get_t<VoidP> self = PK_OBJ_GET(VoidP, _0);                                                \
             i64 i = CAST(i64, _1);                                                              \
             i64 i = CAST(i64, _1);                                                              \
             T* tgt = reinterpret_cast<T*>(self.ptr);                                            \
             T* tgt = reinterpret_cast<T*>(self.ptr);                                            \
             tgt[i] = CAST(T, _2);                                                               \
             tgt[i] = CAST(T, _2);                                                               \

+ 1 - 0
scripts/run_tests.py

@@ -65,6 +65,7 @@ class A:
         return self.x
         return self.x
 
 
 
 
+
 print('ans_1:', add(1, 2))
 print('ans_1:', add(1, 2))
 print('ans_2:', A('abc').get())
 print('ans_2:', A('abc').get())
 exit()
 exit()

+ 10 - 10
src/cffi.cpp

@@ -10,12 +10,12 @@ namespace pkpy{
         });
         });
 
 
         vm->bind__hash__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar obj){
         vm->bind__hash__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar obj){
-            VoidP& self = PK_OBJ_GET(VoidP, obj);
+            obj_get_t<VoidP> self = PK_OBJ_GET(VoidP, obj);
             return reinterpret_cast<i64>(self.ptr);
             return reinterpret_cast<i64>(self.ptr);
         });
         });
 
 
         vm->bind__repr__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar obj) -> Str{
         vm->bind__repr__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar obj) -> Str{
-            VoidP& self = PK_OBJ_GET(VoidP, obj);
+            obj_get_t<VoidP> self = PK_OBJ_GET(VoidP, obj);
             return _S("<void* at ", self.hex(), ">");
             return _S("<void* at ", self.hex(), ">");
         });
         });
 
 
@@ -199,37 +199,37 @@ void add_module_c(VM* vm){
     mod->attr().set(CNAME "_p", type);                                  \
     mod->attr().set(CNAME "_p", type);                                  \
     type_t = PK_OBJ_GET(Type, type);                                    \
     type_t = PK_OBJ_GET(Type, type);                                    \
     vm->bind_func(type, "read", 1, [](VM* vm, ArgsView args){         \
     vm->bind_func(type, "read", 1, [](VM* vm, ArgsView args){         \
-        VoidP& voidp = PK_OBJ_GET(VoidP, args[0]);                      \
+        obj_get_t<VoidP> voidp = PK_OBJ_GET(VoidP, args[0]);                      \
         T* target = (T*)voidp.ptr;                                      \
         T* target = (T*)voidp.ptr;                                      \
         return VAR(*target);                                            \
         return VAR(*target);                                            \
     });                                                                 \
     });                                                                 \
     vm->bind_func(type, "write", 2, [](VM* vm, ArgsView args){        \
     vm->bind_func(type, "write", 2, [](VM* vm, ArgsView args){        \
-        VoidP& voidp = PK_OBJ_GET(VoidP, args[0]);                      \
+        obj_get_t<VoidP> voidp = PK_OBJ_GET(VoidP, args[0]);                      \
         T val = CAST(T, args[1]);                                       \
         T val = CAST(T, args[1]);                                       \
         T* target = (T*)voidp.ptr;                                      \
         T* target = (T*)voidp.ptr;                                      \
         *target = val;                                                  \
         *target = val;                                                  \
         return vm->None;                                                \
         return vm->None;                                                \
     });                                                                 \
     });                                                                 \
     vm->bind__getitem__(type_t, [](VM* vm, PyVar obj, PyVar index){  \
     vm->bind__getitem__(type_t, [](VM* vm, PyVar obj, PyVar index){  \
-        VoidP& voidp = PK_OBJ_GET(VoidP, obj);                               \
+        obj_get_t<VoidP> voidp = PK_OBJ_GET(VoidP, obj);                               \
         i64 offset = CAST(i64, index);                                  \
         i64 offset = CAST(i64, index);                                  \
         T* target = (T*)voidp.ptr;                                      \
         T* target = (T*)voidp.ptr;                                      \
         return VAR(target[offset]);                                     \
         return VAR(target[offset]);                                     \
     });                                                                 \
     });                                                                 \
     vm->bind__setitem__(type_t, [](VM* vm, PyVar obj, PyVar index, PyVar value){   \
     vm->bind__setitem__(type_t, [](VM* vm, PyVar obj, PyVar index, PyVar value){   \
-        VoidP& voidp = PK_OBJ_GET(VoidP, obj);                          \
+        obj_get_t<VoidP> voidp = PK_OBJ_GET(VoidP, obj);                          \
         i64 offset = CAST(i64, index);                                  \
         i64 offset = CAST(i64, index);                                  \
         T* target = (T*)voidp.ptr;                                      \
         T* target = (T*)voidp.ptr;                                      \
         target[offset] = CAST(T, value);                                \
         target[offset] = CAST(T, value);                                \
     });                                                                 \
     });                                                                 \
     vm->bind__add__(type_t, [](VM* vm, PyVar lhs, PyVar rhs){   \
     vm->bind__add__(type_t, [](VM* vm, PyVar lhs, PyVar rhs){   \
-        VoidP& voidp = PK_OBJ_GET(VoidP, lhs);                          \
+        obj_get_t<VoidP> voidp = PK_OBJ_GET(VoidP, lhs);                          \
         i64 offset = CAST(i64, rhs);                                    \
         i64 offset = CAST(i64, rhs);                                    \
         T* target = (T*)voidp.ptr;                                      \
         T* target = (T*)voidp.ptr;                                      \
         return vm->new_object<VoidP>(lhs.type, target + offset);        \
         return vm->new_object<VoidP>(lhs.type, target + offset);        \
     });                                                                 \
     });                                                                 \
     vm->bind__sub__(type_t, [](VM* vm, PyVar lhs, PyVar rhs){   \
     vm->bind__sub__(type_t, [](VM* vm, PyVar lhs, PyVar rhs){   \
-        VoidP& voidp = PK_OBJ_GET(VoidP, lhs);                          \
+        obj_get_t<VoidP> voidp = PK_OBJ_GET(VoidP, lhs);                          \
         i64 offset = CAST(i64, rhs);                                    \
         i64 offset = CAST(i64, rhs);                                    \
         T* target = (T*)voidp.ptr;                                      \
         T* target = (T*)voidp.ptr;                                      \
         return vm->new_object<VoidP>(lhs.type, target - offset);        \
         return vm->new_object<VoidP>(lhs.type, target - offset);        \
@@ -257,13 +257,13 @@ void add_module_c(VM* vm){
 
 
     PyVar char_p_t = mod->attr("char_p");
     PyVar char_p_t = mod->attr("char_p");
     vm->bind(char_p_t, "read_string(self) -> str", [](VM* vm, ArgsView args){
     vm->bind(char_p_t, "read_string(self) -> str", [](VM* vm, ArgsView args){
-        VoidP& voidp = PK_OBJ_GET(VoidP, args[0]);
+        obj_get_t<VoidP> voidp = PK_OBJ_GET(VoidP, args[0]);
         const char* target = (const char*)voidp.ptr;
         const char* target = (const char*)voidp.ptr;
         return VAR(target);
         return VAR(target);
     });
     });
 
 
     vm->bind(char_p_t, "write_string(self, value: str)", [](VM* vm, ArgsView args){
     vm->bind(char_p_t, "write_string(self, value: str)", [](VM* vm, ArgsView args){
-        VoidP& voidp = PK_OBJ_GET(VoidP, args[0]);
+        obj_get_t<VoidP> voidp = PK_OBJ_GET(VoidP, args[0]);
         std::string_view sv = CAST(Str&, args[1]).sv();
         std::string_view sv = CAST(Str&, args[1]).sv();
         char* target = (char*)voidp.ptr;
         char* target = (char*)voidp.ptr;
         memcpy(target, sv.data(), sv.size());
         memcpy(target, sv.data(), sv.size());

+ 4 - 2
src/compiler.cpp

@@ -1325,7 +1325,9 @@ __EAT_DOTS_END:
             switch(type){
             switch(type){
                 case 'I': t.value = deserializer.read_uint('\n'); break;
                 case 'I': t.value = deserializer.read_uint('\n'); break;
                 case 'F': t.value = deserializer.read_float('\n'); break;
                 case 'F': t.value = deserializer.read_float('\n'); break;
-                case 'S': t.value = deserializer.read_string_from_hex('\n'); break;
+                case 'S':
+                    t.value = deserializer.read_string_from_hex('\n');
+                    break;
                 default: t.value = {}; break;
                 default: t.value = {}; break;
             }
             }
             tokens.push_back(t);
             tokens.push_back(t);
@@ -1389,7 +1391,7 @@ __EAT_DOTS_END:
 
 
     Str TokenDeserializer::read_string_from_hex(char c){
     Str TokenDeserializer::read_string_from_hex(char c){
         std::string_view s = read_string(c);
         std::string_view s = read_string(c);
-        char* buffer = (char*)pool64_alloc(s.size()/2 + 1);
+        char* buffer = (char*)pool128_alloc(s.size()/2 + 1);
         for(int i=0; i<s.size(); i+=2){
         for(int i=0; i<s.size(); i+=2){
             char c = 0;
             char c = 0;
             if(s[i]>='0' && s[i]<='9') c += s[i]-'0';
             if(s[i]>='0' && s[i]<='9') c += s[i]-'0';