diff --git a/src/cffi.h b/src/cffi.h index 2d219a15..db828645 100644 --- a/src/cffi.h +++ b/src/cffi.h @@ -11,6 +11,11 @@ namespace pkpy { static const StrName __x1(#name); \ 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) { \ if(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); } /***********************************************/ - template -struct _pointer { - static constexpr int level = 0; - using baseT = T; -}; - -template -struct _pointer { - static constexpr int level = _pointer::level + 1; - using baseT = typename _pointer::baseT; -}; - -template -struct pointer { - static constexpr int level = _pointer>::level; - using baseT = typename _pointer>::baseT; -}; - -template -T py_pointer_cast(VM* vm, PyObject* var){ +T to_void_p(VM* vm, PyObject* var){ static_assert(std::is_pointer_v); VoidP& p = CAST(VoidP&, var); return reinterpret_cast(p.ptr); diff --git a/src/obj.h b/src/obj.h index 4ce5b395..13d65a0d 100644 --- a/src/obj.h +++ b/src/obj.h @@ -223,16 +223,15 @@ union BitsCvt { template struct is_py_class : std::false_type {}; template struct is_py_class> : std::true_type {}; -template void _check_py_class(VM*, PyObject*); -template T py_pointer_cast(VM*, PyObject*); +template T to_void_p(VM*, PyObject*); template __T py_cast(VM* vm, PyObject* obj) { using T = std::decay_t<__T>; if constexpr(std::is_pointer_v){ - return py_pointer_cast(vm, obj); + return to_void_p(vm, obj); }else if constexpr(is_py_class::value){ - _check_py_class(vm, obj); + T::_check_type(vm, obj); return OBJ_GET(T, obj); }else { return Discarded(); @@ -243,7 +242,7 @@ template __T _py_cast(VM* vm, PyObject* obj) { using T = std::decay_t<__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::value){ return OBJ_GET(T, obj); }else{ diff --git a/src/vm.h b/src/vm.h index c4fed72c..7ab6e0ad 100644 --- a/src/vm.h +++ b/src/vm.h @@ -536,10 +536,6 @@ inline PyObject* py_var(VM* vm, std::string_view val){ return VAR(Str(val)); } -template -void _check_py_class(VM* vm, PyObject* obj){ - vm->check_non_tagged_type(obj, T::_type(vm)); -} inline PyObject* VM::num_negated(PyObject* obj){ if (is_int(obj)){