2005-01-31 Martin Baulig <martin@ximian.com>
authorMartin Baulig <martin@novell.com>
Mon, 31 Jan 2005 12:40:54 +0000 (12:40 -0000)
committerMartin Baulig <martin@novell.com>
Mon, 31 Jan 2005 12:40:54 +0000 (12:40 -0000)
* metadata.c (mono_metadata_has_generic_params): New public
function; checks whether something is a generic method.

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

mono/metadata/ChangeLog
mono/metadata/class-internals.h
mono/metadata/metadata.c

index 01d1808a21cb7fc94d46ada04be3e54dce0500c9..d181478df676a4c7c748e3a3f5f638c8ae00dc9e 100644 (file)
@@ -1,3 +1,7 @@
+2005-01-31  Martin Baulig  <martin@ximian.com>
+
+       * metadata.c (mono_metadata_has_generic_params): New public
+       function; checks whether something is a generic method.
 
 Sun Jan 30 20:19:48 CET 2005 Paolo Molaro <lupus@ximian.com>
 
index b2933c61990f79166070b8aaffa8aab10a911cd5..96fae8039cfa03ea2d905a088192e834ae526121 100644 (file)
@@ -524,6 +524,9 @@ mono_method_get_wrapper_data (MonoMethod *method, guint32 id);
 void
 mono_install_stack_walk (MonoStackWalkImpl func);
 
+gboolean
+mono_metadata_has_generic_params (MonoImage *image, guint32 token);
+
 MonoGenericContainer *mono_metadata_load_generic_params (MonoImage *image, guint32 token,
                                                         MonoGenericContainer *parent_container);
 
index 4dbf05bfedada258fa42582bc1276a3699d5fe99..90d215c2fe21a86444fed12964f7c6c3170c2e18 100644 (file)
@@ -3763,6 +3763,36 @@ get_constraints (MonoImage *image, int owner, MonoGenericContext *context)
        return res;
 }
 
+gboolean
+mono_metadata_has_generic_params (MonoImage *image, guint32 token)
+{
+       MonoTableInfo *tdef  = &image->tables [MONO_TABLE_GENERICPARAM];
+       guint32 cols [MONO_GENERICPARAM_SIZE];
+       guint32 i, owner = 0;
+
+       if (mono_metadata_token_table (token) == MONO_TABLE_TYPEDEF)
+               owner = MONO_TYPEORMETHOD_TYPE;
+       else if (mono_metadata_token_table (token) == MONO_TABLE_METHOD)
+               owner = MONO_TYPEORMETHOD_METHOD;
+       else {
+               g_error ("wrong token %x to load_generics_params", token);
+               return FALSE;
+       }
+       owner |= mono_metadata_token_index (token) << MONO_TYPEORMETHOD_BITS;
+       if (!tdef->base)
+               return FALSE;
+
+       for (i = 0; i < tdef->rows; ++i) {
+               mono_metadata_decode_row (tdef, i, cols, MONO_GENERICPARAM_SIZE);
+               if (cols [MONO_GENERICPARAM_OWNER] == owner)
+                       break;
+       }
+       if (i >= tdef->rows)
+               return FALSE;
+
+       return TRUE;
+}
+
 MonoGenericContainer *
 mono_metadata_load_generic_params (MonoImage *image, guint32 token, MonoGenericContainer *parent_container)
 {