2004-08-03 Martin Baulig <martin@ximian.com>
authorMartin Baulig <martin@novell.com>
Tue, 3 Aug 2004 20:06:29 +0000 (20:06 -0000)
committerMartin Baulig <martin@novell.com>
Tue, 3 Aug 2004 20:06:29 +0000 (20:06 -0000)
* dump.c (method_dor_to_token): Moved to get.c and made public.

* get.c (get_method_override): New public function.

* main.c (dis_code): Added `.override' for override methods.

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

mono/dis/ChangeLog
mono/dis/dump.c
mono/dis/get.c
mono/dis/get.h
mono/dis/main.c

index 24cad53c9d6a77a9ca0c8e2785588b5b645b26e1..dce71aca30d592adc730b882f2f80c7e0371a5ce 100644 (file)
@@ -1,3 +1,11 @@
+2004-08-03  Martin Baulig  <martin@ximian.com>
+
+       * dump.c (method_dor_to_token): Moved to get.c and made public.
+
+       * get.c (get_method_override): New public function.
+
+       * main.c (dis_code): Added `.override' for override methods.
+
 2004-08-02  Martin Baulig  <martin@ximian.com>
 
        * get.c (dis_stringify_object_with_class): Include our generic
index 210fa91ad445121fff004b88c37c0c2a5eb851a6..f82bc5bb6753d83328d309cf330b39f72725673a 100644 (file)
@@ -607,17 +607,6 @@ dump_table_implmap (MonoImage *m)
        }
 }
 
-static 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;
-}
-
 void
 dump_table_methodimpl (MonoImage *m)
 {
index 623237f2aad3fa36857ac0f26369c108cbca4b79..d85a2458119bc82a77908ed49ed52ae468272631 100644 (file)
@@ -2322,3 +2322,36 @@ init_key_table (void)
        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;
+}
index 3e22c2b4cc089b58c8b1765b3a58b95e9f9748a7..21edda9bab78ad7618b0495cc98e2b669f21a173 100644 (file)
@@ -28,6 +28,7 @@ char *get_guid                (MonoImage *m, guint32 guid_index);
 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);
 
@@ -39,6 +40,8 @@ char *dis_stringify_param     (MonoImage *m, MonoType *param);
 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).
index 305b256fd14adf77f66196480c3d857741ac2a40..fc4a132845942631639eaf90d3e65931bc548eb4 100644 (file)
@@ -497,16 +497,23 @@ dis_locals (MonoImage *m, MonoMethodHeader *mh, const char *ptr)
 }
 
 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);
@@ -609,6 +616,7 @@ dis_method_list (const char *klass_name, MonoImage *m, guint32 start, guint32 en
                char *flags, *impl_flags;
                const char *sig;
                char *sig_str;
+               guint32 token;
                
                mono_metadata_decode_row (t, i, cols, MONO_METHOD_SIZE);
 
@@ -635,16 +643,18 @@ dis_method_list (const char *klass_name, MonoImage *m, guint32 start, guint32 en
                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);
@@ -987,8 +997,13 @@ dis_type (MonoImage *m, int n)
                        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");