g_hash_table_insert (key_table, (char *) "to", GINT_TO_POINTER (TRUE));
g_hash_table_insert (key_table, (char *) "value", 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)
+{
+ 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 (m, decl);
+ }
+
+ return NULL;
+}
char *get_marshal_info (MonoImage *m, const char *blob);
char *get_generic_param (MonoImage *m, int table_type, guint32 row);
char *get_escaped_name (const char *name);
+char *get_method_override (MonoImage *m, guint32 token);
GList *dis_get_custom_attrs (MonoImage *m, guint32 token);
char *dis_stringify_method_signature (MonoImage *m, MonoMethodSignature *method, int methoddef_row, gboolean fully_qualified);
char *dis_stringify_function_ptr (MonoImage *m, MonoMethodSignature *method);
+guint32 method_dor_to_token (guint32 idx);
+
/*
* These functions are used during the decoding of streams in the
* metadata heaps (a simple parsing).
}
static void
-dis_code (MonoImage *m, guint32 rva)
+dis_code (MonoImage *m, guint32 token, guint32 rva)
{
MonoMethodHeader *mh;
const char *ptr = mono_image_rva_map (m, rva);
const char *loc;
+ gchar *override;
guint32 entry_point;
if (rva == 0)
return;
+ override = get_method_override (m, token);
+ if (override) {
+ fprintf (output, "\t.override method %s\n", override);
+ g_free (override);
+ }
+
mh = mono_metadata_parse_mh (m, ptr);
if ((entry_point = mono_image_get_entry_point (m))){
loc = mono_metadata_locate_token (m, entry_point);
char *flags, *impl_flags;
const char *sig;
char *sig_str;
+ guint32 token;
mono_metadata_decode_row (t, i, cols, MONO_METHOD_SIZE);
fprintf (output, " %s\n", impl_flags);
g_free (flags);
g_free (impl_flags);
+
+ token = MONO_TOKEN_METHOD_DEF | (i + 1);
fprintf (output, " {\n");
- dump_cattrs (m, MONO_TOKEN_METHOD_DEF | (i + 1), " ");
+ dump_cattrs (m, token, " ");
cattrs_for_method (m, i, ms);
/* FIXME: need to sump also param custom attributes */
fprintf (output, " // Method begins at RVA 0x%x\n", cols [MONO_METHOD_RVA]);
if (cols [MONO_METHOD_IMPLFLAGS] & METHOD_IMPL_ATTRIBUTE_NATIVE)
fprintf (output, " // Disassembly of native methods is not supported\n");
else
- dis_code (m, cols [MONO_METHOD_RVA]);
+ dis_code (m, token, cols [MONO_METHOD_RVA]);
fprintf (output, " } // end of method %s::%s\n\n", klass_name, sig_str);
mono_metadata_free_method_signature (ms);
g_free (sig_str);
fprintf (output, " \textends %s\n", base);
g_free (base);
}
- } else
- fprintf (output, " .class interface %s%s\n", typedef_flags (cols [MONO_TYPEDEF_FLAGS]), esname);
+ } else {
+ fprintf (output, " .class interface %s%s", typedef_flags (cols [MONO_TYPEDEF_FLAGS]), esname);
+
+ cnst_block = dis_generic_param_and_constraints (m, MONO_TYPEORMETHOD_TYPE, n+1);
+ fprintf (output, "\n");
+ }
+
g_free (esname);
dis_interfaces (m, n + 1);
fprintf (output, " {\n");