From 4745f64744951d4bf146785065a5b941bf4569a7 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Fri, 29 Sep 2023 19:36:49 +0800 Subject: [PATCH] ... --- include/pocketpy/bindings.h | 21 ++++++++++++--------- include/pocketpy/cffi.h | 8 ++++---- src/cffi.cpp | 8 +++++--- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/include/pocketpy/bindings.h b/include/pocketpy/bindings.h index 79d04c79..aa1063ab 100644 --- a/include/pocketpy/bindings.h +++ b/include/pocketpy/bindings.h @@ -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(args[0]->_value_ptr())); \ - return VAR(self.REF()->EXPR); \ + VoidP& self = PK_OBJ_GET(VoidP, args[0]); \ + T* tgt = reinterpret_cast(self.ptr); \ + return VAR(tgt->EXPR); \ }, \ [](VM* vm, ArgsView args){ \ - T& self = *(reinterpret_cast(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(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(args[0]->_value_ptr())); \ - return VAR(self.REF()->EXPR); \ + VoidP& self = PK_OBJ_GET(VoidP, args[0]); \ + T* tgt = reinterpret_cast(self.ptr); \ + return VAR(tgt->EXPR); \ }); #define PY_PROPERTY(T, NAME, REF, FGET, FSET) \ diff --git a/include/pocketpy/cffi.h b/include/pocketpy/cffi.h index f5f2d1fe..89a7f12e 100644 --- a/include/pocketpy/cffi.h +++ b/include/pocketpy/cffi.h @@ -91,12 +91,12 @@ static_assert(sizeof(Py_) <= 64); static_assert(sizeof(Py_) <= 64); /***********************************************/ -template -T to_void_p(VM* vm, PyObject* var){ - static_assert(std::is_pointer_v); +template +Tp to_void_p(VM* vm, PyObject* var){ + static_assert(std::is_pointer_v); if(var == vm->None) return nullptr; // None can be casted to any pointer implicitly VoidP& p = CAST(VoidP&, var); - return reinterpret_cast(p.ptr); + return reinterpret_cast(p.ptr); } /*****************************************************************/ void add_module_c(VM* vm); diff --git a/src/cffi.cpp b/src/cffi.cpp index 3931a5ef..2d23bdb1 100644 --- a/src/cffi.cpp +++ b/src/cffi.cpp @@ -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(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("")); }); #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__, ==)