Avoid allocating empty arrays in ves_icall_Type_GetInterfaces ().
authorZoltan Varga <vargaz@gmail.com>
Sat, 28 Aug 2010 00:42:39 +0000 (02:42 +0200)
committerZoltan Varga <vargaz@gmail.com>
Sat, 28 Aug 2010 00:43:19 +0000 (02:43 +0200)
mono/metadata/domain-internals.h
mono/metadata/icall.c

index 79f6bd9eddfc7f92a90b30e0c0eb7998a1f07eef..415a29c6bddf8edd97a96dd3070112b6e9724f9f 100644 (file)
@@ -231,6 +231,8 @@ struct _MonoDomain {
        MonoObject         *typeof_void;
        /* Ephemeron Tombstone*/
        MonoObject         *ephemeron_tombstone;
+       /* new MonoType [0] */
+       MonoArray          *empty_types;
        /* 
         * The fields between FIRST_GC_TRACKED and LAST_GC_TRACKED are roots, but
         * not object references.
index 336162118f307299d1187f3b10abcf4359c47c3d..0b2bad5202b0676adbe8b56db0bcd5a721f3adec 100644 (file)
@@ -2106,8 +2106,12 @@ ves_icall_Type_GetInterfaces (MonoReflectionType* type)
        data.domain = mono_object_domain (type);
 
        len = g_hash_table_size (iface_hash);
-       if (len == 0)
-               return mono_array_new_cached (data.domain, mono_defaults.monotype_class, 0);
+       if (len == 0) {
+               g_hash_table_destroy (iface_hash);
+               if (!data.domain->empty_types)
+                       data.domain->empty_types = mono_array_new_cached (data.domain, mono_defaults.monotype_class, 0);
+               return data.domain->empty_types;
+       }
 
        data.iface_array = mono_array_new_cached (data.domain, mono_defaults.monotype_class, len);
        g_hash_table_foreach (iface_hash, fill_iface_array, &data);