|
|
@@ -123,43 +123,44 @@ template<typename Ret, typename T, typename... Params>
|
|
|
return vm->bind(obj, sig, func);
|
|
|
}
|
|
|
/*****************************************************************/
|
|
|
-#define PY_FIELD(T, NAME, EXPR) \
|
|
|
+
|
|
|
+#define PY_FIELD(T, NAME, EXPR) \
|
|
|
vm->bind_property(type, NAME, \
|
|
|
[](VM* vm, ArgsView args){ \
|
|
|
- T& self = PK_OBJ_GET(T, args[0]); \
|
|
|
- return VAR(self.EXPR); \
|
|
|
+ obj_get_t<T> self = PK_OBJ_GET(T, args[0]); \
|
|
|
+ return VAR(self.EXPR); \
|
|
|
}, \
|
|
|
[](VM* vm, ArgsView args){ \
|
|
|
- T& self = PK_OBJ_GET(T, args[0]); \
|
|
|
- self.EXPR = CAST(decltype(self.EXPR), args[1]); \
|
|
|
+ obj_get_t<T> self = PK_OBJ_GET(T, args[0]); \
|
|
|
+ self.EXPR = CAST(decltype(self.EXPR), args[1]); \
|
|
|
return vm->None; \
|
|
|
});
|
|
|
|
|
|
-#define PY_READONLY_FIELD(T, NAME, EXPR) \
|
|
|
+#define PY_READONLY_FIELD(T, NAME, EXPR) \
|
|
|
vm->bind_property(type, NAME, \
|
|
|
[](VM* vm, ArgsView args){ \
|
|
|
- T& self = PK_OBJ_GET(T, args[0]); \
|
|
|
- return VAR(self.EXPR); \
|
|
|
+ obj_get_t<T> self = PK_OBJ_GET(T, args[0]); \
|
|
|
+ return VAR(self.EXPR); \
|
|
|
});
|
|
|
|
|
|
-#define PY_PROPERTY(T, NAME, FGET, FSET) \
|
|
|
- vm->bind_property(type, NAME, \
|
|
|
- [](VM* vm, ArgsView args){ \
|
|
|
- T& self = PK_OBJ_GET(T, args[0]); \
|
|
|
- return VAR(self.FGET()); \
|
|
|
- }, \
|
|
|
- [](VM* vm, ArgsView args){ \
|
|
|
- T& self = _CAST(T&, args[0]); \
|
|
|
- using __NT = decltype(self.FGET()); \
|
|
|
- self.FSET(CAST(__NT, args[1])); \
|
|
|
+#define PY_PROPERTY(T, NAME, FGET, FSET) \
|
|
|
+ vm->bind_property(type, NAME, \
|
|
|
+ [](VM* vm, ArgsView args){ \
|
|
|
+ obj_get_t<T> self = PK_OBJ_GET(T, args[0]); \
|
|
|
+ return VAR(self.FGET()); \
|
|
|
+ }, \
|
|
|
+ [](VM* vm, ArgsView args){ \
|
|
|
+ obj_get_t<T> self = PK_OBJ_GET(T, args[0]); \
|
|
|
+ using __NT = decltype(self.FGET()); \
|
|
|
+ self.FSET(CAST(__NT, args[1])); \
|
|
|
return vm->None; \
|
|
|
});
|
|
|
|
|
|
-#define PY_READONLY_PROPERTY(T, NAME, FGET) \
|
|
|
- vm->bind_property(type, NAME, \
|
|
|
- [](VM* vm, ArgsView args){ \
|
|
|
- T& self = PK_OBJ_GET(T, args[0]); \
|
|
|
- return VAR(self.FGET()); \
|
|
|
+#define PY_READONLY_PROPERTY(T, NAME, FGET) \
|
|
|
+ vm->bind_property(type, NAME, \
|
|
|
+ [](VM* vm, ArgsView args){ \
|
|
|
+ obj_get_t<T> self = PK_OBJ_GET(T, args[0]); \
|
|
|
+ return VAR(self.FGET()); \
|
|
|
});
|
|
|
/*****************************************************************/
|
|
|
#define PY_STRUCT_LIKE(wT) \
|
|
|
@@ -173,22 +174,22 @@ template<typename Ret, typename T, typename... Params>
|
|
|
memcpy(&_CAST(wT&, obj), s.p, sizeof(wT)); \
|
|
|
return obj; \
|
|
|
}, {}, BindType::STATICMETHOD); \
|
|
|
- vm->bind_func(type, "tostruct", 1, [](VM* vm, ArgsView args){ \
|
|
|
+ vm->bind_func(type, "tostruct", 1, [](VM* vm, ArgsView args){ \
|
|
|
wT& self = _CAST(wT&, args[0]); \
|
|
|
return vm->new_user_object<Struct>(&self, sizeof(wT)); \
|
|
|
}); \
|
|
|
- vm->bind_func(type, "addr", 1, [](VM* vm, ArgsView args){ \
|
|
|
+ vm->bind_func(type, "addr", 1, [](VM* vm, ArgsView args){ \
|
|
|
wT& self = _CAST(wT&, args[0]); \
|
|
|
return vm->new_user_object<VoidP>(&self); \
|
|
|
}); \
|
|
|
- vm->bind_func(type, "copy", 1, [](VM* vm, ArgsView args){ \
|
|
|
+ vm->bind_func(type, "copy", 1, [](VM* vm, ArgsView args){ \
|
|
|
wT& self = _CAST(wT&, args[0]); \
|
|
|
return vm->new_user_object<wT>(self); \
|
|
|
}); \
|
|
|
- vm->bind_func(type, "sizeof", 1, [](VM* vm, ArgsView args){ \
|
|
|
+ vm->bind_func(type, "sizeof", 1, [](VM* vm, ArgsView args){ \
|
|
|
return VAR(sizeof(wT)); \
|
|
|
}); \
|
|
|
- vm->bind__eq__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar _0, PyVar _1){ \
|
|
|
+ vm->bind__eq__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar _0, PyVar _1){ \
|
|
|
wT& self = _CAST(wT&, _0); \
|
|
|
if(!vm->isinstance(_1, vm->_tp_user<wT>())) return vm->NotImplemented; \
|
|
|
wT& other = _CAST(wT&, _1); \
|
|
|
@@ -196,17 +197,17 @@ template<typename Ret, typename T, typename... Params>
|
|
|
}); \
|
|
|
|
|
|
#define PY_POINTER_SETGETITEM(T) \
|
|
|
- vm->bind__getitem__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar _0, PyVar _1){ \
|
|
|
- VoidP& self = PK_OBJ_GET(VoidP, _0); \
|
|
|
+ vm->bind__getitem__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar _0, PyVar _1){ \
|
|
|
+ VoidP& self = PK_OBJ_GET(VoidP, _0); \
|
|
|
i64 i = CAST(i64, _1); \
|
|
|
T* tgt = reinterpret_cast<T*>(self.ptr); \
|
|
|
return VAR(tgt[i]); \
|
|
|
}); \
|
|
|
- vm->bind__setitem__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar _0, PyVar _1, PyVar _2){ \
|
|
|
- VoidP& self = PK_OBJ_GET(VoidP, _0); \
|
|
|
- i64 i = CAST(i64, _1); \
|
|
|
- T* tgt = reinterpret_cast<T*>(self.ptr); \
|
|
|
- tgt[i] = CAST(T, _2); \
|
|
|
- }); \
|
|
|
+ vm->bind__setitem__(PK_OBJ_GET(Type, type), [](VM* vm, PyVar _0, PyVar _1, PyVar _2){ \
|
|
|
+ VoidP& self = PK_OBJ_GET(VoidP, _0); \
|
|
|
+ i64 i = CAST(i64, _1); \
|
|
|
+ T* tgt = reinterpret_cast<T*>(self.ptr); \
|
|
|
+ tgt[i] = CAST(T, _2); \
|
|
|
+ }); \
|
|
|
|
|
|
} // namespace pkpy
|