Skip to content

Commit

Permalink
[mono][interp] Fix type of args when inlining method
Browse files Browse the repository at this point in the history
The vars allocated from pushing values on the execution stack might not reflect exactly the actual type of the var. Consider this pattern:

	condbr	BB0
	newobj	Derived // push var0 of type Derived
	br	BB1
BB0:
	newobj	Base	// push var1 of type Base
	// here we will end up inserting a `mov var1 -> var0`
BB1:
	// top of stack will be seen as being var0
	call

Because we first reach BB1 with the stack contents of var0, BB1 will end up accessing top of the stack as var0. However the type of var0 at this point is not Derived, since it can also be a Base object. We currently don't update the type of var0, but just update the type information of the top of stack entry when entering BB1. When inlining, after this commit, we use the type information from the stack, rather than the type of the var present on the stack.

In the future we might want to consider updating the type of var0 or creating a new var entirely with the correct type for consistency.
  • Loading branch information
BrzVlad committed May 22, 2024
1 parent 994a410 commit 9696467
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion src/mono/mono/mini/interp/transform.c
Original file line number Diff line number Diff line change
Expand Up @@ -5143,7 +5143,7 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header,
arg_locals = (guint32*) g_malloc ((!!signature->hasthis + signature->param_count) * sizeof (guint32));
/* Allocate locals to store inlined method args from stack */
for (int i = signature->param_count - 1; i >= 0; i--) {
MonoType *type = td->vars [td->sp [-1].var].type;
MonoType *type = get_type_from_stack (td->sp [-1].type, td->sp [-1].klass);
local = interp_create_var (td, type);
arg_locals [i + !!signature->hasthis] = local;
store_local (td, local);
Expand Down

0 comments on commit 9696467

Please sign in to comment.