Author: zoltan
Date: 2005-03-01 05:00:26 -0500 (Tue, 01 Mar 2005)
New Revision: 41314
Modified:
trunk/mono/mono/dis/ChangeLog
trunk/mono/mono/dis/get.c
Log:
2005-03-01 Zoltan Varga <[EMAIL PROTECTED]>
* get.c: Output marshal info for parameters.
Modified: trunk/mono/mono/dis/ChangeLog
===================================================================
--- trunk/mono/mono/dis/ChangeLog 2005-03-01 09:59:08 UTC (rev 41313)
+++ trunk/mono/mono/dis/ChangeLog 2005-03-01 10:00:26 UTC (rev 41314)
@@ -1,3 +1,7 @@
+2005-03-01 Zoltan Varga <[EMAIL PROTECTED]>
+
+ * get.c: Output marshal info for parameters.
+
2005-02-13 Zoltan Varga <[EMAIL PROTECTED]>
* main.c: Output managed resources as well. Fixes #72033.
Modified: trunk/mono/mono/dis/get.c
===================================================================
--- trunk/mono/mono/dis/get.c 2005-03-01 09:59:08 UTC (rev 41313)
+++ trunk/mono/mono/dis/get.c 2005-03-01 10:00:26 UTC (rev 41314)
@@ -528,9 +528,10 @@
char *t;
char *result;
char *attribs;
+ const char *in = param->attrs & PARAM_ATTRIBUTE_IN ? "[in]" : "";
const char *out = param->attrs & PARAM_ATTRIBUTE_OUT ? "[out]": "";
const char *opt = param->attrs & PARAM_ATTRIBUTE_OPTIONAL ? "[opt]": "";
- attribs = g_strconcat(out, opt, NULL);
+ attribs = g_strconcat(in, out, opt, NULL);
t = dis_stringify_type (m, param, TRUE);
result = g_strjoin(attribs[0] ? " ":"", attribs, t, NULL);
g_free (t);
@@ -538,6 +539,111 @@
return result;
}
+static char*
+dis_stringify_native_type (MonoMarshalNative native)
+{
+ switch (native) {
+ case MONO_NATIVE_BOOLEAN:
+ return g_strdup ("bool");
+ case MONO_NATIVE_I1:
+ return g_strdup ("int8");
+ case MONO_NATIVE_U1:
+ return g_strdup ("unsigned int8");
+ case MONO_NATIVE_I2:
+ return g_strdup ("int16");
+ case MONO_NATIVE_U2:
+ return g_strdup ("unsigned int16");
+ case MONO_NATIVE_I4:
+ return g_strdup ("int32");
+ case MONO_NATIVE_U4:
+ return g_strdup ("unsigned int32");
+ case MONO_NATIVE_I8:
+ return g_strdup ("int64");
+ case MONO_NATIVE_U8:
+ return g_strdup ("unsigned int64");
+ case MONO_NATIVE_R4:
+ return g_strdup ("float32");
+ case MONO_NATIVE_R8:
+ return g_strdup ("float64");
+ case MONO_NATIVE_CURRENCY:
+ return g_strdup ("currency");
+ case MONO_NATIVE_BSTR:
+ return g_strdup ("bstr");
+ case MONO_NATIVE_LPSTR:
+ return g_strdup ("lpstr");
+ case MONO_NATIVE_LPWSTR:
+ return g_strdup ("lpwstr");
+ case MONO_NATIVE_LPTSTR:
+ return g_strdup ("lptstr");
+ case MONO_NATIVE_IUNKNOWN:
+ return g_strdup ("iunknown");
+ case MONO_NATIVE_IDISPATCH:
+ return g_strdup ("idispatch");
+ case MONO_NATIVE_STRUCT:
+ return g_strdup ("struct");
+ case MONO_NATIVE_INTERFACE:
+ return g_strdup ("interface");
+ case MONO_NATIVE_SAFEARRAY:
+ return g_strdup ("safearray");
+ case MONO_NATIVE_INT:
+ return g_strdup ("int");
+ case MONO_NATIVE_UINT:
+ return g_strdup ("unsigned int");
+ case MONO_NATIVE_VBBYREFSTR:
+ return g_strdup ("vbbyrefstr");
+ case MONO_NATIVE_ANSIBSTR:
+ return g_strdup ("ansi bstr");
+ case MONO_NATIVE_TBSTR:
+ return g_strdup ("tbstr");
+ case MONO_NATIVE_VARIANTBOOL:
+ return g_strdup ("variant bool");
+ case MONO_NATIVE_FUNC:
+ return g_strdup ("method");
+ case MONO_NATIVE_ASANY:
+ return g_strdup ("as any");
+ case MONO_NATIVE_LPSTRUCT:
+ return g_strdup ("lpstruct");
+ case MONO_NATIVE_CUSTOM:
+ return g_strdup ("custom");
+ case MONO_NATIVE_ERROR:
+ return g_strdup ("error");
+ case MONO_NATIVE_MAX:
+ return g_strdup ("");
+ default:
+ return g_strdup ("unknown");
+ }
+}
+
+static char*
+dis_stringify_marshal_spec (MonoMarshalSpec *spec)
+{
+ switch (spec->native) {
+ case MONO_NATIVE_BYVALTSTR:
+ return g_strdup_printf ("fixed sysstring [%d]",
spec->data.array_data.num_elem);
+ case MONO_NATIVE_BYVALARRAY:
+ return g_strdup_printf ("fixed array [%d]",
spec->data.array_data.num_elem);
+ case MONO_NATIVE_LPARRAY: {
+ char *elem_type, *elems;
+ guint32 num_elem = spec->data.array_data.num_elem;
+ guint32 param_num = spec->data.array_data.param_num;
+
+ elem_type = dis_stringify_native_type
(spec->data.array_data.elem_type);
+ if (num_elem == -1 && param_num == -1)
+ elems = g_strdup ("");
+ else if (param_num == -1)
+ elems = g_strdup_printf ("%d", num_elem);
+ else if ((num_elem == -1) || (num_elem == 0))
+ elems = g_strdup_printf ("+ %d", param_num);
+ else
+ elems = g_strdup_printf ("%d + %d", num_elem,
param_num);
+
+ return g_strdup_printf ("%s[%s]", elem_type, elems);
+ }
+ default:
+ return dis_stringify_native_type (spec->native);
+ }
+}
+
/**
* get_generic_param
* @m: metadata context
@@ -616,6 +722,7 @@
int free_method = 0;
char *retval, *esname;
char *type = NULL;
+ char *marshal_info = NULL;
char *gen_param = NULL;
GString *result = g_string_new ("");
MonoGenericContainer *container = NULL;
@@ -671,6 +778,17 @@
mono_metadata_decode_row (&m->tables
[MONO_TABLE_PARAM], param_index - 1, pcols, MONO_PARAM_SIZE);
name = mono_metadata_string_heap (m, pcols
[MONO_PARAM_NAME]);
method->params [i]->attrs = pcols [MONO_PARAM_FLAGS];
+
+ if (pcols [MONO_PARAM_FLAGS] &
PARAM_ATTRIBUTE_HAS_FIELD_MARSHAL) {
+ const char *tp;
+ MonoMarshalSpec *spec;
+ tp = mono_metadata_get_marshal_info (m,
param_index - 1, FALSE);
+ g_assert (tp);
+ spec = mono_metadata_parse_marshal_spec (m, tp);
+
+ marshal_info = g_strdup_printf (" marshal
(%s)", dis_stringify_marshal_spec (spec));
+ }
+
param_index++;
} else {
name = "";
@@ -678,8 +796,9 @@
if (i)
g_string_append (result, ", ");
retval = dis_stringify_param (m, method->params [i]);
+
esname = get_escaped_name (name);
- g_string_append_printf (result, "%s %s", retval, esname);
+ g_string_append_printf (result, "%s %s%s", retval, esname,
marshal_info ? marshal_info : "");
g_free (retval);
g_free (esname);
}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches