public extern override Type[] GetInterfaces();
[MethodImplAttribute(MethodImplOptions.InternalCall)]
- extern RuntimeType[] GetNestedTypes_internal (string name, BindingFlags bindingAttr);
+ extern IntPtr GetNestedTypes_native (string name, BindingFlags bindingAttr);
+
+ RuntimeType[] GetNestedTypes_internal (string name, BindingFlags bindingAttr)
+ {
+ using (var h = new Mono.SafeGPtrArrayHandle (GetNestedTypes_native (name, bindingAttr))) {
+ int n = h.Length;
+ var a = new RuntimeType [n];
+ for (int i = 0; i < n; i++) {
+ var th = new RuntimeTypeHandle (h[i]);
+ a[i] = (RuntimeType) Type.GetTypeFromHandle (th);
+ }
+ return a;
+ }
+ }
public override string AssemblyQualifiedName {
get {
ICALL(RT_10, "GetInterfaceMapData", ves_icall_RuntimeType_GetInterfaceMapData)
ICALL(RT_11, "GetInterfaces", ves_icall_RuntimeType_GetInterfaces)
ICALL(RT_12, "GetMethodsByName_native", ves_icall_RuntimeType_GetMethodsByName_native)
-ICALL(RT_13, "GetNestedTypes_internal", ves_icall_RuntimeType_GetNestedTypes)
+ICALL(RT_13, "GetNestedTypes_native", ves_icall_RuntimeType_GetNestedTypes_native)
ICALL(RT_14, "GetPacking", ves_icall_RuntimeType_GetPacking)
ICALL(RT_15, "GetPropertiesByName_native", ves_icall_RuntimeType_GetPropertiesByName_native)
ICALL(RT_16, "GetTypeCodeImplInternal", ves_icall_type_GetTypeCodeInternal)
return NULL;
}
-ICALL_EXPORT MonoArray*
-ves_icall_RuntimeType_GetNestedTypes (MonoReflectionType *type, MonoString *name, guint32 bflags)
+ICALL_EXPORT GPtrArray *
+ves_icall_RuntimeType_GetNestedTypes_native (MonoReflectionType *type, MonoString *name, guint32 bflags)
{
- MonoError error;
- MonoReflectionType *rt;
- MonoDomain *domain;
MonoClass *klass;
- MonoArray *res = NULL;
- int i, match;
+ int match;
MonoClass *nested;
gpointer iter;
char *str = NULL;
- MonoPtrArray tmp_array;
-
- mono_error_init (&error);
+ GPtrArray *res_array;
- domain = ((MonoObject *)type)->vtable->domain;
if (type->type->byref) {
- MonoArray *result = mono_array_new_cached (domain, mono_defaults.runtimetype_class, 0, &error);
- mono_error_set_pending_exception (&error);
- return result;
+ return g_ptr_array_new ();
}
+
klass = mono_class_from_mono_type (type->type);
/*
if (klass->generic_class)
klass = klass->generic_class->container_class;
- mono_ptr_array_init (tmp_array, 1, MONO_ROOT_SOURCE_REFLECTION, "temporary reflection nested types list");
+ res_array = g_ptr_array_new ();
+
iter = NULL;
while ((nested = mono_class_get_nested_types (klass, &iter))) {
match = 0;
if (str == NULL) {
str = mono_string_to_utf8_checked (name, &error);
if (!is_ok (&error))
- goto leave;
+ goto fail;
mono_identifier_unescape_type_name_chars (str);
}
continue;
}
- rt = mono_type_get_object_checked (domain, &nested->byval_arg, &error);
- if (!is_ok (&error))
- goto leave;
-
- mono_ptr_array_append (tmp_array, (MonoObject*) rt);
+ g_ptr_array_add (res_array, &nested->byval_arg);
}
- res = mono_array_new_cached (domain, mono_defaults.runtimetype_class, mono_ptr_array_size (tmp_array), &error);
- if (!is_ok (&error))
- goto leave;
-
- for (i = 0; i < mono_ptr_array_size (tmp_array); ++i)
- mono_array_setref (res, i, mono_ptr_array_get (tmp_array, i));
-
-leave:
- mono_ptr_array_destroy (tmp_array);
-
g_free (str);
- mono_error_set_pending_exception (&error);
- return res;
+ return res_array;
}
ICALL_EXPORT MonoReflectionType*