2004-07-21 Bernie Solomon <bernard@ugsolutions.com>
authorBernie Solomon <bernard@mono-cvs.ximian.com>
Wed, 21 Jul 2004 19:07:55 +0000 (19:07 -0000)
committerBernie Solomon <bernard@mono-cvs.ximian.com>
Wed, 21 Jul 2004 19:07:55 +0000 (19:07 -0000)
* mintops.def: add MINT_DUP_VT

* transform.c (generate): cope with CEE_DUP on value type

* interp.c (ves_exec_method_with_context): implement MINT_DUP_VT
(interp_mono_runtime_invoke): don't unbox this for valuetypes
here as it is now done in the callers.

svn path=/trunk/mono/; revision=31346

mono/interpreter/interp.c
mono/interpreter/mintops.def
mono/interpreter/transform.c

index ab38ae4ff37ab1f2146a5505011fd20f4059e501..f00dc44559092e378cdbecb41080417cf027950f 100644 (file)
@@ -1164,10 +1164,6 @@ handle_enum:
                }
        }
 
-       if (method->klass->valuetype && obj)
-               /* Unbox the instance, since valuetype methods expect an interior pointer. */
-               obj = mono_object_unbox (obj);
-
        if (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) 
                method = mono_marshal_get_native_wrapper (method);
        INIT_FRAME(&frame,context->current_frame,obj,args,&result,method);
@@ -1467,6 +1463,14 @@ ves_exec_method_with_context (MonoInvocation *frame, ThreadContext *context)
                        ++sp;
                        ++ip; 
                        MINT_IN_BREAK;
+               MINT_IN_CASE(MINT_DUP_VT)
+                       i32 = READ32 (ip + 1);
+                       sp->data.p = vt_sp;
+                       memcpy(sp->data.p, sp [-1].data.p, i32);
+                       vt_sp += (i32 + 7) & ~7;
+                       ++sp;
+                       ip += 3;
+                       MINT_IN_BREAK;
                MINT_IN_CASE(MINT_POP)
                        ++ip;
                        --sp;
index a82f69e14d058772948ed81b222c85039cd01210..6b630cc4cda8aae5fe1464ba51feec6b96900539 100644 (file)
@@ -12,6 +12,7 @@ OPDEF(MINT_NOP, "nop", 1, MintOpNoArgs)
 OPDEF(MINT_BREAK, "break", 1, MintOpNoArgs)
 OPDEF(MINT_LDNULL, "ldnull", 1, MintOpNoArgs)
 OPDEF(MINT_DUP, "dup", 1, MintOpNoArgs)
+OPDEF(MINT_DUP_VT, "dup.vt", 3, MintOpInt)
 OPDEF(MINT_POP, "pop", 1, MintOpNoArgs)
 
 OPDEF(MINT_RET, "ret", 1, MintOpNoArgs)
index 145a65f3ebe18f788642225057b1ca9693fd8f3b..824575f8c25262d3ba8e5fd176ab61f6a4b0f4af 100644 (file)
@@ -907,9 +907,14 @@ generate(MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start)
                case CEE_DUP: {
                        int type = td.sp [-1].type;
                        MonoClass *klass = td.sp [-1].klass;
-                       if (td.sp [-1].type == STACK_TYPE_VT)
-                               g_warning ("dup of value type not implemented");
-                       SIMPLE_OP(td, MINT_DUP);
+                       if (td.sp [-1].type == STACK_TYPE_VT) {
+                               gint32 size = mono_class_value_size (klass, NULL);
+                               PUSH_VT(&td, size);
+                               ADD_CODE(&td, MINT_DUP_VT);
+                               WRITE32(&td, &size);
+                               td.ip ++;
+                       } else 
+                               SIMPLE_OP(td, MINT_DUP);
                        PUSH_TYPE(&td, type, klass);
                        break;
                }