Skip to content

Commit 4516c27

Browse files
committed
[mono][interp] Add unbox when calling valuetype method through delegate
If we are calling an open instance delegate, where the target method is on a valuetype, we will need to unbox this pointer.
1 parent 1a37caf commit 4516c27

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

src/mono/mono/mini/interp/interp.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3975,7 +3975,12 @@ mono_interp_exec_method (InterpFrame *frame, ThreadContext *context, FrameClause
39753975
} else if ((m_method_is_virtual (del_imethod->method) && !m_method_is_static (del_imethod->method)) && !del->target && !m_class_is_valuetype (del_imethod->method->klass)) {
39763976
// 'this' is passed dynamically, we need to recompute the target method
39773977
// with each call
3978-
del_imethod = get_virtual_method (del_imethod, LOCAL_VAR (call_args_offset + MINT_STACK_SLOT_SIZE, MonoObject*)->vtable);
3978+
MonoObject *obj = LOCAL_VAR (call_args_offset + MINT_STACK_SLOT_SIZE, MonoObject*);
3979+
del_imethod = get_virtual_method (del_imethod, obj->vtable);
3980+
if (m_class_is_valuetype (del_imethod->method->klass)) {
3981+
// We are calling into a value type method, `this` needs to be unboxed
3982+
LOCAL_VAR (call_args_offset + MINT_STACK_SLOT_SIZE, gpointer) = mono_object_unbox_internal (obj);
3983+
}
39793984
} else {
39803985
del->interp_invoke_impl = del_imethod;
39813986
}

0 commit comments

Comments
 (0)