This commit is contained in:
blueloveTH 2023-05-10 20:29:49 +08:00
parent 3a07b05279
commit df2f7bb58e
3 changed files with 10 additions and 29 deletions

View File

@ -11,6 +11,11 @@ namespace pkpy {
static const StrName __x1(#name); \ static const StrName __x1(#name); \
return OBJ_GET(Type, vm->_modules[__x0]->attr(__x1)); \ return OBJ_GET(Type, vm->_modules[__x0]->attr(__x1)); \
} \ } \
static void _check_type(VM* vm, PyObject* val){ \
if(!vm->isinstance(val, T::_type(vm))){ \
vm->TypeError("expected '" #mod "." #name "', got " + OBJ_NAME(val).escape()); \
} \
} \
static PyObject* register_class(VM* vm, PyObject* mod) { \ static PyObject* register_class(VM* vm, PyObject* mod) { \
if(OBJ_NAME(mod) != #mod) { \ if(OBJ_NAME(mod) != #mod) { \
auto msg = fmt("register_class() failed: ", OBJ_NAME(mod), " != ", #mod); \ auto msg = fmt("register_class() failed: ", OBJ_NAME(mod), " != ", #mod); \
@ -57,27 +62,8 @@ inline PyObject* py_var(VM* vm, char* p){
return VAR_T(VoidP, p); return VAR_T(VoidP, p);
} }
/***********************************************/ /***********************************************/
template<typename T> template<typename T>
struct _pointer { T to_void_p(VM* vm, PyObject* var){
static constexpr int level = 0;
using baseT = T;
};
template<typename T>
struct _pointer<T*> {
static constexpr int level = _pointer<T>::level + 1;
using baseT = typename _pointer<T>::baseT;
};
template<typename T>
struct pointer {
static constexpr int level = _pointer<std::decay_t<T>>::level;
using baseT = typename _pointer<std::decay_t<T>>::baseT;
};
template<typename T>
T py_pointer_cast(VM* vm, PyObject* var){
static_assert(std::is_pointer_v<T>); static_assert(std::is_pointer_v<T>);
VoidP& p = CAST(VoidP&, var); VoidP& p = CAST(VoidP&, var);
return reinterpret_cast<T>(p.ptr); return reinterpret_cast<T>(p.ptr);

View File

@ -223,16 +223,15 @@ union BitsCvt {
template <typename, typename=void> struct is_py_class : std::false_type {}; template <typename, typename=void> struct is_py_class : std::false_type {};
template <typename T> struct is_py_class<T, std::void_t<decltype(T::_type)>> : std::true_type {}; template <typename T> struct is_py_class<T, std::void_t<decltype(T::_type)>> : std::true_type {};
template<typename T> void _check_py_class(VM*, PyObject*); template<typename T> T to_void_p(VM*, PyObject*);
template<typename T> T py_pointer_cast(VM*, PyObject*);
template<typename __T> template<typename __T>
__T py_cast(VM* vm, PyObject* obj) { __T py_cast(VM* vm, PyObject* obj) {
using T = std::decay_t<__T>; using T = std::decay_t<__T>;
if constexpr(std::is_pointer_v<T>){ if constexpr(std::is_pointer_v<T>){
return py_pointer_cast<T>(vm, obj); return to_void_p<T>(vm, obj);
}else if constexpr(is_py_class<T>::value){ }else if constexpr(is_py_class<T>::value){
_check_py_class<T>(vm, obj); T::_check_type(vm, obj);
return OBJ_GET(T, obj); return OBJ_GET(T, obj);
}else { }else {
return Discarded(); return Discarded();
@ -243,7 +242,7 @@ template<typename __T>
__T _py_cast(VM* vm, PyObject* obj) { __T _py_cast(VM* vm, PyObject* obj) {
using T = std::decay_t<__T>; using T = std::decay_t<__T>;
if constexpr(std::is_pointer_v<__T>){ if constexpr(std::is_pointer_v<__T>){
return py_pointer_cast<__T>(vm, obj); return to_void_p<__T>(vm, obj);
}else if constexpr(is_py_class<T>::value){ }else if constexpr(is_py_class<T>::value){
return OBJ_GET(T, obj); return OBJ_GET(T, obj);
}else{ }else{

View File

@ -536,10 +536,6 @@ inline PyObject* py_var(VM* vm, std::string_view val){
return VAR(Str(val)); return VAR(Str(val));
} }
template<typename T>
void _check_py_class(VM* vm, PyObject* obj){
vm->check_non_tagged_type(obj, T::_type(vm));
}
inline PyObject* VM::num_negated(PyObject* obj){ inline PyObject* VM::num_negated(PyObject* obj){
if (is_int(obj)){ if (is_int(obj)){