blueloveTH 2 lat temu
rodzic
commit
df2f7bb58e
3 zmienionych plików z 10 dodań i 29 usunięć
  1. 6 20
      src/cffi.h
  2. 4 5
      src/obj.h
  3. 0 4
      src/vm.h

+ 6 - 20
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<typename T>
-struct _pointer {
-    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){
+T to_void_p(VM* vm, PyObject* var){
     static_assert(std::is_pointer_v<T>);
     VoidP& p = CAST(VoidP&, var);
     return reinterpret_cast<T>(p.ptr);

+ 4 - 5
src/obj.h

@@ -223,16 +223,15 @@ union BitsCvt {
 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> void _check_py_class(VM*, PyObject*);
-template<typename T> T py_pointer_cast(VM*, PyObject*);
+template<typename T> T to_void_p(VM*, PyObject*);
 
 template<typename __T>
 __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<T>::value){
-        _check_py_class<T>(vm, obj);
+        T::_check_type(vm, obj);
         return OBJ_GET(T, obj);
     }else {
         return Discarded();
@@ -243,7 +242,7 @@ template<typename __T>
 __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<T>::value){
         return OBJ_GET(T, obj);
     }else{

+ 0 - 4
src/vm.h

@@ -536,10 +536,6 @@ inline PyObject* py_var(VM* vm, std::string_view 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){
     if (is_int(obj)){