blueloveTH 2 anos atrás
pai
commit
4745f64744
3 arquivos alterados com 21 adições e 16 exclusões
  1. 12 9
      include/pocketpy/bindings.h
  2. 4 4
      include/pocketpy/cffi.h
  3. 5 3
      src/cffi.cpp

+ 12 - 9
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<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)  \

+ 4 - 4
include/pocketpy/cffi.h

@@ -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);

+ 5 - 3
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<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__, ==)