Browse Source

Attempt to standardize Object ptrcall encoding on `Object **`

David Snopek 2 years ago
parent
commit
77733faede

+ 8 - 2
core/object/ref_counted.h

@@ -242,8 +242,11 @@ public:
 template <class T>
 template <class T>
 struct PtrToArg<Ref<T>> {
 struct PtrToArg<Ref<T>> {
 	_FORCE_INLINE_ static Ref<T> convert(const void *p_ptr) {
 	_FORCE_INLINE_ static Ref<T> convert(const void *p_ptr) {
+		if (p_ptr == nullptr) {
+			return Ref<T>();
+		}
 		// p_ptr points to a RefCounted object
 		// p_ptr points to a RefCounted object
-		return Ref<T>(const_cast<T *>(reinterpret_cast<const T *>(p_ptr)));
+		return Ref<T>(const_cast<T *>(*reinterpret_cast<T *const *>(p_ptr)));
 	}
 	}
 
 
 	typedef Ref<T> EncodeT;
 	typedef Ref<T> EncodeT;
@@ -259,8 +262,11 @@ struct PtrToArg<const Ref<T> &> {
 	typedef Ref<T> EncodeT;
 	typedef Ref<T> EncodeT;
 
 
 	_FORCE_INLINE_ static Ref<T> convert(const void *p_ptr) {
 	_FORCE_INLINE_ static Ref<T> convert(const void *p_ptr) {
+		if (p_ptr == nullptr) {
+			return Ref<T>();
+		}
 		// p_ptr points to a RefCounted object
 		// p_ptr points to a RefCounted object
-		return Ref<T>((T *)p_ptr);
+		return Ref<T>(*((T *const *)p_ptr));
 	}
 	}
 };
 };
 
 

+ 8 - 2
core/variant/method_ptrcall.h

@@ -159,7 +159,10 @@ MAKE_PTRARG_BY_REFERENCE(Variant);
 template <class T>
 template <class T>
 struct PtrToArg<T *> {
 struct PtrToArg<T *> {
 	_FORCE_INLINE_ static T *convert(const void *p_ptr) {
 	_FORCE_INLINE_ static T *convert(const void *p_ptr) {
-		return const_cast<T *>(reinterpret_cast<const T *>(p_ptr));
+		if (p_ptr == nullptr) {
+			return nullptr;
+		}
+		return const_cast<T *>(*reinterpret_cast<T *const *>(p_ptr));
 	}
 	}
 	typedef Object *EncodeT;
 	typedef Object *EncodeT;
 	_FORCE_INLINE_ static void encode(T *p_var, void *p_ptr) {
 	_FORCE_INLINE_ static void encode(T *p_var, void *p_ptr) {
@@ -170,7 +173,10 @@ struct PtrToArg<T *> {
 template <class T>
 template <class T>
 struct PtrToArg<const T *> {
 struct PtrToArg<const T *> {
 	_FORCE_INLINE_ static const T *convert(const void *p_ptr) {
 	_FORCE_INLINE_ static const T *convert(const void *p_ptr) {
-		return reinterpret_cast<const T *>(p_ptr);
+		if (p_ptr == nullptr) {
+			return nullptr;
+		}
+		return *reinterpret_cast<T *const *>(p_ptr);
 	}
 	}
 	typedef const Object *EncodeT;
 	typedef const Object *EncodeT;
 	_FORCE_INLINE_ static void encode(T *p_var, void *p_ptr) {
 	_FORCE_INLINE_ static void encode(T *p_var, void *p_ptr) {

+ 1 - 1
core/variant/variant_internal.h

@@ -502,7 +502,7 @@ public:
 			case Variant::PACKED_COLOR_ARRAY:
 			case Variant::PACKED_COLOR_ARRAY:
 				return get_color_array(v);
 				return get_color_array(v);
 			case Variant::OBJECT:
 			case Variant::OBJECT:
-				return v->_get_obj().obj;
+				return get_object(v);
 			case Variant::VARIANT_MAX:
 			case Variant::VARIANT_MAX:
 				ERR_FAIL_V(nullptr);
 				ERR_FAIL_V(nullptr);
 		}
 		}

+ 1 - 1
modules/mono/editor/bindings_generator.cpp

@@ -2865,7 +2865,7 @@ bool BindingsGenerator::_populate_object_type_interfaces() {
 
 
 		itype.cs_out = "%5return (%2)%0(%1);";
 		itype.cs_out = "%5return (%2)%0(%1);";
 
 
-		itype.c_arg_in = "(void*)%s";
+		itype.c_arg_in = "&%s";
 		itype.c_type = "IntPtr";
 		itype.c_type = "IntPtr";
 		itype.c_type_in = itype.c_type;
 		itype.c_type_in = itype.c_type;
 		itype.c_type_out = "GodotObject";
 		itype.c_type_out = "GodotObject";