[interp] clear storage for sp, vt_sp and locals properly
authorBernhard Urban <bernhard.urban@xamarin.com>
Tue, 7 Mar 2017 09:46:58 +0000 (10:46 +0100)
committerBernhard Urban <bernhard.urban@xamarin.com>
Wed, 8 Mar 2017 22:02:51 +0000 (23:02 +0100)
mono/mini/iltests.il
mono/mini/interp/interp.c

index d14483d8e2968c90b624e04abed3c9cd697aa6ef..dfad419f4ddaf90194be6d253f77979468ce8cd4 100644 (file)
@@ -1211,7 +1211,6 @@ COND:   ldloc.0
    } // end of class xxx
 
        .method public static int32 test_0_newobj_vtype () {
-               .custom instance void [TestDriver]CategoryAttribute::.ctor(string) = ( 01 00 0C 21 49 4E 54 45 52 50 52 45 54 45 52 00 00 )   // ...!INTERPRETER.
                .maxstack 6
                .locals init (
                        valuetype Tests/xxx V_0
index d881e23dfaba954d9ac2efbce915c4531a9bc123..fbb797436d389450e6aa4cc91b85c3425ce0662d 100644 (file)
@@ -1669,16 +1669,19 @@ ves_exec_method_with_context (MonoInvocation *frame, ThreadContext *context)
 
        rtm = frame->runtime_method;
        frame->args = alloca (rtm->alloca_size);
+       memset (frame->args, 0, rtm->alloca_size);
+
        sp = frame->stack = (stackval *)((char *)frame->args + rtm->args_size);
-#if DEBUG_INTERP
-       if (tracing > 1)
-               memset(sp, 0, rtm->stack_size);
-#endif
+       memset (sp, 0, rtm->stack_size);
+
        vt_sp = (unsigned char *) sp + rtm->stack_size;
+       memset (vt_sp, 0, rtm->vt_stack_size);
 #if DEBUG_INTERP
        vtalloc = vt_sp;
 #endif
+
        locals = (unsigned char *) vt_sp + rtm->vt_stack_size;
+       memset (vt_sp, 0, rtm->locals_size);
 
        child_frame.parent = frame;
 
@@ -2823,11 +2826,11 @@ ves_exec_method_with_context (MonoInvocation *frame, ThreadContext *context)
                         */
                        if (newobj_class->valuetype) {
                                MonoType *t = &newobj_class->byval_arg;
+                               memset (&valuetype_this, 0, sizeof (stackval));
                                if (!newobj_class->enumtype && (t->type == MONO_TYPE_VALUETYPE || (t->type == MONO_TYPE_GENERICINST && mono_type_generic_inst_is_valuetype (t)))) {
                                        sp->data.p = vt_sp;
                                        valuetype_this.data.p = vt_sp;
                                } else {
-                                       memset (&valuetype_this, 0, sizeof (stackval));
                                        sp->data.p = &valuetype_this;
                                }
                        } else {