On Wed, 2 Dec 2020 19:31:59 GMT, Dan Smith <dlsm...@openjdk.org> wrote:

>>> Additional changes may be needed to Class.permittedSubclasses() and/or 
>>> Class.isSealed() as part of fixing bug JDK-8256867. The JVM is being 
>>> changed to treat classes with empty PermittedSubclasses attributes as 
>>> sealed classes that cannot be extended (or implemented).
>>> 
>>> Current thinking is that Class.permittedSubclasses() will return an empty 
>>> array for both non-sealed classes and for sealed classes with empty 
>>> PermittedSubclasses attributes. And, Class.isSealed() will return False in 
>>> the former case and True in the latter. This will require changing the 
>>> implementation of Class.isSealed() to call the JVM directly instead of 
>>> calling Class.permittedSubclasses().
>>> 
>>> Does this seem like a reasonable way to handle this corner case?
>> 
>> I suggest `Class::getPermittedSubclasses` to return a `non-null` array if 
>> this `Class` is sealed, i.e. this class is derived from a `class` file with 
>> the presence of `PermittedSubclasses` attribute regardless of its content 
>> (the attribute could be empty or contains zero or more entries which is a 
>> properly loaded permitted subtype.
>> 
>> If this `Class` is not sealed, `Class::getPermittedSubclasses` returns null 
>> (see `Class::getRecordComponents` and some other reflection APIs as 
>> precedence).
>
>> I suggest `Class::getPermittedSubclasses` to return a `non-null` array if 
>> this `Class` is sealed, i.e. this class is derived from a `class` file with 
>> the presence of `PermittedSubclasses` attribute regardless of its content 
>> (the attribute could be empty or contains zero or more entries which is a 
>> properly loaded permitted subtype.
>> 
>> If this `Class` is not sealed, `Class::getPermittedSubclasses` returns null 
>> (see `Class::getRecordComponents` and some other reflection APIs as 
>> precedence).
> 
> Agree, that seems reasonable. Often, methods in `Class` with an array return 
> type default to an empty array, but `getRecordComponents` is a good example 
> of returning `null` when an empty array is meaningful.

I've changed Class.getPermittedSubclasses to return null for classes that are 
not sealed here:
https://github.com/openjdk/jdk/pull/1483/commits/7056143822ff62dfbb1d294c67352ed3892317c2
with follow-up changes to tests here:
https://github.com/openjdk/jdk/pull/1483/commits/537e267fb6802ab5cf38bf26978039383cc6309a

How does this look?

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

PR: https://git.openjdk.java.net/jdk/pull/1483

Reply via email to