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

Reply via email to