Author: kumpera
Date: 2007-12-06 20:17:33 -0500 (Thu, 06 Dec 2007)
New Revision: 90879

Modified:
   trunk/mono/mono/metadata/ChangeLog
   trunk/mono/mono/metadata/verify.c
Log:
2007-12-06  Rodrigo Kumpera  <[EMAIL PROTECTED]>

        * verify.c (do_ldelem): refactor it to work with ldelem.any.

        * verify.c (mono_method_verify): property verification of ldelem.any.




Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog  2007-12-07 01:12:53 UTC (rev 90878)
+++ trunk/mono/mono/metadata/ChangeLog  2007-12-07 01:17:33 UTC (rev 90879)
@@ -1,5 +1,11 @@
 2007-12-06  Rodrigo Kumpera  <[EMAIL PROTECTED]>
 
+       * verify.c (do_ldelem): refactor it to work with ldelem.any.
+
+       * verify.c (mono_method_verify): property verification of ldelem.any.
+
+2007-12-06  Rodrigo Kumpera  <[EMAIL PROTECTED]>
+
        * verify.c (get_indirect_op_mono_type): renamed to 
mono_type_from_opcode,
        added ldelem.X opcodes.
 

Modified: trunk/mono/mono/metadata/verify.c
===================================================================
--- trunk/mono/mono/metadata/verify.c   2007-12-07 01:12:53 UTC (rev 90878)
+++ trunk/mono/mono/metadata/verify.c   2007-12-07 01:17:33 UTC (rev 90879)
@@ -2905,13 +2905,23 @@
 /*FIXME handle arrays that are not 0-indexed*/
 /*FIXME handle readonly prefix and CMMP*/
 static void
-do_ldelem (VerifyContext *ctx, int opcode)
+do_ldelem (VerifyContext *ctx, int opcode, int token)
 {
        ILStackDesc *index, *array;
-       MonoType *type = mono_type_from_opcode (opcode);
+       MonoType *type;
        if (!check_underflow (ctx, 2))
                return;
 
+       if (opcode == CEE_LDELEM_ANY) {
+               type = mono_type_get_full (ctx->image, token, 
ctx->generic_context);
+               if (!type) {
+                       ADD_VERIFY_ERROR (ctx, g_strdup_printf ("Type (0x%08x) 
not found at 0x%04x", token, ctx->ip_offset));
+                       return;
+               }
+       } else {
+               type = mono_type_from_opcode (opcode);
+       }
+
        index = stack_pop (ctx);
        array = stack_pop (ctx);
 
@@ -2925,6 +2935,7 @@
                        if (opcode == CEE_LDELEM_REF) {
                                if (array->type->data.klass->valuetype)
                                        CODE_NOT_VERIFIABLE (ctx, 
g_strdup_printf ("Invalid array type is not a reference type for ldelem.ref 
0x%04x", ctx->ip_offset));
+                               type = &array->type->data.klass->byval_arg;
                        } else if (!verify_type_compatibility_full (ctx, type, 
&array->type->data.klass->byval_arg, TRUE)) {
                                CODE_NOT_VERIFIABLE (ctx, g_strdup_printf 
("Invalid array type on stack for ldelem.X at 0x%04x", ctx->ip_offset));
                        }
@@ -3569,7 +3580,7 @@
                case CEE_LDELEM_R4:
                case CEE_LDELEM_R8:
                case CEE_LDELEM_REF:
-                       do_ldelem (&ctx, *ip);
+                       do_ldelem (&ctx, *ip, 0);
                        ++ip;
                        break;
 
@@ -3586,7 +3597,12 @@
                        ctx.eval.size -= 3;
                        ++ip;
                        break;
+
                case CEE_LDELEM_ANY:
+                       do_ldelem (&ctx, *ip, read32 (ip + 1));
+                       ip += 5;
+                       break;
+
                case CEE_STELEM_ANY:
                case CEE_UNBOX_ANY:
                case CEE_UNUSED5:

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to