When core reflection was migrated to be implemented by Method Handles, somehow, 
the method handles are not used for native methods, which are generally 
linkable by method handles.  This causes significant performance regressions 
when reflecting native methods, even if their overrides may be non-native 
methods.  This is evident in `Object.clone` and `Object.hashCode` as shown in 
the original report.

I believe the blanket restriction previously placed on the native methods was 
because of signature polymorphic methods ([JLS 
15.12.3](https://docs.oracle.com/javase/specs/jls/se23/html/jls-15.html#jls-15.12.3),
 [JVMS 
2.9.3](https://docs.oracle.com/javase/specs/jvms/se23/html/jvms-2.html#jvms-2.9.3))
 for MethodHandle and VarHandle; method handles do not link to the backing 
implementation that throws UOE while core reflection is required to do so.  I 
have narrowed the restrictions to be specifically against these methods.

Additionally, I cleaned up another check for invalid varargs flag.  Together, I 
clarified the scenarios where native method accessors are used - all to bypass 
restrictions of java.lang.invoke.

Testing: tier 1-5 green

-------------

Commit messages:
 - Better comments
 - 8343377: Performance regression in reflective invocation of native methods

Changes: https://git.openjdk.org/jdk/pull/22169/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=22169&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8343377
  Stats: 72 lines in 4 files changed: 52 ins; 7 del; 13 mod
  Patch: https://git.openjdk.org/jdk/pull/22169.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/22169/head:pull/22169

PR: https://git.openjdk.org/jdk/pull/22169

Reply via email to