+ g_hash_table_insert (key_table, (char *) "storage", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "stored_object", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "streamed_object", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "stream", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "strict", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "string", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "struct", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "synchronized", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "syschar", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "sysstring", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "tbstr", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "thiscall", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "tls", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "to", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "true", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "type", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "typedref", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "unicode", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "unmanagedexp", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "unmanaged", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "unsigned", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "userdefined", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "value", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "valuetype", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "vararg", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "variant", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "vector", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "virtual", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "void", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "wchar", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "winapi", GINT_TO_POINTER (TRUE));
+ g_hash_table_insert (key_table, (char *) "with", GINT_TO_POINTER (TRUE));
+}
+
+guint32
+method_dor_to_token (guint32 idx) {
+ switch (idx & MONO_METHODDEFORREF_MASK) {
+ case MONO_METHODDEFORREF_METHODDEF:
+ return MONO_TOKEN_METHOD_DEF | (idx >> MONO_METHODDEFORREF_BITS);
+ case MONO_METHODDEFORREF_METHODREF:
+ return MONO_TOKEN_MEMBER_REF | (idx >> MONO_METHODDEFORREF_BITS);
+ }
+ return -1;
+}
+
+char *
+get_method_override (MonoImage *m, guint32 token, MonoGenericContext *context)
+{
+ MonoTableInfo *t = &m->tables [MONO_TABLE_METHODIMPL];
+ int i;
+
+ for (i = 1; i <= t->rows; i++){
+ guint32 cols [MONO_METHODIMPL_SIZE];
+ guint32 decl, impl;
+
+ mono_metadata_decode_row (t, i - 1, cols, MONO_METHODIMPL_SIZE);
+
+ impl = method_dor_to_token (cols [MONO_METHODIMPL_BODY]);
+ decl = method_dor_to_token (cols [MONO_METHODIMPL_DECLARATION]);
+
+ if (token == impl)
+ return get_method_core (m, decl, FALSE, context);
+ }
+
+ return NULL;