for (i = 0; i < t->rows; i++){
guint32 cols [3];
+ char *sig, *flags;
expand (t, i, cols, CSIZE (cols));
- fprintf (output, "%d: 0x%02x %s\n",
+ sig = get_field_signature (m, cols [2]);
+ flags = field_flags (cols [0]);
+ fprintf (output, "%d: %s %s: %s\n",
i,
- cols [0],
- mono_metadata_string_heap (m, cols [1]));
+ sig,
+ mono_metadata_string_heap (m, cols [1]),
+ flags);
+ g_free (sig);
+ g_free (flags);
}
fprintf (output, "\n");
}
for (i = 0; i < t->rows; i++){
guint32 cols [3];
char *type;
+ int bsize;
expand (t, i, cols, CSIZE (cols));
flags [0] = 0;
strcat (flags, "hasdefault ");
ptr = mono_metadata_blob_heap (m, cols [2]);
- /*
- * The data in the blob doesn't follow the specs:
- * there are 3 nibbles first (we skip also the 0x8 signature).
- */
- ptr+=2;
+ ptr = get_blob_encoded_size (ptr, &bsize);
+ /* ECMA claims 0x08 ... */
+ if (*ptr != 0x28 && *ptr != 0x08)
+ g_warning("incorrect signature in propert blob: 0x%x", *ptr);
+ ptr++;
ptr = get_encoded_value (ptr, &pcount);
ptr = get_type (m, ptr, &type);
fprintf (output, "%d: %s %s (",
}
+void
+dump_table_method (metadata_t *m)
+{
+ metadata_tableinfo_t *t = &m->tables [META_TABLE_METHOD];
+ int i;
+ fprintf (output, "Method Table (0..%d)\n", t->rows);
+
+ for (i = 0; i < t->rows; i++){
+ guint32 cols [6];
+ const char *name;
+
+ expand (t, i, cols, CSIZE (cols));
+
+ name = mono_metadata_string_heap (m, cols[3]);
+ fprintf (output, "%d: %s\n", i, name);
+ }
+
+}
+
{
metadata_tableinfo_t *t = &m->tables [META_TABLE_STANDALONESIG];
const char *ptr;
- int len, i;
-
- /*fprintf(stderr, "rows: %d\n", t->rows);*/
- expand (t, token&0xffffff, &len, 1);
- ptr = mono_metadata_blob_heap (m, len);
+ guint32 cols[1];
+ int len=0, i, bsize;
+
+ expand (t, (token&0xffffff)-1, cols, CSIZE(cols));
+ ptr = mono_metadata_blob_heap (m, cols[0]);
+ ptr = get_blob_encoded_size (ptr, &bsize);
+ if (*ptr != 0x07)
+ g_warning("wrong signature for locals blob");
+ ptr++;
ptr = get_encoded_value (ptr, &len);
fprintf(output, "\t.locals ( // %d\n", len);
for (i=0; i < len; ++i) {
p = ptr;
}
ptr = get_type(m, p, &desc);
- fprintf(output, "\t\t%s\tlocal%d\n", desc, i);
+ fprintf(output, "\t\t%s\tV_%d\n", desc, i);
g_free(desc);
}
fprintf(output, "\t)\n");
}
/**
- * dis_field_list:
+ * dis_method_list:
* @m: metadata context
* @start: starting index into the Method Table.
* @end: ending index into Method table.
expand (t, n, cols, CSIZE (cols));
- if (t->rows > n){
+ if (t->rows > n+1){
expand (t, n + 1, cols_next, CSIZE (cols_next));
next_is_valid = 1;
} else
* The value in the table is always valid, we know we have fields
* if the value stored is different than the next record.
*/
+
if (next_is_valid)
last = cols_next [4] - 1;
else
last = m->tables [META_TABLE_FIELD].rows;
- if (cols [4] != cols_next [4] && cols_next [4] != 0)
+ /*if (cols [4] != cols_next [4] && cols_next [4] != 0)
+ dis_field_list (m, cols [4] - 1, last);*/
+ if (cols[4] && cols[4] <= m->tables [META_TABLE_FIELD].rows)
dis_field_list (m, cols [4] - 1, last);
+ /*fprintf (output, "cols[4] -> %d cols_next[4] -> %d last -> %d rows -> %d\n", cols[4], cols_next[4], last, m->tables [META_TABLE_FIELD].rows);*/
fprintf (output, "\n");
if (next_is_valid)
else
last = m->tables [META_TABLE_METHOD].rows;
- if (cols [4] != cols_next [5] && cols_next [5] != 0)
- dis_method_list (m, ii, cols [5] - 1, last);
+ /*if (cols [4] != cols_next [5] && cols_next [5] != 0)
+ dis_method_list (m, ii, cols [5] - 1, last);*/
+ /*fprintf (output, "method(%d): cols[5] -> %d cols_next[5] -> %d last -> %d rows -> %d\n", next_is_valid, cols[5], cols_next[5], last, m->tables [META_TABLE_METHOD].rows);*/
+ if (cols [5] < m->tables [META_TABLE_METHOD].rows)
+ dis_method_list (m, ii, cols [5]-1, last);
fprintf (output, " }\n}\n\n");
}
{ "--event", META_TABLE_EVENT, dump_table_event },
{ "--file", META_TABLE_FILE, dump_table_file },
{ "--moduleref", META_TABLE_MODULEREF, dump_table_moduleref },
+ { "--method", META_TABLE_METHOD, dump_table_method },
{ NULL, -1 }
};