From da90364adf956ff3b4cc58874753d8b0b5d7a3c3 Mon Sep 17 00:00:00 2001
From: Ignacio Etcheverry <ignalfonsore@gmail.com>
Date: Fri, 8 Jan 2021 04:26:24 +0100
Subject: C#: Fix System.Collections.Generic.List marshalling

---
 modules/mono/mono_gd/gd_mono_marshal.cpp | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

(limited to 'modules/mono/mono_gd/gd_mono_marshal.cpp')

diff --git a/modules/mono/mono_gd/gd_mono_marshal.cpp b/modules/mono/mono_gd/gd_mono_marshal.cpp
index 57fbf5b7e1..5c2700b641 100644
--- a/modules/mono/mono_gd/gd_mono_marshal.cpp
+++ b/modules/mono/mono_gd/gd_mono_marshal.cpp
@@ -1204,7 +1204,7 @@ Variant mono_object_to_variant_impl(MonoObject *p_obj, const ManagedType &p_type
 			if (GDMonoUtils::Marshal::type_is_system_generic_list(reftype)) {
 				MonoReflectionType *elem_reftype = nullptr;
 				GDMonoUtils::Marshal::array_get_element_type(reftype, &elem_reftype);
-				return system_generic_list_to_Array(p_obj, p_type.type_class, elem_reftype);
+				return system_generic_list_to_Array_variant(p_obj, p_type.type_class, elem_reftype);
 			}
 		} break;
 	}
@@ -1333,15 +1333,22 @@ MonoObject *Array_to_system_generic_list(const Array &p_array, GDMonoClass *p_cl
 	return mono_object;
 }
 
-Array system_generic_list_to_Array(MonoObject *p_obj, GDMonoClass *p_class, [[maybe_unused]] MonoReflectionType *p_elem_reftype) {
+Variant system_generic_list_to_Array_variant(MonoObject *p_obj, GDMonoClass *p_class, [[maybe_unused]] MonoReflectionType *p_elem_reftype) {
 	GDMonoMethod *to_array = p_class->get_method("ToArray", 0);
 	CRASH_COND(to_array == nullptr);
 
 	MonoException *exc = nullptr;
-	MonoArray *mono_array = (MonoArray *)to_array->invoke_raw(p_obj, nullptr, &exc);
+	MonoObject *array = to_array->invoke_raw(p_obj, nullptr, &exc);
 	UNHANDLED_EXCEPTION(exc);
 
-	return mono_array_to_Array(mono_array);
+	ERR_FAIL_NULL_V(array, Variant());
+
+	ManagedType type = ManagedType::from_class(mono_object_get_class(array));
+
+	bool result_is_array = type.type_encoding != MONO_TYPE_SZARRAY && type.type_encoding != MONO_TYPE_ARRAY;
+	ERR_FAIL_COND_V(result_is_array, Variant());
+
+	return mono_object_to_variant(array, type);
 }
 
 MonoArray *Array_to_mono_array(const Array &p_array) {
-- 
cgit v1.2.3