2004-12-09 Martin Baulig <martin@ximian.com>
authorMartin Baulig <martin@novell.com>
Thu, 9 Dec 2004 19:08:50 +0000 (19:08 -0000)
committerMartin Baulig <martin@novell.com>
Thu, 9 Dec 2004 19:08:50 +0000 (19:08 -0000)
* get.c (get_generic_param): Take a `MonoGenericContainer *' and
use it to print things instead of manually parsing the metadata.

* main.c (dis_generic_param_and_constraints): Removed, use
get_generic_param() instead.
(dis_method_list): Added `MonoGenericContext *' argument.

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

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

index 2e42a51fb9c9e73233b8644dd76e11ac24ae5826..39a45d42a4e7b9532ac8af039e0036136a6422b1 100644 (file)
@@ -1,3 +1,11 @@
+2004-12-09  Martin Baulig  <martin@ximian.com>
+
+       * get.c (get_generic_param): Take a `MonoGenericContainer *' and
+       use it to print things instead of manually parsing the metadata.
+
+       * main.c (dis_generic_param_and_constraints): Removed, use
+       get_generic_param() instead.
+       (dis_method_list): Added `MonoGenericContext *' argument.
 
 Mon Dec 6 13:31:48 CET 2004 Paolo Molaro <lupus@ximian.com>
 
index 5fa56fe0b963344b05b28dec99d5148fa6743270..12882942d2d404e68963bbed97f19097d80086a2 100644 (file)
@@ -551,37 +551,47 @@ dis_stringify_param (MonoImage *m, MonoType *param)
  * Returns: Allocated stringified generic parameters
  */
 char*
