This commit is contained in:
blueloveTH 2023-09-29 19:36:49 +08:00
parent 6faa79486f
commit 4745f64744
3 changed files with 21 additions and 16 deletions

View File

@ -86,16 +86,18 @@ void _bind(VM* vm, PyObject* obj, const char* sig, Ret(T::*func)(Params...)){
return vm->None; \ return vm->None; \
}); });
#define PY_FIELD_VIRTUAL(T, NAME, REF, EXPR) \ #define PY_FIELD_P(T, NAME, EXPR) \
vm->bind_property(type, NAME, \ vm->bind_property(type, NAME, \
[](VM* vm, ArgsView args){ \ [](VM* vm, ArgsView args){ \
T& self = *(reinterpret_cast<T*>(args[0]->_value_ptr())); \ VoidP& self = PK_OBJ_GET(VoidP, args[0]); \
return VAR(self.REF()->EXPR); \ T* tgt = reinterpret_cast<T*>(self.ptr); \
return VAR(tgt->EXPR); \
}, \ }, \
[](VM* vm, ArgsView args){ \ [](VM* vm, ArgsView args){ \
T& self = *(reinterpret_cast<T*>(args[0]->_value_ptr())); \ VoidP& self = PK_OBJ_GET(VoidP, args[0]); \
self.REF()->EXPR = CAST(decltype(self.REF()->EXPR), args[1]); \ T* tgt = reinterpret_cast<T*>(self.ptr); \
return vm->None; \ tgt->EXPR = CAST(decltype(tgt->EXPR), args[1]); \
return vm->None; \
}); });
#define PY_READONLY_FIELD(T, NAME, REF, EXPR) \ #define PY_READONLY_FIELD(T, NAME, REF, EXPR) \
@ -105,11 +107,12 @@ void _bind(VM* vm, PyObject* obj, const char* sig, Ret(T::*func)(Params...)){
return VAR(self.REF()->EXPR); \ return VAR(self.REF()->EXPR); \
}); });
#define PY_READONLY_FIELD_VIRTUAL(T, NAME, REF, EXPR) \ #define PY_READONLY_FIELD_P(T, NAME, EXPR) \
vm->bind_property(type, NAME, \ vm->bind_property(type, NAME, \
[](VM* vm, ArgsView args){ \ [](VM* vm, ArgsView args){ \
T& self = *(reinterpret_cast<T*>(args[0]->_value_ptr())); \ VoidP& self = PK_OBJ_GET(VoidP, args[0]); \
return VAR(self.REF()->EXPR); \ T* tgt = reinterpret_cast<T*>(self.ptr); \
return VAR(tgt->EXPR); \
}); });
#define PY_PROPERTY(T, NAME, REF, FGET, FSET) \ #define PY_PROPERTY(T, NAME, REF, FGET, FSET) \

View File

@ -91,12 +91,12 @@ static_assert(sizeof(Py_<C99Struct>) <= 64);
static_assert(sizeof(Py_<Tuple>) <= 64); static_assert(sizeof(Py_<Tuple>) <= 64);
/***********************************************/ /***********************************************/
template<typename T> template<typename Tp>
T to_void_p(VM* vm, PyObject* var){ Tp to_void_p(VM* vm, PyObject* var){
static_assert(std::is_pointer_v<T>); static_assert(std::is_pointer_v<Tp>);
if(var == vm->None) return nullptr; // None can be casted to any pointer implicitly if(var == vm->None) return nullptr; // None can be casted to any pointer implicitly
VoidP& p = CAST(VoidP&, var); VoidP& p = CAST(VoidP&, var);
return reinterpret_cast<T>(p.ptr); return reinterpret_cast<Tp>(p.ptr);
} }
/*****************************************************************/ /*****************************************************************/
void add_module_c(VM* vm); void add_module_c(VM* vm);

View File

@ -10,19 +10,21 @@ namespace pkpy{
}); });
vm->bind__hash__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){ vm->bind__hash__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){
VoidP& self = _CAST(VoidP&, obj); 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, PyObject* obj){ vm->bind__repr__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){
VoidP& self = _CAST(VoidP&, obj); VoidP& self = PK_OBJ_GET(VoidP, obj);
return VAR(fmt("<void* at ", self.hex(), ">")); return VAR(fmt("<void* at ", self.hex(), ">"));
}); });
#define BIND_CMP(name, op) \ #define BIND_CMP(name, op) \
vm->bind##name(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* lhs, PyObject* rhs){ \ vm->bind##name(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* lhs, PyObject* rhs){ \
if(!vm->isinstance(rhs, VoidP::_type(vm))) return vm->NotImplemented; \ if(!vm->isinstance(rhs, VoidP::_type(vm))) return vm->NotImplemented; \
return VAR(_CAST(VoidP&, lhs) op _CAST(VoidP&, rhs)); \ void* _0 = PK_OBJ_GET(VoidP, lhs).ptr; \
void* _1 = PK_OBJ_GET(VoidP, rhs).ptr; \
return VAR(_0 op _1); \
}); });
BIND_CMP(__eq__, ==) BIND_CMP(__eq__, ==)