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