}
}
+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
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);