RFR: 8246778: Compiler implementation for Sealed Classes (Second Preview)

Jan Lahoda jlahoda at openjdk.java.net
Wed Dec 2 17:42:58 UTC 2020

On Wed, 2 Dec 2020 14:28:00 GMT, Harold Seigel <hseigel at 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?

Uh, I just realized it may be necessary to implement `Class.isSealed()` differently. Consider:
sealed class Sealed permits Unknown {}

Where `Unknown` does not exist at runtime. So getPermittedSubclasses0() returns an empty array(?). But isSealed should return `true`, right? (Possibly, we could leave this from the first integration, but seems like something that should be done. Note that in the previous/JDK 15 implementation, isSealed() would return true in this case.)


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

More information about the compiler-dev mailing list