2009-05-13 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Tue, 12 May 2009 23:20:38 +0000 (23:20 -0000)
committerZoltan Varga <vargaz@gmail.com>
Tue, 12 May 2009 23:20:38 +0000 (23:20 -0000)
* loader.c (mono_get_method_from_token): Avoid the expensive call to
mono_metadata_load_generic_params () for non-generic methods.

svn path=/trunk/mono/; revision=134015

mono/metadata/ChangeLog
mono/metadata/loader.c

index bb484d41dce0e3b47ad938b7fa5914f094de2689..257abf361cfde3b1871651c426791332a8c2d86e 100644 (file)
@@ -1,3 +1,8 @@
+2009-05-13  Zoltan Varga  <vargaz@gmail.com>
+
+       * loader.c (mono_get_method_from_token): Avoid the expensive call to
+       mono_metadata_load_generic_params () for non-generic methods.
+
 2009-05-12  Mark Probst  <mark.probst@gmail.com>
 
        * monitor.c, monitor.h (mono_monitor_get_object_monitor_weak_link):
index f1d7fc63015641ff458ff6b4c1cd1806cbfa3427..596d0c5d1163725464f315462228176697076ffb 100644 (file)
@@ -1475,8 +1475,18 @@ mono_get_method_from_token (MonoImage *image, guint32 token, MonoClass *klass,
        result->token = token;
        result->name = mono_metadata_string_heap (image, cols [3]);
 
+       if (!sig) /* already taken from the methodref */
+               sig = mono_metadata_blob_heap (image, cols [4]);
+       size = mono_metadata_decode_blob_size (sig, &sig);
+
        container = klass->generic_container;
-       generic_container = mono_metadata_load_generic_params (image, token, container);
+
+       /* 
+        * load_generic_params does a binary search so only call it if the method 
+        * is generic.
+        */
+       if (*sig & 0x10)
+               generic_container = mono_metadata_load_generic_params (image, token, container);
        if (generic_container) {
                result->is_generic = TRUE;
                generic_container->owner.method = result;
@@ -1486,11 +1496,6 @@ mono_get_method_from_token (MonoImage *image, guint32 token, MonoClass *klass,
                container = generic_container;
        }
 
-
-       if (!sig) /* already taken from the methodref */
-               sig = mono_metadata_blob_heap (image, cols [4]);
-       size = mono_metadata_decode_blob_size (sig, &sig);
-
        if (cols [1] & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) {
                if (result->klass == mono_defaults.string_class && !strcmp (result->name, ".ctor"))
                        result->string_ctor = 1;