(Nestmates) RFR (M): 8240645: Update nest host determination in line with latest proposed JVMS changes for JEP-371

David Holmes david.holmes at oracle.com
Sun Mar 8 23:10:34 UTC 2020


Hi Mandy,

Thanks for taking a look. Please see response to John for updated webrevs.

David

On 7/03/2020 4:23 am, Mandy Chung wrote:
> 
> Hi David,
> 
> On 3/5/20 9:29 PM, David Holmes wrote:
>> webrev: http://cr.openjdk.java.net/~dholmes/8240645/webrev/
>> bug: https://bugs.openjdk.java.net/browse/JDK-8240645
>>
> 
> This patch looks good to me.
> 
> Thanks for the detail below which is very helpful.  It's okay with me 
> that IAE thrown by core reflection and lookup MethodHandle is not 
> extended with the memoized nest host error message in this release. We 
> could improve it in the future.
> 
> Mandy
>> JEP-371 (Hidden Classes) is changing a key aspect of nest host 
>> resolution and validation compared to what we shipped originally for 
>> JEP-181 (Nestmates). Originally, any LinkageErrors during nest host 
>> resolution would be propagated, and any validation failures would 
>> result in IncompatibleClassChangeError being thrown. Now no 
>> LinkageErrors are thrown, but the fact one occurred is remembered for 
>> potential use if a private access check fails. Similarly, validation 
>> failures don't cause an exception any more. Nest host resolution 
>> always succeeds and the nest will be one of:
>> - the successfully resolved nest host as per the NestHost attribute
>> - the class itself if there is no NestHost attribute or there is an 
>> error during resolution or validation
>> - the specified nest host explicitly set if this is a hidden class 
>> injected into a nest
>>
>> as appropriate.
>>
>> This has a flow on affect to the reflection method 
>> Class::getNestMembers() which can also no longer ever fail.
>>
>> To be able to diagnose issues with nest host resolution/validation you 
>> can use unified logging to examine what happens: 
>> -Xlog:class+nestmates=trace.
>>
>> In addition IllegakAccessErrors thrown by the VM are augmented with 
>> information about any nest host resolution/validation errors. For 
>> example an original exception:
>>
>> java.lang.IllegalAccessError: class TestNestmateMembership$Caller 
>> tried to access private method 'void 
>> TestNestmateMembership$TargetSelfHost.m()' 
>> (TestNestmateMembership$Caller and 
>> TestNestmateMembership$TargetSelfHost are in unnamed module of loader 
>> 'app')
>>
>> is now expanded with an additional "(<nest host resolution error(s)>)" 
>> section which is memoized for use with other access checks:
>>
>> java.lang.IllegalAccessError: class TestNestmateMembership$Caller 
>> tried to access private method 'void 
>> TestNestmateMembership$TargetSelfHost.m()' 
>> (TestNestmateMembership$Caller and 
>> TestNestmateMembership$TargetSelfHost are in unnamed module of loader 
>> 'app')(Type TestNestmateMembership$TargetSelfHost (loader: 'app') is 
>> not a nest member of type TestNestmateMembership$TargetSelfHost 
>> (loader: 'app'): current type is not listed as a nest member)
>>
>> These exception messages are very long and unweildy but that seems 
>> unavoidable. They appear repetative in that the type names appear in 
>> the main message, the module information, and then again in the 
>> resolution error section. Unfortunately we can't avoid that as the 
>> memoized string has to be complete because it does not know the 
>> context of the IllegalAccessError in which it will be used. Please 
>> look at the mechanism by which this is done before making suggestions 
>> on how to condense.
>>
>> Also note that in the worst case there can be two nest host resolution 
>> errors reported, if both the current class and the target class had 
>> such errors.
>>
>> Note: the augmented exceptions do not extend to 
>> IllegalAccessExceptions thrown by the Java reflection or MethodHandle 
>> code. This would require an additional VM call to retrieve the 
>> information. This may be considered for a future RFE.
>>
>> Changes in detail:
>>
>> - src/hotspot/share/ci/ciField.cpp
>> - src/hotspot/share/classfile/classFileParser.cpp
>> - src/hotspot/share/runtime/reflection.cpp
>>
>> No longer a possibility of exceptions
>>
>> -  src/hotspot/share/interpreter/linkResolver.cpp
>>
>> Expands on the message for IllegalAccessErrors in the private case, to 
>> report any nest host resolution/validation errors.
>>
>> -  src/hotspot/share/oops/instanceKlass.cpp
>>
>> Implements the new specification for resolving the nest host, and adds 
>> the means to memoize the error message. The same message is used for 
>> exceptions and logging.
>>
>> Exception handling is changed as needed - no use of CHECK macros.
>>
>> Removed a case in has_nest_member where we would bail out if executing 
>> in a compiler thread and encountered an unresolved class entry in the 
>> CP. We previously bailed out as a precaution as the compiler thread 
>> can't load classes. I was surprised to find that I was hitting this 
>> code, and getting runtime failures because of it (not test failures). 
>> I don't see how the current changes would cause this. In any case the 
>> situation where actual class loading would be needed should be 
>> impossible - two classes of the same name within the same loader - so 
>> the bail out can be removed.
>>
>> Removed the recently added runtime_nest_host code which is no longer 
>> needed.
>>
>> -  src/hotspot/share/prims/jvm.cpp
>>
>> Some code simplifies now exceptions are no longer possible.
>>
>> JVM_GetNestMembers has major updates:
>> - as we no longer bail out on error we may end up with holes in the 
>> array, so we have to copy across to an array of the exact size before 
>> returning.
>> - added logging to aid in debugging
>>
>> -  src/hotspot/share/utilities/ostream.cpp
>>
>> Needed to add the ability for stringStream to return a C-Heap 
>> allocated buffer so we could use it for the memoized error messages. 
>> (This should probably be factored out to a separate RFE for mainline.)
>>
>> - src/java.base/share/classes/java/lang/Class.java
>>
>> Updated the specifications for getNestHost and getNestMembers as per 
>> Mandy's proposed spec updates (added missing @jvms links in 
>> getNestMembers()). Adjusted the implementation for the fact there are 
>> no longer any exceptions from the VM.
>>
>> - 
>> test/hotspot/jtreg/runtime/Nestmates/membership/TestNestmateMembership.java
>>
>> Had to change all the LinkageErrors/NoClassDefFoundErrors to be 
>> IllegalAccessError or IllegalAccessException and adjust the expected 
>> messages to check the underlying failure reasons.
>>
>> Other test adjusted as needed to account for no exceptions, and the 
>> changes to Class::getNestMembers().
>>
>> Testing: all nestmate and hidden class tests under normal conditions.
>>          tiers 1 - 3
>>
>> Thanks,
>> David
> 


More information about the valhalla-dev mailing list