2009-06-10 Jb Evain <jbevain@novell.com>
authorJb Evain <jbevain@gmail.com>
Wed, 10 Jun 2009 17:27:02 +0000 (17:27 -0000)
committerJb Evain <jbevain@gmail.com>
Wed, 10 Jun 2009 17:27:02 +0000 (17:27 -0000)
* main.c: add support for extern types. Fixes #511672.

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

mono/dis/ChangeLog
mono/dis/main.c

index 5d95ce9785831f7f9dba406b0cb4af8d06c34465..870be2c1312591a8147db07b33c16714a33e675f 100644 (file)
@@ -1,3 +1,7 @@
+2009-06-10  Jb Evain  <jbevain@novell.com>
+
+       * main.c: add support for extern types. Fixes #511672.
+
 2009-06-03  Jb Evain  <jbevain@novell.com>
 
        * main.c (dis_code): don't try to locate invalid entry points.
index d16391ebb042fbd51111fde925807427b52c4994..6767a61e6932b6f6f9575c72cef8e629cdd9b2ce 100644 (file)
@@ -1370,6 +1370,95 @@ dis_mresource (MonoImage *m)
        }               
 }
 
+static char *
+exported_type_flags (guint32 flags)
+{
+       static char buffer [1024];
+       int visibility = flags & TYPE_ATTRIBUTE_VISIBILITY_MASK;
+
+       buffer [0] = 0;
+
+       if (flags & TYPE_ATTRIBUTE_FORWARDER) {
+               strcat (buffer, "forwarder ");
+               return buffer;
+       }
+
+       strcat (buffer, map (visibility, visibility_map));
+       return buffer;
+}
+
+static char *
+get_escaped_fullname (MonoImage *m, guint32 nspace_idx, guint32 name_idx)
+{
+       const char *name, *nspace;
+       char *fullname, *esfullname;
+
+       nspace = mono_metadata_string_heap (m, nspace_idx);
+       name = mono_metadata_string_heap (m, name_idx);
+
+       fullname = g_strdup_printf ("%s%s%s", nspace, *nspace ? "." : "", name);
+       esfullname = get_escaped_name (fullname);
+
+       g_free (fullname);
+
+       return esfullname;
+}
+
+static void
+dis_exported_types (MonoImage *m)
+{
+       MonoTableInfo *t = &m->tables [MONO_TABLE_EXPORTEDTYPE];
+       int i;
+
+       for (i = 1; i <= t->rows; i++) {
+               char *fullname;
+               guint32 impl, idx, type_token;
+               guint32 cols [MONO_EXP_TYPE_SIZE];
+
+               mono_metadata_decode_row (t, i - 1, cols, MONO_EXP_TYPE_SIZE);
+
+               fullname = get_escaped_fullname (m, cols [MONO_EXP_TYPE_NAMESPACE], cols [MONO_EXP_TYPE_NAME]);
+
+               fprintf (output, "\n");
+               fprintf (output, ".class extern %s%s\n", exported_type_flags (cols [MONO_EXP_TYPE_FLAGS]), fullname);
+               fprintf (output, "{\n");
+
+               g_free (fullname);
+
+               impl = cols [MONO_EXP_TYPE_IMPLEMENTATION];
+               if (impl) {
+                       idx = impl >> MONO_IMPLEMENTATION_BITS;
+                       switch (impl & MONO_IMPLEMENTATION_MASK) {
+                       case MONO_IMPLEMENTATION_FILE:
+                               fprintf (output, "    .file '%s'\n",
+                                       mono_metadata_string_heap (m, mono_metadata_decode_row_col (&m->tables [MONO_TABLE_FILE], idx - 1, MONO_FILE_NAME)));
+                               break;
+                       case MONO_IMPLEMENTATION_ASSEMBLYREF:
+                               fprintf (output, "    .assembly extern '%s'\n",
+                                       mono_metadata_string_heap (m, mono_metadata_decode_row_col (&m->tables [MONO_TABLE_ASSEMBLYREF], idx - 1, MONO_ASSEMBLYREF_NAME)));
+                               break;
+                       case MONO_IMPLEMENTATION_EXP_TYPE:
+                               fullname = get_escaped_fullname (
+                                       m,
+                                       mono_metadata_decode_row_col (&m->tables [MONO_TABLE_EXPORTEDTYPE], idx - 1, MONO_EXP_TYPE_NAMESPACE),
+                                       mono_metadata_decode_row_col (&m->tables [MONO_TABLE_EXPORTEDTYPE], idx - 1, MONO_EXP_TYPE_NAME));
+                               fprintf (output, "    .class extern %s\n", fullname);
+                               g_free (fullname);
+                               break;
+                       default:
+                               g_assert_not_reached ();
+                               break;
+                       }
+               }
+
+               type_token = cols [MONO_EXP_TYPE_TYPEDEF];
+               if (type_token)
+                       fprintf (output, "    .class 0x%08x\n", type_token | MONO_TOKEN_TYPE_DEF);
+
+               fprintf (output, "}\n");
+       }
+}
+
 /**
  * dis_types:
  * @m: metadata context
@@ -1538,6 +1627,7 @@ disassemble_file (const char *file)
                dis_directive_mresource (img);
                dis_directive_module (img);
                dis_directive_moduleref (img);
+               dis_exported_types (img);
                dis_nt_header (img);
                 if (dump_managed_resources)
                        dis_mresource (img);