Record parameter names for wrapper methods so they could be seen in xdebug.
authorZoltan Varga <vargaz@gmail.com>
Fri, 1 Apr 2011 06:20:33 +0000 (08:20 +0200)
committerZoltan Varga <vargaz@gmail.com>
Fri, 1 Apr 2011 06:22:43 +0000 (08:22 +0200)
mono/metadata/image.c
mono/metadata/loader.c
mono/metadata/marshal.c
mono/metadata/metadata-internals.h
mono/metadata/method-builder.c
mono/metadata/method-builder.h

index ef904dad143dbb90a4357cccf3c090a24c424f8f..41a0e48d43884be96cbe52657fbb0eb7ffac9f71 100644 (file)
@@ -1627,6 +1627,7 @@ mono_image_close_except_pools (MonoImage *image)
        free_hash (image->thunk_invoke_cache);
        free_hash (image->var_cache_slow);
        free_hash (image->mvar_cache_slow);
+       free_hash (image->wrapper_param_names);
 
        /* The ownership of signatures is not well defined */
        //g_hash_table_foreach (image->memberref_signatures, free_mr_signatures, NULL);
index 8d5cd485c5a31037b28001d70d69c3c57953a08e..b30700959b8a324226c3632aa4ac85445fce9bc1 100644 (file)
@@ -1895,6 +1895,21 @@ mono_method_get_param_names (MonoMethod *method, const char **names)
                return;
        }
 
+       if (method->wrapper_type) {
+               char **pnames = NULL;
+
+               mono_image_lock (klass->image);
+               if (klass->image->wrapper_param_names)
+                       pnames = g_hash_table_lookup (klass->image->wrapper_param_names, method);
+               mono_image_unlock (klass->image);
+
+               if (pnames) {
+                       for (i = 0; i < signature->param_count; ++i)
+                               names [i] = pnames [i];
+               }
+               return;
+       }
+
        methodt = &klass->image->tables [MONO_TABLE_METHOD];
        paramt = &klass->image->tables [MONO_TABLE_PARAM];
        idx = mono_method_get_index (method);
index 0e6a259a4376a1f5abaf7352ece91310eae26458..8f7e3df44caf1eb42efa5b03d60f7c35c3c5971e 100644 (file)
@@ -4496,6 +4496,7 @@ mono_marshal_get_runtime_invoke (MonoMethod *method, gboolean virtual)
        static MonoMethodSignature *cctor_signature = NULL;
        static MonoMethodSignature *finalize_signature = NULL;
        char *name;
+       const char *param_names [16];
        gboolean need_direct_wrapper = FALSE;
 
        g_assert (method);
@@ -4617,6 +4618,12 @@ mono_marshal_get_runtime_invoke (MonoMethod *method, gboolean virtual)
        mb = mono_mb_new (target_klass, name,  MONO_WRAPPER_RUNTIME_INVOKE);
        g_free (name);
 
+       param_names [0] = "this";
+       param_names [1] = "params";
+       param_names [2] = "exc";
+       param_names [3] = "method";
+       mono_mb_set_param_names (mb, param_names);
+
        emit_runtime_invoke_body (mb, target_klass, method, sig, callsig, virtual, need_direct_wrapper);
 
        if (need_direct_wrapper) {
@@ -9784,7 +9791,7 @@ mono_marshal_get_virtual_stelemref (MonoClass *array_class)
        MonoMethod *res;
        int kind;
        char *name;
-
+       const char *param_names [16];
        guint32 b1, b2, b3;
        int aklass, vklass, vtable, uiid;
        int array_slot_addr;
@@ -9799,6 +9806,10 @@ mono_marshal_get_virtual_stelemref (MonoClass *array_class)
        mb = mono_mb_new (mono_defaults.object_class, name, MONO_WRAPPER_STELEMREF);
        g_free (name);
 
+       param_names [0] = "index";
+       param_names [1] = "value";
+       mono_mb_set_param_names (mb, param_names);
+
        if (!signature) {
                MonoMethodSignature *sig = mono_metadata_signature_alloc (mono_defaults.corlib, 2);
 
index 4a4ff17e5e81a7433469f1b2c9681085062e66ae..8491c4f3d4827eb8ea76bedffd5d0e1ab3f691dd 100644 (file)
@@ -278,6 +278,7 @@ struct _MonoImage {
        GHashTable *cominterop_invoke_cache;
        GHashTable *cominterop_wrapper_cache; /* LOCKING: marshal lock */
        GHashTable *thunk_invoke_cache;
+       GHashTable *wrapper_param_names;
 
        /*
         * indexed by MonoClass pointers
index 247c749bdedad87bad1932fc978dea8bb7f81eb9..c0796ffbfe722b1192afaba0f02c19d7e169c1c3 100644 (file)
@@ -226,6 +226,18 @@ mono_mb_create_method (MonoMethodBuilder *mb, MonoMethodSignature *signature, in
        printf ("%s\n", mono_disasm_code (&marshal_dh, method, mb->code, mb->code + mb->pos));
 #endif
 
+       if (mb->param_names) {
+               char **param_names = mono_image_alloc0 (image, signature->param_count * sizeof (gpointer));
+               for (i = 0; i < signature->param_count; ++i)
+                       param_names [i] = mono_image_strdup (image, mb->param_names [i]);
+
+               mono_image_lock (image);
+               if (!image->wrapper_param_names)
+                       image->wrapper_param_names = g_hash_table_new (NULL, NULL);
+               g_hash_table_insert (image->wrapper_param_names, method, param_names);
+               mono_image_unlock (image);
+       }
+
        mono_loader_unlock ();
        return method;
 }
@@ -531,3 +543,15 @@ mono_mb_set_clauses (MonoMethodBuilder *mb, int num_clauses, MonoExceptionClause
        mb->num_clauses = num_clauses;
        mb->clauses = clauses;
 }
+
+/*
+ * mono_mb_set_param_names:
+ *
+ *   PARAM_NAMES should have length equal to the sig->param_count, the caller retains
+ * ownership of the array, and its entries.
+ */
+void
+mono_mb_set_param_names (MonoMethodBuilder *mb, const char **param_names)
+{
+       mb->param_names = param_names;
+}
index 73b4e273aad4e39af6a057db92ea0298c8c3d403..d1be3c2864d1c3b82c2e5007a2dc94f7fce2edb8 100644 (file)
@@ -31,6 +31,7 @@ typedef struct _MonoMethodBuilder {
        unsigned char *code;
        int num_clauses;
        MonoExceptionClause *clauses;
+       const char **param_names;
 } MonoMethodBuilder;
 
 MonoMethodBuilder *
@@ -141,6 +142,9 @@ mono_mb_emit_ldstr (MonoMethodBuilder *mb, char *str) MONO_INTERNAL;
 void
 mono_mb_set_clauses (MonoMethodBuilder *mb, int num_clauses, MonoExceptionClause *clauses) MONO_INTERNAL;
 
+void
+mono_mb_set_param_names (MonoMethodBuilder *mb, const char **param_names) MONO_INTERNAL;
+
 G_END_DECLS
 
 #endif /* __MONO_METHOD_BUILDER_H__ */