Author: lupus
Date: 2005-03-22 10:11:23 -0500 (Tue, 22 Mar 2005)
New Revision: 42111

Modified:
   trunk/mono/mono/metadata/ChangeLog
   trunk/mono/mono/metadata/icall.c
Log:


Tue Mar 22 16:35:57 CET 2005 Paolo Molaro <[EMAIL PROTECTED]>

        * icall.c: speedup and fix leaks in GetMethodsByName and
        GetPropertiesByName.



Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog  2005-03-22 15:09:40 UTC (rev 42110)
+++ trunk/mono/mono/metadata/ChangeLog  2005-03-22 15:11:23 UTC (rev 42111)
@@ -1,4 +1,9 @@
 
+Tue Mar 22 16:35:57 CET 2005 Paolo Molaro <[EMAIL PROTECTED]>
+
+       * icall.c: speedup and fix leaks in GetMethodsByName and
+       GetPropertiesByName.
+
 Tue Mar 22 16:34:29 CET 2005 Paolo Molaro <[EMAIL PROTECTED]>
 
        * reflection.c: some locking fixes.

Modified: trunk/mono/mono/metadata/icall.c
===================================================================
--- trunk/mono/mono/metadata/icall.c    2005-03-22 15:09:40 UTC (rev 42110)
+++ trunk/mono/mono/metadata/icall.c    2005-03-22 15:11:23 UTC (rev 42111)
@@ -2798,7 +2798,8 @@
        gpointer iter;
        MonoObject *member;
        int i, len, match;
-       GHashTable *method_slots = g_hash_table_new (mono_aligned_addr_hash, 
NULL);
+       guint32 method_slots_default [8];
+       guint32 *method_slots;
        gchar *mname = NULL;
        int (*compare_func) (const char *s1, const char *s2) = NULL;
                
@@ -2815,11 +2816,17 @@
                compare_func = (ignore_case) ? g_strcasecmp : strcmp;
        }
 
+       if (klass->vtable_size >= sizeof (method_slots_default) * 8) {
+               method_slots = g_new0 (guint32, klass->vtable_size / 32 + 1);
+       } else {
+               method_slots = method_slots_default;
+               memset (method_slots, 0, sizeof (method_slots_default));
+       }
 handle_parent:
        iter = NULL;
        while ((method = mono_class_get_methods (klass, &iter))) {
                match = 0;
-               if (strcmp (method->name, ".ctor") == 0 || strcmp 
(method->name, ".cctor") == 0)
+               if (method->name [0] == '.' && (strcmp (method->name, ".ctor") 
== 0 || strcmp (method->name, ".cctor") == 0))
                        continue;
                if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == 
METHOD_ATTRIBUTE_PUBLIC) {
                        if (bflags & BFLAGS_Public)
@@ -2850,9 +2857,9 @@
                
                match = 0;
                if (method->slot != -1) {
-                       if (g_hash_table_lookup (method_slots, GUINT_TO_POINTER 
(method->slot)))
+                       if (method_slots [method->slot >> 5] & (1 << 
(method->slot & 0x1f)))
                                continue;
-                       g_hash_table_insert (method_slots, GUINT_TO_POINTER 
(method->slot), method);
+                       method_slots [method->slot >> 5] |= 1 << (method->slot 
& 0x1f);
                }
                
                member = (MonoObject*)mono_method_get_object (domain, method, 
refklass);
@@ -2872,7 +2879,8 @@
        for (; tmp; tmp = tmp->next, ++i)
                mono_array_set (res, gpointer, i, tmp->data);
        g_slist_free (l);
-       g_hash_table_destroy (method_slots);
+       if (method_slots != method_slots_default)
+               g_free (method_slots);
        return res;
 }
 
@@ -2953,7 +2961,8 @@
        int i, match;
        int len = 0;
        guint32 flags;
-       GHashTable *method_slots = g_hash_table_new (mono_aligned_addr_hash, 
NULL);
+       guint32 method_slots_default [8];
+       guint32 *method_slots;
        gchar *propname = NULL;
        int (*compare_func) (const char *s1, const char *s2) = NULL;
        gpointer iter;
@@ -2973,6 +2982,12 @@
                compare_func = (ignore_case) ? g_strcasecmp : strcmp;
        }
 
+       if (klass->vtable_size >= sizeof (method_slots_default) * 8) {
+               method_slots = g_new0 (guint32, klass->vtable_size / 32 + 1);
+       } else {
+               method_slots = method_slots_default;
+               memset (method_slots, 0, sizeof (method_slots_default));
+       }
 handle_parent:
        iter = NULL;
        while ((prop = mono_class_get_properties (klass, &iter))) {
@@ -3014,14 +3029,14 @@
                }
                
                if (prop->get && prop->get->slot != -1) {
-                       if (g_hash_table_lookup (method_slots, GUINT_TO_POINTER 
(prop->get->slot)))
+                       if (method_slots [prop->get->slot >> 5] & (1 << 
(prop->get->slot & 0x1f)))
                                continue;
-                       g_hash_table_insert (method_slots, GUINT_TO_POINTER 
(prop->get->slot), prop);
+                       method_slots [prop->get->slot >> 5] |= 1 << 
(prop->get->slot & 0x1f);
                }
                if (prop->set && prop->set->slot != -1) {
-                       if (g_hash_table_lookup (method_slots, GUINT_TO_POINTER 
(prop->set->slot)))
+                       if (method_slots [prop->set->slot >> 5] & (1 << 
(prop->set->slot & 0x1f)))
                                continue;
-                       g_hash_table_insert (method_slots, GUINT_TO_POINTER 
(prop->set->slot), prop);
+                       method_slots [prop->set->slot >> 5] |= 1 << 
(prop->set->slot & 0x1f);
                }
 
                l = g_slist_prepend (l, mono_property_get_object (domain, 
startklass, prop));
@@ -3039,7 +3054,8 @@
        for (; tmp; tmp = tmp->next, ++i)
                mono_array_set (res, gpointer, i, tmp->data);
        g_slist_free (l);
-       g_hash_table_destroy (method_slots);
+       if (method_slots != method_slots_default)
+               g_free (method_slots);
        return res;
 }
 

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to