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);
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);
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);
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) {
MonoMethod *res;
int kind;
char *name;
-
+ const char *param_names [16];
guint32 b1, b2, b3;
int aklass, vklass, vtable, uiid;
int array_slot_addr;
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);
GHashTable *cominterop_invoke_cache;
GHashTable *cominterop_wrapper_cache; /* LOCKING: marshal lock */
GHashTable *thunk_invoke_cache;
+ GHashTable *wrapper_param_names;
/*
* indexed by MonoClass pointers
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;
}
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;
+}
unsigned char *code;
int num_clauses;
MonoExceptionClause *clauses;
+ const char **param_names;
} MonoMethodBuilder;
MonoMethodBuilder *
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__ */