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; \
});
#define PY_FIELD_VIRTUAL(T, NAME, REF, EXPR) \
#define PY_FIELD_P(T, NAME, EXPR) \
vm->bind_property(type, NAME, \
[](VM* vm, ArgsView args){ \
T& self = *(reinterpret_cast<T*>(args[0]->_value_ptr())); \
return VAR(self.REF()->EXPR); \
VoidP& self = PK_OBJ_GET(VoidP, args[0]); \
T* tgt = reinterpret_cast<T*>(self.ptr); \
return VAR(tgt->EXPR); \
}, \
[](VM* vm, ArgsView args){ \
T& self = *(reinterpret_cast<T*>(args[0]->_value_ptr())); \
self.REF()->EXPR = CAST(decltype(self.REF()->EXPR), args[1]); \
return vm->None; \
VoidP& self = PK_OBJ_GET(VoidP, args[0]); \
T* tgt = reinterpret_cast<T*>(self.ptr); \
tgt->EXPR = CAST(decltype(tgt->EXPR), args[1]); \
return vm->None; \
});
#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); \
});
#define PY_READONLY_FIELD_VIRTUAL(T, NAME, REF, EXPR) \
#define PY_READONLY_FIELD_P(T, NAME, EXPR) \
vm->bind_property(type, NAME, \
[](VM* vm, ArgsView args){ \
T& self = *(reinterpret_cast<T*>(args[0]->_value_ptr())); \
return VAR(self.REF()->EXPR); \
VoidP& self = PK_OBJ_GET(VoidP, args[0]); \
T* tgt = reinterpret_cast<T*>(self.ptr); \
return VAR(tgt->EXPR); \
});
#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);
/***********************************************/
template<typename T>
T to_void_p(VM* vm, PyObject* var){
static_assert(std::is_pointer_v<T>);
template<typename Tp>
Tp to_void_p(VM* vm, PyObject* var){
static_assert(std::is_pointer_v<Tp>);
if(var == vm->None) return nullptr; // None can be casted to any pointer implicitly
VoidP& p = CAST(VoidP&, var);
return reinterpret_cast<T>(p.ptr);
return reinterpret_cast<Tp>(p.ptr);
}
/*****************************************************************/
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){
VoidP& self = _CAST(VoidP&, obj);
VoidP& self = PK_OBJ_GET(VoidP, obj);
return reinterpret_cast<i64>(self.ptr);
});
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(), ">"));
});
#define BIND_CMP(name, op) \
vm->bind##name(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* lhs, PyObject* rhs){ \
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__, ==)