mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-23 13:00:17 +00:00
...
This commit is contained in:
parent
6faa79486f
commit
4745f64744
@ -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) \
|
||||||
|
@ -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);
|
||||||
|
@ -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__, ==)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user