diff --git a/include/pocketpy/bindings.h b/include/pocketpy/bindings.h index 566d3599..4aa42c66 100644 --- a/include/pocketpy/bindings.h +++ b/include/pocketpy/bindings.h @@ -46,7 +46,7 @@ struct NativeProxyMethodC final: NativeProxyFuncCBase { template PyVar call(VM* vm, ArgsView args, std::index_sequence){ - T& self = PK_OBJ_GET(T, args[0]); // use unsafe cast for derived classes + obj_get_t self = PK_OBJ_GET(T, args[0]); // use unsafe cast for derived classes if constexpr(std::is_void_v<__Ret>){ (self.*func)(py_cast(vm, args[Is+1])...); 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(':'); if(pos > 0) name_sv = name_sv.substr(0, pos); auto fget = [](VM* vm, ArgsView args) -> PyVar{ - T& self = PK_OBJ_GET(T, args[0]); + obj_get_t self = PK_OBJ_GET(T, args[0]); F T::*field = lambda_get_userdata(args.begin()); return VAR(self.*field); }; @@ -101,7 +101,7 @@ PyVar VM::bind_field(PyVar obj, const char* name, F T::*field){ PyVar _1 = vm->None; if constexpr (!ReadOnly){ auto fset = [](VM* vm, ArgsView args){ - T& self = PK_OBJ_GET(T, args[0]); + obj_get_t self = PK_OBJ_GET(T, args[0]); F T::*field = lambda_get_userdata(args.begin()); self.*field = py_cast(vm, args[1]); return vm->None; @@ -198,13 +198,13 @@ template #define PY_POINTER_SETGETITEM(T) \ vm->bind__getitem__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar _0, PyVar _1){ \ - VoidP& self = PK_OBJ_GET(VoidP, _0); \ + obj_get_t self = PK_OBJ_GET(VoidP, _0); \ i64 i = CAST(i64, _1); \ T* tgt = reinterpret_cast(self.ptr); \ return VAR(tgt[i]); \ }); \ 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 self = PK_OBJ_GET(VoidP, _0); \ i64 i = CAST(i64, _1); \ T* tgt = reinterpret_cast(self.ptr); \ tgt[i] = CAST(T, _2); \ diff --git a/scripts/run_tests.py b/scripts/run_tests.py index cc53b8ca..c125cc60 100644 --- a/scripts/run_tests.py +++ b/scripts/run_tests.py @@ -65,6 +65,7 @@ class A: return self.x + print('ans_1:', add(1, 2)) print('ans_2:', A('abc').get()) exit() diff --git a/src/cffi.cpp b/src/cffi.cpp index 8760eed9..e9218fbf 100644 --- a/src/cffi.cpp +++ b/src/cffi.cpp @@ -10,12 +10,12 @@ namespace pkpy{ }); vm->bind__hash__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar obj){ - VoidP& self = PK_OBJ_GET(VoidP, obj); + obj_get_t self = PK_OBJ_GET(VoidP, obj); return reinterpret_cast(self.ptr); }); vm->bind__repr__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar obj) -> Str{ - VoidP& self = PK_OBJ_GET(VoidP, obj); + obj_get_t self = PK_OBJ_GET(VoidP, obj); return _S(""); }); @@ -199,37 +199,37 @@ void add_module_c(VM* vm){ mod->attr().set(CNAME "_p", type); \ type_t = PK_OBJ_GET(Type, type); \ vm->bind_func(type, "read", 1, [](VM* vm, ArgsView args){ \ - VoidP& voidp = PK_OBJ_GET(VoidP, args[0]); \ + obj_get_t voidp = PK_OBJ_GET(VoidP, args[0]); \ T* target = (T*)voidp.ptr; \ return VAR(*target); \ }); \ vm->bind_func(type, "write", 2, [](VM* vm, ArgsView args){ \ - VoidP& voidp = PK_OBJ_GET(VoidP, args[0]); \ + obj_get_t voidp = PK_OBJ_GET(VoidP, args[0]); \ T val = CAST(T, args[1]); \ T* target = (T*)voidp.ptr; \ *target = val; \ return vm->None; \ }); \ vm->bind__getitem__(type_t, [](VM* vm, PyVar obj, PyVar index){ \ - VoidP& voidp = PK_OBJ_GET(VoidP, obj); \ + obj_get_t voidp = PK_OBJ_GET(VoidP, obj); \ i64 offset = CAST(i64, index); \ T* target = (T*)voidp.ptr; \ return VAR(target[offset]); \ }); \ vm->bind__setitem__(type_t, [](VM* vm, PyVar obj, PyVar index, PyVar value){ \ - VoidP& voidp = PK_OBJ_GET(VoidP, obj); \ + obj_get_t voidp = PK_OBJ_GET(VoidP, obj); \ i64 offset = CAST(i64, index); \ T* target = (T*)voidp.ptr; \ target[offset] = CAST(T, value); \ }); \ vm->bind__add__(type_t, [](VM* vm, PyVar lhs, PyVar rhs){ \ - VoidP& voidp = PK_OBJ_GET(VoidP, lhs); \ + obj_get_t voidp = PK_OBJ_GET(VoidP, lhs); \ i64 offset = CAST(i64, rhs); \ T* target = (T*)voidp.ptr; \ return vm->new_object(lhs.type, target + offset); \ }); \ vm->bind__sub__(type_t, [](VM* vm, PyVar lhs, PyVar rhs){ \ - VoidP& voidp = PK_OBJ_GET(VoidP, lhs); \ + obj_get_t voidp = PK_OBJ_GET(VoidP, lhs); \ i64 offset = CAST(i64, rhs); \ T* target = (T*)voidp.ptr; \ return vm->new_object(lhs.type, target - offset); \ @@ -257,13 +257,13 @@ void add_module_c(VM* vm){ PyVar char_p_t = mod->attr("char_p"); 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 = PK_OBJ_GET(VoidP, args[0]); const char* target = (const char*)voidp.ptr; return VAR(target); }); 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 = PK_OBJ_GET(VoidP, args[0]); std::string_view sv = CAST(Str&, args[1]).sv(); char* target = (char*)voidp.ptr; memcpy(target, sv.data(), sv.size()); diff --git a/src/compiler.cpp b/src/compiler.cpp index 91e234f5..34c96988 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -1325,7 +1325,9 @@ __EAT_DOTS_END: switch(type){ case 'I': t.value = deserializer.read_uint('\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; } tokens.push_back(t); @@ -1389,7 +1391,7 @@ __EAT_DOTS_END: Str TokenDeserializer::read_string_from_hex(char 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='0' && s[i]<='9') c += s[i]-'0';