RFR: JDK-8245432: Lookup::defineHiddenClass should throw UnsupportedClassVersionError if the given bytes are of an unsupported major or minor version

Mandy Chung mandy.chung at oracle.com
Fri May 29 20:03:35 UTC 2020



On 5/28/20 9:18 PM, David Holmes wrote:
> On 29/05/2020 1:52 pm, Mandy Chung wrote:
>> On 5/28/20 5:44 PM, David Holmes wrote:
>>>>
>>>> This is to validate the given version.  The runtime will check if 
>>>> preview feature is enabled when such class file is loaded. I will 
>>>> make a comment to make it clear.
>>>
>>> Okay but I thought the intent here was to pre-validate the version 
>>> information so that when these bytes get passed to ASM you don't 
>>> have to worry about the IAE that will be thrown by ASM if there is 
>>> actually a problem.
>>
>> Yes it is.  ASM does not check if preview features are enabled or not 
>> neither.  When a class file depending preview features is passed to 
>> VM, the VM will throw an exception if preview features are not enabled.
>
> Yes but will that VM exception propagate as-is, or will ASM catch it 
> and turn it into IAE? If the latter then your original problem still 
> exists.
>

I think you may be confused with the code path.  ASM is used only to 
extract the class name from the bytes.  Once it verifies the class file 
version and name in the bytes, the next step is to pass the name and 
bytes to the VM to create the class where it checks if preview features 
are used and enabled.  If VM will throw an exception, it just gets 
propagated to the user (no ASM frame on the stack at that point).  See 
the new PreviewHiddenClass test.

Updated webrev:
http://cr.openjdk.java.net/~mchung/jdk15/webrevs/8245432/webrev.02/index.html

This patch has a behavioral change to `Lookup::defineClass` if the bytes 
is not a class or interface.

Lookup::defineClass does not specify what exception to throw if the 
given bytes has ACC_MODULE flag set in the access_flags item. The 
current implementation throws NoClassDefFoundError (which is the 
behavior specified in JVMS 5.3.5).

I propose Lookup::defineClass to specify and throw 
IllegalArgumentException if the bytes has ACC_MODULE flag set in its 
access_flags item to be consistent with Lookup::defineHiddenClass.

CSR: https://bugs.openjdk.java.net/browse/JDK-8246108

Mandy



More information about the core-libs-dev mailing list