-get_generic_param (MonoImage *m, int table_type, guint32 row)
+get_generic_param (MonoImage *m, MonoGenericContainer *container)
 {
-        MonoTableInfo *t = &m->tables [MONO_TABLE_GENERICPARAM];
-        GString *result = g_string_new ("");
-        char *retval;
-       guint32 cols [MONO_GENERICPARAM_SIZE];
-       int i, own_tok, table, idx, found_count;
+        GString *result;
+       char *retval;
+       int i;
 
-        g_assert (table_type != MONO_TYPEORMETHOD_TYPE || table_type != MONO_TYPEORMETHOD_METHOD);
-        
-        found_count = 0;
-       for (i = 1; i <= t->rows; i++) {
-               mono_metadata_decode_row (t, i-1, cols, MONO_GENERICPARAM_SIZE);
-                own_tok = cols [MONO_GENERICPARAM_OWNER];
-                table = own_tok & MONO_TYPEORMETHOD_MASK;
-                idx = own_tok >> MONO_TYPEORMETHOD_BITS;
-                
-                if (table != table_type || idx != row)
-                        continue;
-
-                if (found_count == 0)
-                        g_string_append_printf (result, "<%s",
-                                        mono_metadata_string_heap (m, cols [MONO_GENERICPARAM_NAME]));
-                else
-                        g_string_append_printf (result, ", %s",
-                                        mono_metadata_string_heap (m, cols [MONO_GENERICPARAM_NAME]));
-                found_count++;
+       if (!container)
+               return NULL;
+
+       result = g_string_new ("");
+
+       g_string_append_c (result, '<');
+       for (i = 0; i < container->type_argc; i++) {
+               MonoGenericParam *param = &container->type_params [i];
+               MonoClass **constr;
+               guint16 flags;
+
+               if (i > 0)
+                       g_string_append (result, ", ");
+
+               flags = param->flags & GENERIC_PARAMETER_ATTRIBUTE_SPECIAL_CONSTRAINTS_MASK;
+               if (flags == GENERIC_PARAMETER_ATTRIBUTE_REFERENCE_TYPE_CONSTRAINT)
+                       g_string_append (result, "class ");
+               else if (flags == GENERIC_PARAMETER_ATTRIBUTE_VALUE_TYPE_CONSTRAINT)
+                       g_string_append (result, "valuetype ");
+               else if (flags == GENERIC_PARAMETER_ATTRIBUTE_CONSTRUCTOR_CONSTRAINT)
+                       g_string_append (result, ".ctor ");
+
+               for (constr = param->constraints; constr && *constr; constr++) {
+                       char *sig;
+
+                       sig = dis_stringify_object_with_class (m, *constr, FALSE);
+                       g_string_append_printf (result, "(%s) ", sig);
+                       g_free (sig);
+                }
+
+               g_string_append (result, param->name);
        }
 
-        if (found_count)
-                g_string_append_c (result, '>');
+       g_string_append_c (result, '>');
+
         retval = result->str;
         g_string_free (result, FALSE);
         return retval;
@@ -599,11 +609,14 @@ dis_stringify_method_signature (MonoImage *m, MonoMethodSignature *method, int m
        char *type = NULL;
        char *gen_param = NULL;
        GString *result = g_string_new ("");
+       MonoGenericContainer *container = NULL;
        int i;
         
        g_assert (method || methoddef_row);
 
        if (methoddef_row) {
+               container = mono_metadata_load_generic_params (m, MONO_TOKEN_METHOD_DEF | methoddef_row);
+
                mono_metadata_decode_row (&m->tables [MONO_TABLE_METHOD], methoddef_row -1, cols, MONO_METHOD_SIZE);
                if (fully_qualified)
                        type = get_typedef (m, mono_metadata_typedef_from_method (m, methoddef_row));
@@ -612,10 +625,11 @@ dis_stringify_method_signature (MonoImage *m, MonoMethodSignature *method, int m
                if (!method) {
                        const char *sig = mono_metadata_blob_heap (m, cols [MONO_METHOD_SIGNATURE]);
                        mono_metadata_decode_blob_size (sig, &sig);
-                       method = mono_metadata_parse_method_signature (m, methoddef_row, sig, &sig);
+                       method = mono_metadata_parse_method_signature_full (
+                               m, (MonoGenericContext *) container, methoddef_row, sig, &sig);
                        free_method = 1;
                }      
-                gen_param = get_generic_param (m, 1, methoddef_row);
+                gen_param = get_generic_param (m, container);
        }
        
        retval = dis_stringify_param (m, method->ret);
@@ -720,7 +734,7 @@ char *
 dis_stringify_object_with_class (MonoImage *m, MonoClass *c, gboolean prefix)
 {
        /* FIXME: handle MONO_TYPE_OBJECT ... */
-       const char *otype = c->byval_arg.type == MONO_TYPE_VALUETYPE ? "valuetype" : "class" ;
+       const char *otype = c->byval_arg.type == MONO_TYPE_VALUETYPE ? "valuetype " : "class " ;
        char *assemblyref = NULL, *result, *esname, *generic = NULL;
        
        if (m != c->image) {
@@ -762,7 +776,7 @@ dis_stringify_object_with_class (MonoImage *m, MonoClass *c, gboolean prefix)
        }
 
 
-       result = g_strdup_printf ("%s %s%s%s", prefix ? otype : "", assemblyref?assemblyref:"",
+       result = g_strdup_printf ("%s%s%s%s", prefix ? otype : "", assemblyref?assemblyref:"",
                                  esname, generic?generic:"");
        
        g_free (generic);
index d16f456f351d257fe2d575f19f5e563f950a3f39..8ee0245cea7ea927039080f0792fd086bdeb9d56 100644 (file)
@@ -27,7 +27,7 @@ char *get_method              (MonoImage *m, guint32 token);
 char *get_method_type_param   (MonoImage *m, guint32 blob_signature);
 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_generic_param       (MonoImage *m, MonoGenericContainer *container);
 char *get_escaped_name        (const char *name);
 char *get_method_override     (MonoImage *m, guint32 token);
 
index 13583f14cb1c0f52539489eadc827deef8a07451..25fffa5138b66ca22645839e48e65d6732f64dd1 100644 (file)
@@ -23,6 +23,8 @@
 #include "dump.h"
 #include "get.h"
 #include "dis-cil.h"
+#include <mono/metadata/class-internals.h>
+#include <mono/metadata/object-internals.h>
 #include <mono/metadata/loader.h>
 #include <mono/metadata/assembly.h>
 #include <mono/metadata/appdomain.h>
@@ -729,7 +731,7 @@ dump_cattrs_for_method_params (MonoImage *m, guint32 midx, MonoMethodSignature *
  * This routine displays the methods in the Method Table from @start to @end
  */
 static void
-dis_method_list (const char *klass_name, MonoImage *m, guint32 start, guint32 end)
+dis_method_list (const char *klass_name, MonoImage *m, guint32 start, guint32 end, MonoGenericContext *context)
 {
        MonoTableInfo *t = &m->tables [MONO_TABLE_METHOD];
        guint32 cols [MONO_METHOD_SIZE];
@@ -757,7 +759,7 @@ dis_method_list (const char *klass_name, MonoImage *m, guint32 start, guint32 en
 
                sig = mono_metadata_blob_heap (m, cols [MONO_METHOD_SIGNATURE]);
                mono_metadata_decode_blob_size (sig, &sig);
-               ms = mono_metadata_parse_method_signature (m, i + 1, sig, &sig);
+               ms = mono_metadata_parse_method_signature_full (m, context, i + 1, sig, &sig);
                sig_str = dis_stringify_method_signature (m, ms, i + 1, FALSE);
 
                fprintf (output, "    // method line %d\n", i + 1);
@@ -1028,67 +1030,6 @@ dis_interfaces (MonoImage *m, guint32 typedef_row)
        }
 }
 
-/**
- * dis_generic_param_and_constraints:
- * @m: metadata context
- * @table_type: Type of table (0 for typedef, 1 for methoddef)
- * @row: Row in table
- *
- * Dissasembles the generic parameters for this type or method, also
- * returns an allocated GString containing the generic constraints NULL
- * if their are no generic constraints.
- */
-static GString*
-dis_generic_param_and_constraints (MonoImage *m, int table_type, guint32 typedef_row)
-{
-        MonoTableInfo *t = &m->tables [MONO_TABLE_GENERICPARAM];
-        MonoTableInfo *ct = &m->tables [MONO_TABLE_GENERICPARAMCONSTRAINT];
-        GString* cnst_block = NULL;
-       guint32 cols [MONO_GENERICPARAM_SIZE];
-        guint32 ccols [MONO_GENPARCONSTRAINT_SIZE];
-       int i, own_tok, table, idx, found_count, cnst_start, cnst_ind;
-
-        g_assert (table_type != MONO_TYPEORMETHOD_TYPE || table_type != MONO_TYPEORMETHOD_METHOD);
-        
-        found_count = cnst_start = 0;
-       for (i = 1; i <= t->rows; i++) {
-               mono_metadata_decode_row (t, i-1, cols, MONO_GENERICPARAM_SIZE);
-                own_tok = cols [MONO_GENERICPARAM_OWNER];
-                table = own_tok & MONO_TYPEORMETHOD_MASK;
-                idx = own_tok >> MONO_TYPEORMETHOD_BITS;
-                
-                if (table != table_type || idx != typedef_row)
-                        continue;
-
-                if (found_count == 0)
-                        fprintf (output, "<");
-                else
-                        fprintf (output, ", ");
-
-                for (cnst_ind = cnst_start; cnst_ind < ct->rows; cnst_ind++) {
-                        char *sig;
-                        mono_metadata_decode_row (ct, cnst_ind, ccols, MONO_GENPARCONSTRAINT_SIZE);
-                        if (ccols [MONO_GENPARCONSTRAINT_GENERICPAR] != i)
-                                continue;
-                        if (cnst_block == NULL)
-                                cnst_block = g_string_new ("");
-                        sig = get_typedef_or_ref (m, ccols [MONO_GENPARCONSTRAINT_CONSTRAINT]);
-                       fprintf (output, "(%s) ", sig);
-                        g_free (sig);
-                        cnst_start = cnst_ind;
-                }
-
-               fprintf (output, "%s", mono_metadata_string_heap (m, cols [MONO_GENERICPARAM_NAME]));
-               
-                found_count++;
-       }
-
-        if (found_count)
-                fprintf (output, ">");
-
-        return cnst_block;
-}
-
 /**
  * dis_type:
  * @m: metadata context
@@ -1100,11 +1041,11 @@ static void
 dis_type (MonoImage *m, int n)
 {
        MonoTableInfo *t = &m->tables [MONO_TABLE_TYPEDEF];
-        GString *cnst_block = NULL;
        guint32 cols [MONO_TYPEDEF_SIZE];
        guint32 cols_next [MONO_TYPEDEF_SIZE];
        const char *name, *nspace;
-       char *esname;
+       char *esname, *param;
+       MonoGenericContainer *container;
        guint32 packing_size, class_size;
        gboolean next_is_valid, last;
        guint32 nested;
@@ -1124,11 +1065,17 @@ dis_type (MonoImage *m, int n)
        if (*nspace)
                fprintf (output, ".namespace %s\n{\n", nspace);
 
+       container = mono_metadata_load_generic_params (m, MONO_TOKEN_TYPE_DEF | (n + 1));
+
        esname = get_escaped_name (name);
        if ((cols [MONO_TYPEDEF_FLAGS] & TYPE_ATTRIBUTE_CLASS_SEMANTIC_MASK) == TYPE_ATTRIBUTE_CLASS){
                fprintf (output, "  .class %s%s", typedef_flags (cols [MONO_TYPEDEF_FLAGS]), esname);
                
-                cnst_block = dis_generic_param_and_constraints (m, MONO_TYPEORMETHOD_TYPE, n+1);
+                param = get_generic_param (m, container);
+               if (param) {
+                       fprintf (output, param);
+                       g_free (param);
+               }
                 fprintf (output, "\n");
                if (cols [MONO_TYPEDEF_EXTENDS]) {
                        char *base = get_typedef_or_ref (m, cols [MONO_TYPEDEF_EXTENDS]);
@@ -1138,17 +1085,17 @@ dis_type (MonoImage *m, int n)
        } 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);
+                param = get_generic_param (m, container);
+               if (param) {
+                       fprintf (output, param);
+                       g_free (param);
+               }
                fprintf (output, "\n");
        }
 
        g_free (esname);
        dis_interfaces (m, n + 1);
        fprintf (output, "  {\n");
-        if (cnst_block) {
-                fprintf (output, "%s", cnst_block->str);
-                g_string_free (cnst_block, TRUE);
-        }
        dump_cattrs (m, MONO_TOKEN_TYPE_DEF | (n + 1), "    ");
        dump_declarative_security (m, OBJECT_TYPE_TYPEDEF, (n + 1), "    ");
 
@@ -1176,7 +1123,7 @@ dis_type (MonoImage *m, int n)
                last = m->tables [MONO_TABLE_METHOD].rows;
        
        if (cols [MONO_TYPEDEF_METHOD_LIST] && cols [MONO_TYPEDEF_METHOD_LIST] <= m->tables [MONO_TABLE_METHOD].rows)
-               dis_method_list (name, m, cols [MONO_TYPEDEF_METHOD_LIST] - 1, last);
+               dis_method_list (name, m, cols [MONO_TYPEDEF_METHOD_LIST] - 1, last, (MonoGenericContext *) container);
 
        dis_property_list (m, n);
        dis_event_list (m, n);
@@ -1240,7 +1187,7 @@ dis_globals (MonoImage *m)
                last = m->tables [MONO_TABLE_METHOD].rows;
        
        if (cols [MONO_TYPEDEF_METHOD_LIST] && cols [MONO_TYPEDEF_METHOD_LIST] <= m->tables [MONO_TABLE_METHOD].rows)
-               dis_method_list (name, m, cols [MONO_TYPEDEF_METHOD_LIST] - 1, last);
+               dis_method_list (name, m, cols [MONO_TYPEDEF_METHOD_LIST] - 1, last, NULL);
 
 }