RFR: 8015831: Add lint check for calling overridable methods from a constructor [v7]
Archie L. Cobbs
duke at openjdk.org
Thu Jan 12 16:06:28 UTC 2023
On Thu, 12 Jan 2023 10:18:27 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:
>> Archie L. Cobbs has updated the pull request incrementally with two additional commits since the last revision:
>>
>> - Use the more appropriate Type comparison method Types.isSameType().
>> - Add some more comments to clarify how the analysis works.
>
> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ThisEscapeAnalyzer.java line 294:
>
>> 292: !(this.currentClass.sym.isSealed() && this.currentClass.permitting.isEmpty()) &&
>> 293: !(this.currentClass.sym.owner.kind == MTH) &&
>> 294: !this.privateOuter;
>
> Here, note that is the owner of the current class symbol is a method, that covers anonymous classes too, which is a part of `privateOuter`. So the only think we need to check here is whether "currentClass" is private, which is a simple predicate. No need to carry `privateOuter` I believe
Unless you explicitly declare a nested class `private`, it won't have the `ACC_PRIVATE` flag, even though it is "implicitly private" because it has a `private` enclosing class.
Example:
$ cat PrivateOuter.java
public class PrivateOuter {
private static class Inner1 {
static class Inner2 {
}
}
}
$ javap -v PrivateOuter$Inner1$Inner2
Classfile /Users/archie/proj/jdk/flex-test/classes/PrivateOuter$Inner1$Inner2.class
Last modified Jan 12, 2023; size 408 bytes
SHA-256 checksum 51ba6d39a5e66df2a078761d6424acbea7a8e32b8451f6ca7d2af49889673b2c
Compiled from "PrivateOuter.java"
class PrivateOuter$Inner1$Inner2
minor version: 0
major version: 63
flags: (0x0020) ACC_SUPER
this_class: #7 // PrivateOuter$Inner1$Inner2
super_class: #2 // java/lang/Object
...
So we have to keep track of this "implicit privateness" manually, which is what the `privateOuter` flag is for.
-------------
PR: https://git.openjdk.org/jdk/pull/11874
More information about the core-libs-dev
mailing list