use invokedynamic instead of the reflection API when possible #85
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.
The compiler is patched to use invokedynamic instead of the reflection API when it doesn't know the function to call statically.
Invoking a static method or a constructor is done just by delaying the resolution at runtime.
For the other invocations, an inlining cache is installed to trap the receiver class and do the resolution each time there is a new receiver class.
For all invocations, if a resolution find several overloads, invokedynamic is wire up to call the reflection API, said differently, in case of multi-dispatch, this patch fallback to use the reflection.
Also If no method is found during the resolution, the Reflector API is called so the error messages (and the call stack) are exactly the same.
I've not touch to the error warning in case of reflection because the decision to make an invocation inlinable or not is done at runtime.