blueloveTH hace 2 años
padre
commit
bc640e503c
Se han modificado 1 ficheros con 10 adiciones y 8 borrados
  1. 10 8
      include/pocketpy/vm.h

+ 10 - 8
include/pocketpy/vm.h

@@ -356,7 +356,7 @@ public:
 
     void check_compatible_type(PyObject* obj, Type type){
         if(isinstance(obj, type)) return;
-        TypeError(_S(_type_name(vm, _tp(obj)).escape(), " is not compatible with ", _type_name(vm, type).escape()));
+        TypeError("expected " + _type_name(vm, type).escape() + ", got " + _type_name(vm, _tp(obj)).escape());
     }
 
     PyObject* _t(Type t){
@@ -521,15 +521,13 @@ __T _py_cast__internal(VM* vm, PyObject* obj) {
     using T = std::decay_t<__T>;
 
     if constexpr(std::is_same_v<T, const char*> || std::is_same_v<T, CString>){
+        static_assert(!std::is_reference_v<__T>);
         // str (shortcuts)
-        if constexpr(with_check){
-            if(obj == vm->None) return nullptr;
-            vm->check_non_tagged_type(obj, vm->tp_str);
-            return PK_OBJ_GET(Str, obj).c_str();
-        }else{
-            return PK_OBJ_GET(Str, obj).c_str();
-        }
+        if(obj == vm->None) return nullptr;
+        if constexpr(with_check) vm->check_non_tagged_type(obj, vm->tp_str);
+        return PK_OBJ_GET(Str, obj).c_str();
     }else if constexpr(std::is_same_v<T, bool>){
+        static_assert(!std::is_reference_v<__T>);
         // bool
         if constexpr(with_check){
             if(obj == vm->True) return true;
@@ -539,6 +537,7 @@ __T _py_cast__internal(VM* vm, PyObject* obj) {
             return obj == vm->True;
         }
     }else if constexpr(is_integral_v<T>){
+        static_assert(!std::is_reference_v<__T>);
         // int
         if constexpr(with_check){
             if(is_small_int(obj)) return (T)(PK_BITS(obj) >> 2);
@@ -549,14 +548,17 @@ __T _py_cast__internal(VM* vm, PyObject* obj) {
             return (T)PK_OBJ_GET(i64, obj);
         }
     }else if constexpr(is_floating_point_v<T>){
+        static_assert(!std::is_reference_v<__T>);
         // float
         if(is_float(obj)) return untag_float(obj);
         i64 bits;
         if(try_cast_int(obj, &bits)) return (float)bits;
         vm->TypeError("expected 'int' or 'float', got " + _type_name(vm, vm->_tp(obj)).escape());
     }else if constexpr(std::is_enum_v<T>){
+        static_assert(!std::is_reference_v<__T>);
         return (__T)_py_cast__internal<i64, with_check>(vm, obj);
     }else if constexpr(std::is_pointer_v<T>){
+        static_assert(!std::is_reference_v<__T>);
         return to_void_p<T>(vm, obj);
     }else{
         constexpr Type const_type = _find_type_in_const_cxx_typeid_map<T>();