[jvm] fix self-recursing Object bridge for closures with non-Object typed return#12908
Open
kLabz wants to merge 1 commit into
Open
[jvm] fix self-recursing Object bridge for closures with non-Object typed return#12908kLabz wants to merge 1 commit into
kLabz wants to merge 1 commit into
Conversation
…yped return
When a closure's typed return is a specific reference type (e.g. SyncStats)
and a functional interface in the conversion set has an Object-erased
abstract method also named `invoke` — the shape of Function0<T>,
Callable<V> after erasure — the FI loop in jvmFunctions.generate_invoke
synthesized an `Object invoke()` bridge but pointed it at
(meth.name, meth.dargs, meth.dret). At that program point meth came from
register_signature with dret already declassified to Object, so the bridge
body emitted `invokevirtual invoke()Object` against itself. The later
`loop meth_typed` block that would have produced the proper Object→typed
bridge was then short-circuited by has_method (the slot was already taken).
First invocation StackOverflowError'd.
Forward to (meth.name, arg_sigs, ret) — the typed invoke that was actually
spawned earlier in generate_invoke — so the Object-returning bridge
dispatches to the real implementation and casts the result on return.
Repro shape (also added as a misc/jvm test extending StructuralSam):
public interface GenericInvoke<T> { T invoke(); }
Listeners.runGenericInvoke(() -> new Boxed(7));
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.
When a closure's typed return is a specific reference type (e.g. SyncStats) and a functional interface in the conversion set has an Object-erased abstract method also named
invoke— the shape of Function0, Callable after erasure — the FI loop in jvmFunctions.generate_invoke synthesized anObject invoke()bridge but pointed it at (meth.name, meth.dargs, meth.dret). At that program point meth came from register_signature with dret already declassified to Object, so the bridge body emittedinvokevirtual invoke()Objectagainst itself. The laterloop meth_typedblock that would have produced the proper Object→typed bridge was then short-circuited by has_method (the slot was already taken). First invocation StackOverflowError'd.Forward to (meth.name, arg_sigs, ret) — the typed invoke that was actually spawned earlier in generate_invoke — so the Object-returning bridge dispatches to the real implementation and casts the result on return.
Repro shape (also added as a misc/jvm test extending StructuralSam):