Skip to content

Commit 18920a8

Browse files
lewurmmonojenkins
authored andcommitted
[interp] track valuetype stack for CEE_RET too (#17984)
[2019-10] [interp] track valuetype stack for CEE_RET too Backport of #17968 Fixes #17924
1 parent 6164496 commit 18920a8

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

mono/mini/iltests.il

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3308,6 +3308,56 @@ L_3:
33083308
ret
33093309
}
33103310

3311+
.method private hidebysig static valuetype [mscorlib]System.Nullable`1<int32> ret_some_vt(int32 val) cil managed
3312+
{
3313+
.maxstack 8
3314+
ldarg.0
3315+
newobj instance void valuetype [mscorlib]System.Nullable`1<int32>::.ctor(!0)
3316+
ldarg.0
3317+
ldc.i4.0
3318+
ble.s second_vt
3319+
3320+
ldarg.0
3321+
ldc.i4.s 40
3322+
add
3323+
newobj instance void valuetype [mscorlib]System.Nullable`1<int32>::.ctor(!0)
3324+
pop
3325+
ret
3326+
3327+
second_vt_2:
3328+
ldarg.0
3329+
ldc.i4.s 30
3330+
add
3331+
newobj instance void valuetype [mscorlib]System.Nullable`1<int32>::.ctor(!0)
3332+
ret
3333+
3334+
second_vt:
3335+
pop
3336+
br second_vt_2
3337+
}
3338+
3339+
// https://github.com/mono/mono/issues/17924
3340+
.method static public int32 test_0_vt_sp_tracking () cil managed
3341+
{
3342+
.maxstack 2
3343+
.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0)
3344+
3345+
ldc.i4.s 10
3346+
call valuetype [mscorlib]System.Nullable`1<int32> Tests::ret_some_vt(int32)
3347+
stloc.0
3348+
ldloca.s V_0
3349+
call instance !0 valuetype [mscorlib]System.Nullable`1<int32>::get_Value()
3350+
ldc.i4.s 10
3351+
bne.un.s wrong
3352+
3353+
ldc.i4.0
3354+
ret
3355+
3356+
wrong:
3357+
ldc.i4.1
3358+
ret
3359+
}
3360+
33113361
.method public hidebysig static int32 test_10_rconv_to_u8_ovf_un() cil managed
33123362
{
33133363
// Code size 20 (0x14)

mono/mini/interp/transform.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3531,13 +3531,15 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header,
35313531
if (ult->type == MONO_TYPE_VOID)
35323532
vt_size = -1;
35333533
WRITE32_INS (td->last_ins, 0, &vt_size);
3534+
POP_VT (td, vt_size);
35343535
++td->ip;
35353536
} else {
35363537
if (vt_size == 0)
35373538
SIMPLE_OP(td, ult->type == MONO_TYPE_VOID ? MINT_RET_VOID : MINT_RET);
35383539
else {
35393540
interp_add_ins (td, MINT_RET_VT);
35403541
WRITE32_INS (td->last_ins, 0, &vt_size);
3542+
POP_VT (td, vt_size);
35413543
++td->ip;
35423544
}
35433545
}

0 commit comments

Comments
 (0)