mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 19:40:18 +00:00
fix a bug
This commit is contained in:
parent
f44ba19be3
commit
7e06cc2e96
@ -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); \
|
||||||
|
@ -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()
|
||||||
|
20
src/cffi.cpp
20
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());
|
||||||
|
@ -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';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user