Author: zoltan
Date: 2005-03-01 07:29:35 -0500 (Tue, 01 Mar 2005)
New Revision: 41317
Modified:
trunk/mono/mono/metadata/ChangeLog
trunk/mono/mono/metadata/metadata.c
trunk/mono/mono/metadata/metadata.h
trunk/mono/mono/metadata/reflection.c
Log:
2005-03-01 Zoltan Varga <[EMAIL PROTECTED]>
* metadata.h (MonoMarshalSpec): Add elem_mult field.
* metadata.c reflection.c: Load/Emit elem_mult as well.
Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog 2005-03-01 12:18:55 UTC (rev 41316)
+++ trunk/mono/mono/metadata/ChangeLog 2005-03-01 12:29:35 UTC (rev 41317)
@@ -1,5 +1,9 @@
2005-03-01 Zoltan Varga <[EMAIL PROTECTED]>
+ * metadata.h (MonoMarshalSpec): Add elem_mult field.
+
+ * metadata.c reflection.c: Load/Emit elem_mult as well.
+
* metadata.h (MonoMarshalSpec): Add comment.
* metadata.h: Add MONO_MARSHAL_CONV_LPTSTR_STR.
Modified: trunk/mono/mono/metadata/metadata.c
===================================================================
--- trunk/mono/mono/metadata/metadata.c 2005-03-01 12:18:55 UTC (rev 41316)
+++ trunk/mono/mono/metadata/metadata.c 2005-03-01 12:29:35 UTC (rev 41317)
@@ -3427,6 +3427,7 @@
if (res->native == MONO_NATIVE_LPARRAY) {
res->data.array_data.param_num = -1;
res->data.array_data.num_elem = -1;
+ res->data.array_data.elem_mult = -1;
if (ptr - start <= len)
res->data.array_data.elem_type = *ptr++;
@@ -3434,6 +3435,18 @@
res->data.array_data.param_num =
mono_metadata_decode_value (ptr, &ptr);
if (ptr - start <= len)
res->data.array_data.num_elem =
mono_metadata_decode_value (ptr, &ptr);
+ if (ptr - start <= len) {
+ /*
+ * LAMESPEC: Older spec versions say this parameter
comes before
+ * num_elem. Never spec versions don't talk about
elem_mult at
+ * all, but csc still emits it, and it is used to
distinguish
+ * between param_num being 0, and param_num being
omitted.
+ * So if (param_num == 0) && (num_elem > 0), then
+ * elem_mult == 0 -> the array size is num_elem
+ * elem_mult == 1 -> the array size is @param_num +
num_elem
+ */
+ res->data.array_data.elem_mult =
mono_metadata_decode_value (ptr, &ptr);
+ }
}
if (res->native == MONO_NATIVE_BYVALTSTR) {
Modified: trunk/mono/mono/metadata/metadata.h
===================================================================
--- trunk/mono/mono/metadata/metadata.h 2005-03-01 12:18:55 UTC (rev 41316)
+++ trunk/mono/mono/metadata/metadata.h 2005-03-01 12:29:35 UTC (rev 41317)
@@ -126,8 +126,9 @@
union {
struct {
MonoMarshalNative elem_type;
- gint32 param_num; /* -1 if not set */
gint32 num_elem; /* -1 if not set */
+ gint16 param_num; /* -1 if not set */
+ gint16 elem_mult; /* -1 if not set */
} array_data;
struct {
char *custom_name;
Modified: trunk/mono/mono/metadata/reflection.c
===================================================================
--- trunk/mono/mono/metadata/reflection.c 2005-03-01 12:18:55 UTC (rev
41316)
+++ trunk/mono/mono/metadata/reflection.c 2005-03-01 12:29:35 UTC (rev
41317)
@@ -1636,8 +1636,20 @@
if (minfo->eltype || minfo->has_size) {
mono_metadata_encode_value (minfo->eltype, p, &p);
if (minfo->has_size) {
- mono_metadata_encode_value (minfo->param_num,
p, &p);
- mono_metadata_encode_value (minfo->count, p,
&p);
+ if (minfo->param_num != -1)
+ mono_metadata_encode_value
(minfo->param_num, p, &p);
+ else
+ mono_metadata_encode_value (0, p, &p);
+ if (minfo->count != -1)
+ mono_metadata_encode_value
(minfo->count, p, &p);
+ else
+ mono_metadata_encode_value (0, p, &p);
+
+ /* LAMESPEC: ElemMult is undocumented */
+ if (minfo->param_num != -1)
+ mono_metadata_encode_value (1, p, &p);
+ else
+ mono_metadata_encode_value (0, p, &p);
}
}
break;
@@ -7604,8 +7616,16 @@
switch (minfo->type) {
case MONO_NATIVE_LPARRAY:
res->data.array_data.elem_type = minfo->eltype;
- res->data.array_data.param_num = 0; /* Not yet */
- res->data.array_data.num_elem = minfo->count;
+ if (minfo->has_size) {
+ res->data.array_data.param_num = minfo->param_num;
+ res->data.array_data.num_elem = minfo->count;
+ res->data.array_data.elem_mult = minfo->param_num == -1
? 0 : 1;
+ }
+ else {
+ res->data.array_data.param_num = -1;
+ res->data.array_data.num_elem = -1;
+ res->data.array_data.elem_mult = -1;
+ }
break;
case MONO_NATIVE_BYVALTSTR:
@@ -7649,6 +7669,7 @@
case MONO_NATIVE_LPARRAY:
minfo->eltype = spec->data.array_data.elem_type;
minfo->count = spec->data.array_data.num_elem;
+ minfo->param_num = spec->data.array_data.param_num;
break;
case MONO_NATIVE_BYVALTSTR:
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches