Looking for Sponsor: JDK-8229959 Convert proxy class to use constant dynamic

Johannes Kuhn info at j-kuhn.de
Fri Nov 22 03:23:31 UTC 2019


Hi everyone,

a few hours ago I signed the Oracle Contributor Agreement.
I'd like to work on JDK-8229959: Convert proxy class to use constant 
dynamic.

Without further ado, here are some questions and answers you may ask:

* What are you exactly planing to do?
I'd like to replace the GETSTATIC instruction with an LDC instruction in 
the current generated bytecode for the proxies.

* What benefits would such a change have?
First, it allows us to drop the static final fields and the class 
initializer for the generated proxy classes.
Second, it allows the code (both generated and generator) to be more 
clear by moving the essential parts together.
Third, it might bring some performance improvement, because the 
j.l.r.Method lookup is delayed to it's first use - which in some cases 
might never happen.

* Are you able to write such a patch?
Yes. I have some experience with the Java bytecode, ASM and ConstantDynamic.

* But java.lang.reflect.Method is not immutable/persistent?
That's not a question, but you are right. j.l.r.Method has 
setAccessible, modifying the Method instance. Still, the current 
implementation shares the same Method instance with all proxies with the 
same interfaces in the same ClassLoader.

* What should the bootstrap method look like?
The bootstrap method will take one additional argument, a direct 
MethodHandle to the to be resolved method, and should crack it using 
it's passed Lookup and then reflect it as Method. In other words, it 
should do `return lookup.revealDirect(mh).reflectAs(Method.class, lookup);`

*  Where should this bootstrap method reside?
I'm glad you asked. After some thoughts, there are two promising places 
where I could put it:
a) As private static method in the proxy itself.
Benefits: No public API changes. Also allows easy migration to option b) 
if pursued later.
Downsides: The bootstrap method will be duplicated into every proxy class.
b) As a public static method in the java.* namespace, preferably in 
java.lang.invoke.ConstantBootstraps.
Benefits: Only one single implementation in the JVM.
Downside: Changes to the public API. Also leads to other questions like 
"Should j.l.r.Member implement Constable?" and "Should I add a subclass 
of j.l.c.DynamicConstantDesc for this bootstrap method?"
I prefer option a), but I'm fine with both options. Please let me know 
what you think, or if you think of a better way.

* What do I expect from my Sponsor?
I expect my sponsor lo believe that this change will improve the 
OpenJDK. If consensus shows a preference for option b) above (bootstrap 
in j.l.i.ConstantBootstaps), a guidance what requests have to be made 
and where. In that case, I volunteer to write those requests and send 
them to my sponsor, who can (at their sole discretion) forward it to the 
relevant places.

If you have any additional questions, please don't hesitate to answer to 
this mail. I will try to answer all questions to the best of my ability.

With best regards,
Johannes Kuhn



More information about the core-libs-dev mailing list