[mini] Fix delegate trampoline virtual call via delgate Invoke#18073
Merged
lewurm merged 2 commits intomono:masterfrom Dec 10, 2019
Merged
[mini] Fix delegate trampoline virtual call via delgate Invoke#18073lewurm merged 2 commits intomono:masterfrom
lewurm merged 2 commits intomono:masterfrom
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
Contributor
|
Looks good to me. @BrzVlad could have a look at it too? |
BrzVlad
approved these changes
Dec 10, 2019
Contributor
|
@monojenkins backport 2019-12 |
Member
Author
|
@monojenkins backport to 2019-10 |
monojenkins
added a commit
that referenced
this pull request
Dec 10, 2019
…oke (#18115) [2019-10] [mini] Fix delegate trampoline virtual call via delgate Invoke 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 #17718 Backport of #18073. /cc @lambdageek
ManickaP
pushed a commit
to ManickaP/runtime
that referenced
this pull request
Jan 20, 2020
…mono#18073) * [mini] Fix delegate trampoline virtual call via delgate Invoke 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/mono#17718 * [tests] Add tests for compiling delegate's Invoke method Where the delegate calls a virtual method Commit migrated from mono/mono@7704bd1
joncham
pushed a commit
to Unity-Technologies/mono
that referenced
this pull request
Mar 16, 2021
…18073) * [mini] Fix delegate trampoline virtual call via delgate Invoke 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 * [tests] Add tests for compiling delegate's Invoke method Where the delegate calls a virtual method
joncham
added a commit
to Unity-Technologies/mono
that referenced
this pull request
Mar 17, 2021
…8422 [mini] Fix delegate trampoline virtual call via delgate Invoke (mono#18073)
dtomar-rythmos
pushed a commit
to Unity-Technologies/mono
that referenced
this pull request
Apr 8, 2021
…18073) * [mini] Fix delegate trampoline virtual call via delgate Invoke 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 * [tests] Add tests for compiling delegate's Invoke method Where the delegate calls a virtual method
dtomar-rythmos
pushed a commit
to Unity-Technologies/mono
that referenced
this pull request
Apr 8, 2021
…18073) * [mini] Fix delegate trampoline virtual call via delgate Invoke 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 * [tests] Add tests for compiling delegate's Invoke method Where the delegate calls a virtual method
dtomar-rythmos
pushed a commit
to Unity-Technologies/mono
that referenced
this pull request
Apr 8, 2021
…18073) * [mini] Fix delegate trampoline virtual call via delgate Invoke 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 * [tests] Add tests for compiling delegate's Invoke method Where the delegate calls a virtual method
dtomar-rythmos
added a commit
to Unity-Technologies/mono
that referenced
this pull request
Apr 12, 2021
…8422 [mini] Fix delegate trampoline virtual call via delgate Invoke (mono#18073)
dtomar-rythmos
added a commit
to Unity-Technologies/mono
that referenced
this pull request
Apr 12, 2021
…8422 [mini] Fix delegate trampoline virtual call via delgate Invoke (mono#18073)
dtomar-rythmos
added a commit
to Unity-Technologies/mono
that referenced
this pull request
Apr 12, 2021
…8422 [mini] Fix delegate trampoline virtual call via delgate Invoke (mono#18073)
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