<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Summary: Could we please allow eager loading for value types in the locally declared method signatures<br class="">prior to preparation  for LW1? <br class=""><br class="">Without that we seriously risk being able to offer an LW1 early access binary for the JVMLS.<br class="">We believe it is more important to get this into people‚Äôs hands for experimentation and feedback than<br class="">to delay the eager loading at this time.<br class=""><br class="">Details:<br class="">At our EG discussion on June 20, 2018, we discussed the proposal for Value Types Consistency checking<br class="">at <a href="http://cr.openjdk.java.net/~acorn/value-types-consistency-checking-details.pdf" class="">http://cr.openjdk.java.net/~acorn/value-types-consistency-checking-details.pdf</a><br class=""><br class="">Part of the proposal for checking value type consistency relative to the actual type<br class="">was for locally declared methods. The proposal was to check the value types in arguments/return type<br class="">before preparation of the declaring class.<br class=""><br class="">During the meeting, there was a request to explore whether we could either:<br class="">1)  delay checking the value type consistency until an attempt to resolve the method for invocation, or <br class="">2) write the JVMS is such as way as to allow eager loading, but only throw an error related to the eager loading at method resolution.<br class=""><br class="">My understanding is that the goals of this are two-fold:<br class="">1) if the method is never called, the rest of the code will continue to run<br class="">2) reduce eager loading<br class=""><br class="">We have started this investigation, and there is non-trivial complexity in implementing either of these approaches,<br class="">and we would like more time to explore how to make this possible, after making LW1 available.<br class=""><br class="">Some aspects of the implementation complexity that we have identified so far:<br class="">a) At method resolution time, if there is a mismatch in value type consistency between the declaring class and the actual<br class="">type in the signature, then there is also a mismatch in all classes that have overridden the current method. This is particularly<br class="">painful with default methods in interfaces.<br class="">b) We need to ensure that we catch all method resolution, through all of the alternate accessor paths, including MethodHandles, VarHandles,<br class="">Reflection, JNI, so that we catch both the specification and implementation changes.<br class="">c) Our favorite, invokespecial ACC_SUPER, needs special handling, since it performs selection which is not based on overriding, but based on virtually re-resolving.<br class="">d) Pass by value calling convention optimizations depend on loading the actual type. Loading of the parameter types on first method resolution implies that if the caller is compiled, the caller method requires deoptimization/recompilation to pass arguments by value for future calls, which is a performance cost.<br class="">e) If we modify the specification to allow eager loading, and save errors to throw at method resolution, we need to work through the JVMS question of which errors would be saved (e.g. OOME, SOE might be thrown as part of the implementation vs. saving LinkageError), as well as designing a new implementation mechanism to repeat exceptions relative to signatures used for method resolution.<br class=""><br class="">thanks,<br class="">Karen</body></html>