|
@@ -156,14 +156,22 @@ Variant::Type managed_to_variant_type(const ManagedType &p_type) {
|
|
if (CACHED_CLASS(Array) == type_class) {
|
|
if (CACHED_CLASS(Array) == type_class) {
|
|
return Variant::ARRAY;
|
|
return Variant::ARRAY;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (type_class->implements_interface(CACHED_CLASS(System_Collections_IDictionary))) {
|
|
|
|
+ return Variant::DICTIONARY;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) {
|
|
|
|
+ return Variant::ARRAY;
|
|
|
|
+ }
|
|
} break;
|
|
} break;
|
|
|
|
|
|
case MONO_TYPE_GENERICINST: {
|
|
case MONO_TYPE_GENERICINST: {
|
|
MonoReflectionType *reftype = mono_type_get_object(SCRIPTS_DOMAIN, p_type.type_class->get_mono_type());
|
|
MonoReflectionType *reftype = mono_type_get_object(SCRIPTS_DOMAIN, p_type.type_class->get_mono_type());
|
|
|
|
|
|
MonoException *exc = NULL;
|
|
MonoException *exc = NULL;
|
|
- GDMonoUtils::IsDictionaryGenericType type_is_dict = CACHED_METHOD_THUNK(MarshalUtils, IsDictionaryGenericType);
|
|
|
|
- MonoBoolean is_dict = invoke_method_thunk(type_is_dict, (MonoObject *)reftype, (MonoObject **)&exc);
|
|
|
|
|
|
+ GDMonoUtils::TypeIsGenericDictionary type_is_dict = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericDictionary);
|
|
|
|
+ MonoBoolean is_dict = invoke_method_thunk(type_is_dict, (MonoObject *)reftype, &exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
|
|
|
|
if (is_dict) {
|
|
if (is_dict) {
|
|
@@ -171,13 +179,21 @@ Variant::Type managed_to_variant_type(const ManagedType &p_type) {
|
|
}
|
|
}
|
|
|
|
|
|
exc = NULL;
|
|
exc = NULL;
|
|
- GDMonoUtils::IsArrayGenericType type_is_array = CACHED_METHOD_THUNK(MarshalUtils, IsArrayGenericType);
|
|
|
|
- MonoBoolean is_array = invoke_method_thunk(type_is_array, (MonoObject *)reftype, (MonoObject **)&exc);
|
|
|
|
|
|
+ GDMonoUtils::TypeIsGenericArray type_is_array = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericArray);
|
|
|
|
+ MonoBoolean is_array = invoke_method_thunk(type_is_array, (MonoObject *)reftype, &exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
|
|
|
|
if (is_array) {
|
|
if (is_array) {
|
|
return Variant::ARRAY;
|
|
return Variant::ARRAY;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (p_type.type_class->implements_interface(CACHED_CLASS(System_Collections_IDictionary))) {
|
|
|
|
+ return Variant::DICTIONARY;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (p_type.type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) {
|
|
|
|
+ return Variant::ARRAY;
|
|
|
|
+ }
|
|
} break;
|
|
} break;
|
|
|
|
|
|
default: {
|
|
default: {
|
|
@@ -453,6 +469,14 @@ MonoObject *variant_to_mono_object(const Variant *p_var, const ManagedType &p_ty
|
|
if (CACHED_CLASS(Array) == type_class) {
|
|
if (CACHED_CLASS(Array) == type_class) {
|
|
return GDMonoUtils::create_managed_from(p_var->operator Array(), CACHED_CLASS(Array));
|
|
return GDMonoUtils::create_managed_from(p_var->operator Array(), CACHED_CLASS(Array));
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (type_class->implements_interface(CACHED_CLASS(System_Collections_IDictionary))) {
|
|
|
|
+ return GDMonoUtils::create_managed_from(p_var->operator Dictionary(), CACHED_CLASS(Dictionary));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) {
|
|
|
|
+ return GDMonoUtils::create_managed_from(p_var->operator Array(), CACHED_CLASS(Array));
|
|
|
|
+ }
|
|
} break;
|
|
} break;
|
|
case MONO_TYPE_OBJECT: {
|
|
case MONO_TYPE_OBJECT: {
|
|
// Variant
|
|
// Variant
|
|
@@ -548,8 +572,8 @@ MonoObject *variant_to_mono_object(const Variant *p_var, const ManagedType &p_ty
|
|
MonoReflectionType *reftype = mono_type_get_object(SCRIPTS_DOMAIN, p_type.type_class->get_mono_type());
|
|
MonoReflectionType *reftype = mono_type_get_object(SCRIPTS_DOMAIN, p_type.type_class->get_mono_type());
|
|
|
|
|
|
MonoException *exc = NULL;
|
|
MonoException *exc = NULL;
|
|
- GDMonoUtils::IsDictionaryGenericType type_is_dict = CACHED_METHOD_THUNK(MarshalUtils, IsDictionaryGenericType);
|
|
|
|
- MonoBoolean is_dict = invoke_method_thunk(type_is_dict, (MonoObject *)reftype, (MonoObject **)&exc);
|
|
|
|
|
|
+ GDMonoUtils::TypeIsGenericDictionary type_is_dict = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericDictionary);
|
|
|
|
+ MonoBoolean is_dict = invoke_method_thunk(type_is_dict, (MonoObject *)reftype, &exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
|
|
|
|
if (is_dict) {
|
|
if (is_dict) {
|
|
@@ -557,13 +581,21 @@ MonoObject *variant_to_mono_object(const Variant *p_var, const ManagedType &p_ty
|
|
}
|
|
}
|
|
|
|
|
|
exc = NULL;
|
|
exc = NULL;
|
|
- GDMonoUtils::IsArrayGenericType type_is_array = CACHED_METHOD_THUNK(MarshalUtils, IsArrayGenericType);
|
|
|
|
- MonoBoolean is_array = invoke_method_thunk(type_is_array, (MonoObject *)reftype, (MonoObject **)&exc);
|
|
|
|
|
|
+ GDMonoUtils::TypeIsGenericArray type_is_array = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericArray);
|
|
|
|
+ MonoBoolean is_array = invoke_method_thunk(type_is_array, (MonoObject *)reftype, &exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
|
|
|
|
if (is_array) {
|
|
if (is_array) {
|
|
return GDMonoUtils::create_managed_from(p_var->operator Array(), p_type.type_class);
|
|
return GDMonoUtils::create_managed_from(p_var->operator Array(), p_type.type_class);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (p_type.type_class->implements_interface(CACHED_CLASS(System_Collections_IDictionary))) {
|
|
|
|
+ return GDMonoUtils::create_managed_from(p_var->operator Dictionary(), CACHED_CLASS(Dictionary));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (p_type.type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) {
|
|
|
|
+ return GDMonoUtils::create_managed_from(p_var->operator Array(), CACHED_CLASS(Array));
|
|
|
|
+ }
|
|
} break;
|
|
} break;
|
|
} break;
|
|
} break;
|
|
}
|
|
}
|
|
@@ -717,17 +749,33 @@ Variant mono_object_to_variant(MonoObject *p_obj) {
|
|
|
|
|
|
if (CACHED_CLASS(Array) == type_class) {
|
|
if (CACHED_CLASS(Array) == type_class) {
|
|
MonoException *exc = NULL;
|
|
MonoException *exc = NULL;
|
|
- Array *ptr = invoke_method_thunk(CACHED_METHOD_THUNK(Array, GetPtr), p_obj, (MonoObject **)&exc);
|
|
|
|
|
|
+ Array *ptr = invoke_method_thunk(CACHED_METHOD_THUNK(Array, GetPtr), p_obj, &exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
return ptr ? Variant(*ptr) : Variant();
|
|
return ptr ? Variant(*ptr) : Variant();
|
|
}
|
|
}
|
|
|
|
|
|
if (CACHED_CLASS(Dictionary) == type_class) {
|
|
if (CACHED_CLASS(Dictionary) == type_class) {
|
|
MonoException *exc = NULL;
|
|
MonoException *exc = NULL;
|
|
- Dictionary *ptr = invoke_method_thunk(CACHED_METHOD_THUNK(Dictionary, GetPtr), p_obj, (MonoObject **)&exc);
|
|
|
|
|
|
+ Dictionary *ptr = invoke_method_thunk(CACHED_METHOD_THUNK(Dictionary, GetPtr), p_obj, &exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
return ptr ? Variant(*ptr) : Variant();
|
|
return ptr ? Variant(*ptr) : Variant();
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (type_class->implements_interface(CACHED_CLASS(System_Collections_IDictionary))) {
|
|
|
|
+ Dictionary dict;
|
|
|
|
+ MonoException *exc = NULL;
|
|
|
|
+ invoke_method_thunk(CACHED_METHOD_THUNK(MarshalUtils, IDictionaryToDictionary), p_obj, &dict, &exc);
|
|
|
|
+ UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
|
|
+ return dict;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) {
|
|
|
|
+ Array array;
|
|
|
|
+ MonoException *exc = NULL;
|
|
|
|
+ invoke_method_thunk(CACHED_METHOD_THUNK(MarshalUtils, EnumerableToArray), p_obj, &array, &exc);
|
|
|
|
+ UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
|
|
+ return array;
|
|
|
|
+ }
|
|
} break;
|
|
} break;
|
|
|
|
|
|
case MONO_TYPE_GENERICINST: {
|
|
case MONO_TYPE_GENERICINST: {
|
|
@@ -735,8 +783,8 @@ Variant mono_object_to_variant(MonoObject *p_obj) {
|
|
|
|
|
|
MonoException *exc = NULL;
|
|
MonoException *exc = NULL;
|
|
|
|
|
|
- GDMonoUtils::IsDictionaryGenericType type_is_dict = CACHED_METHOD_THUNK(MarshalUtils, IsDictionaryGenericType);
|
|
|
|
- MonoBoolean is_dict = invoke_method_thunk(type_is_dict, (MonoObject *)reftype, (MonoObject **)&exc);
|
|
|
|
|
|
+ GDMonoUtils::TypeIsGenericDictionary type_is_dict = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericDictionary);
|
|
|
|
+ MonoBoolean is_dict = invoke_method_thunk(type_is_dict, (MonoObject *)reftype, &exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
|
|
|
|
if (is_dict) {
|
|
if (is_dict) {
|
|
@@ -748,8 +796,8 @@ Variant mono_object_to_variant(MonoObject *p_obj) {
|
|
|
|
|
|
exc = NULL;
|
|
exc = NULL;
|
|
|
|
|
|
- GDMonoUtils::IsArrayGenericType type_is_array = CACHED_METHOD_THUNK(MarshalUtils, IsArrayGenericType);
|
|
|
|
- MonoBoolean is_array = invoke_method_thunk(type_is_array, (MonoObject *)reftype, (MonoObject **)&exc);
|
|
|
|
|
|
+ GDMonoUtils::TypeIsGenericArray type_is_array = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericArray);
|
|
|
|
+ MonoBoolean is_array = invoke_method_thunk(type_is_array, (MonoObject *)reftype, &exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
|
|
|
|
if (is_array) {
|
|
if (is_array) {
|
|
@@ -758,6 +806,22 @@ Variant mono_object_to_variant(MonoObject *p_obj) {
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
return *unbox<Array *>(ret);
|
|
return *unbox<Array *>(ret);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (type.type_class->implements_interface(CACHED_CLASS(System_Collections_IDictionary))) {
|
|
|
|
+ Dictionary dict;
|
|
|
|
+ exc = NULL;
|
|
|
|
+ invoke_method_thunk(CACHED_METHOD_THUNK(MarshalUtils, IDictionaryToDictionary), p_obj, &dict, &exc);
|
|
|
|
+ UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
|
|
+ return dict;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (type.type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) {
|
|
|
|
+ Array array;
|
|
|
|
+ exc = NULL;
|
|
|
|
+ invoke_method_thunk(CACHED_METHOD_THUNK(MarshalUtils, EnumerableToArray), p_obj, &array, &exc);
|
|
|
|
+ UNLIKELY_UNHANDLED_EXCEPTION(exc);
|
|
|
|
+ return array;
|
|
|
|
+ }
|
|
} break;
|
|
} break;
|
|
}
|
|
}
|
|
|
|
|