#include <string.h>
#include "mono/metadata/tokentype.h"
#include "mono/metadata/opcodes.h"
+#include "mono/metadata/class-internals.h"
#include "mono/metadata/mono-endian.h"
#include "mono/metadata/debug-helpers.h"
"managed-to-native",
"remoting-invoke",
"remoting-invoke-with-check",
+ "xdomain-invoke",
+ "xdomain-dispatch",
"ldfld",
"stfld",
+ "ldfld-remote",
+ "stfld-remote",
"synchronized",
+ "dynamic-method",
+ "isinst",
+ "cancast",
+ "proxy_isinst",
+ "stelemref",
+ "unbox",
"unknown"
};
case MONO_TYPE_VALUETYPE:
append_class_name (res, type->data.klass, include_namespace);
break;
+ case MONO_TYPE_GENERICINST:
+ mono_type_get_desc (res, &type->data.generic_class->container_class->byval_arg, include_namespace);
+ break;
default:
break;
}
g_string_append_c (res, '&');
}
+char*
+mono_type_full_name (MonoType *type)
+{
+ GString *str;
+ char *res;
+
+ str = g_string_new ("");
+ mono_type_get_desc (str, type, TRUE);
+
+ res = g_strdup (str->str);
+ g_string_free (str, TRUE);
+ return res;
+}
+
char*
mono_signature_get_desc (MonoMethodSignature *sig, gboolean include_namespace)
{
return result;
}
-/*
- * The allowed format of a method description string is:
+/**
+ * mono_method_desc_new:
+ * @name: the method name.
+ * @include_namespace: whether the name includes a namespace or not.
+ *
+ * Creates a method description for @name, which conforms to the following
+ * specification:
+ *
* [namespace.]classname:methodname[(args...)]
- * TODO: describe instance methods.
+ *
+ * in all the loaded assemblies.
+ *
+ * Returns: a parsed representation of the method description.
*/
MonoMethodDesc*
mono_method_desc_new (const char *name, gboolean include_namespace)
return result;
}
+/**
+ * mono_method_desc_free:
+ * @desc: method description to be released
+ *
+ * Releases the MonoMethodDesc object @desc.
+ */
void
mono_method_desc_free (MonoMethodDesc *desc)
{
return FALSE;
if (!desc->args)
return TRUE;
- if (desc->num_args != method->signature->param_count)
+ if (desc->num_args != mono_method_signature (method)->param_count)
return FALSE;
- sig = mono_signature_get_desc (method->signature, desc->include_namespace);
+ sig = mono_signature_get_desc (mono_method_signature (method), desc->include_namespace);
if (strcmp (sig, desc->args)) {
g_free (sig);
return FALSE;
MonoMethod*
mono_method_desc_search_in_class (MonoMethodDesc *desc, MonoClass *klass)
{
- int i;
-
- mono_class_init (klass);
- for (i = 0; i < klass->method.count; ++i) {
- if (mono_method_desc_match (desc, klass->methods [i]))
- return klass->methods [i];
- }
+ MonoMethod* m;
+ gpointer iter = NULL;
+
+ while ((m = mono_class_get_methods (klass, &iter)))
+ if (mono_method_desc_match (desc, m))
+ return m;
return NULL;
}
mono_method_desc_search_in_image (MonoMethodDesc *desc, MonoImage *image)
{
MonoClass *klass;
- MonoTableInfo *tdef;
- MonoTableInfo *methods;
+ const MonoTableInfo *tdef;
+ const MonoTableInfo *methods;
MonoMethod *method;
int i;
return mono_method_desc_search_in_class (desc, klass);
}
- tdef = &image->tables [MONO_TABLE_TYPEDEF];
- methods = &image->tables [MONO_TABLE_METHOD];
- for (i = 0; i < methods->rows; ++i) {
+ tdef = mono_image_get_table_info (image, MONO_TABLE_TYPEDEF);
+ methods = mono_image_get_table_info (image, MONO_TABLE_METHOD);
+ for (i = 0; i < mono_table_info_get_rows (methods); ++i) {
guint32 token = mono_metadata_decode_row_col (methods, i, MONO_METHOD_NAME);
const char *n = mono_metadata_string_heap (image, token);
}
static const unsigned char*
-dis_one (GString *str, MonoDisHelper *dh, MonoMethod *method, const unsigned char *ip)
+dis_one (GString *str, MonoDisHelper *dh, MonoMethod *method, const unsigned char *ip, const unsigned char *end)
{
- MonoMethodHeader *header = ((MonoMethodNormal*)method)->header;
+ MonoMethodHeader *header = mono_method_get_header (method);
const MonoOpcode *opcode;
guint32 i, label, token;
gint32 sval;
if (dh->label_format)
g_string_sprintfa (str, dh->label_format, label);
- i = mono_opcode_value (&ip);
+ i = mono_opcode_value (&ip, end);
ip++;
opcode = &mono_opcodes [i];
- g_string_sprintfa (str, "%-10s", mono_opcode_names [i]);
+ g_string_sprintfa (str, "%-10s", mono_opcode_name (i));
switch (opcode->argument) {
case MonoInlineNone:
if (!dh)
dh = &default_dh;
- ip = dis_one (res, dh, method, ip);
+ /* set ip + 2 as the end: this is just a debugging method */
+ ip = dis_one (res, dh, method, ip, ip + 2);
if (endp)
*endp = ip;
if (!dh)
dh = &default_dh;
while (ip < end) {
- ip = dis_one (res, dh, method, ip);
+ ip = dis_one (res, dh, method, ip, end);
}
result = res->str;
{
char *res;
char wrapper [64];
+ const char *nspace = method->klass->name_space;
if (signature) {
- char *tmpsig = mono_signature_get_desc (method->signature, TRUE);
+ char *tmpsig = mono_signature_get_desc (mono_method_signature (method), TRUE);
if (method->wrapper_type != MONO_WRAPPER_NONE)
sprintf (wrapper, "(wrapper %s) ", wrapper_type_to_str (method->wrapper_type));
else
- sprintf (wrapper, "");
- res = g_strdup_printf ("%s%s.%s:%s (%s)", wrapper, method->klass->name_space,
- method->klass->name, method->name, tmpsig);
+ strcpy (wrapper, "");
+ res = g_strdup_printf ("%s%s%s%s:%s (%s)", wrapper,
+ nspace, *nspace ? "." : "",
+ method->klass->name, method->name, tmpsig);
g_free (tmpsig);
} else {
- res = g_strdup_printf ("%02d %s.%s:%s", method->wrapper_type, method->klass->name_space,
- method->klass->name, method->name);
+ res = g_strdup_printf ("%02d %s%s%s:%s", method->wrapper_type,
+ nspace, *nspace ? "." : "",
+ method->klass->name, method->name);
}
return res;
}
-
-