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