[2019-10] [mini] Fix delegate trampoline virtual call via delgate Invoke#18115
Merged
monojenkins merged 2 commits intomono:2019-10from Dec 10, 2019
Merged
Conversation
If we need to jit the Invoke method of a delegate, we get tramp_info with a
NULL method.
Background: normally when we create a delegate around a virtual method,
handle_delegate_ctor will just create a virtual invoke trampoline with
mono_arch_get_delegate_virtual_invoke_impl which doesn't get here. But if
we're asked to compile the delegate's Invoke method, then compile_special ()
will create a tramp_info with a null method, and return a delegate trampoline.
That's the case here - we had
var del = SomeDelegate(obj.VirtualMethod);
var invoke_method = del.GetType().GetMethod ("Invoke");
invoke_method.Invoke (del, args);
or
var del = SomeDelegate(obj.VirtualMethod);
var another_del = OtherDelegate (del.Invoke);
another_del (args);
in both cases, we end up in mono_delegate_trampoline with tramp_info->method ==
NULL.
in the second case the IL is like this:
newobj instance void Derived::'.ctor'
ldvirtftn instance void class Base::VirtualMethod()
newobj instance void class SomeDelegate::'.ctor'(object, native int)
So delegate->target is a derived instance but delegate->method is some base
class method.
Addresses mono#17718
Where the delegate calls a virtual method
lewurm
approved these changes
Dec 10, 2019
Contributor
|
@monojenkins squash |
Contributor
Author
|
Cannot squash because the following required status checks are not successful:
|
Contributor
|
@monojenkins build Linux AArch64 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
If we need to jit the Invoke method of a delegate, we get
tramp_infowith aNULL method.
Background: normally when we create a delegate around a virtual method,
handle_delegate_ctorwill just create a virtual invoke trampoline withmono_arch_get_delegate_virtual_invoke_implwhich doesn't get here. But ifwe're asked to compile the delegate's
Invokemethod, thencompile_special ()will create a
tramp_infowith a null method, and return a delegate trampoline.That's the case here - we had
or
in both cases, we end up in mono_delegate_trampoline with
tramp_info->method == NULL.in the second case the IL is like this:
So
delegate->targetis a derived instance butdelegate->methodis some baseclass method.
Addresses #17718
Backport of #18073.
/cc @lambdageek