Skip to content

Commit 636ee54

Browse files
author
Vicente Romero
committed
add javac and javap support for the ACC_NULL_CHECKED flag
Reviewed-by: liach
1 parent 77214d7 commit 636ee54

File tree

6 files changed

+44
-8
lines changed

6 files changed

+44
-8
lines changed

src/java.base/share/classes/java/lang/classfile/ClassFile.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -847,6 +847,14 @@ default List<VerifyError> verify(Path path) throws IOException {
847847
/** The bit mask of {@link AccessFlag#STRICT} access and property modifier. */
848848
int ACC_STRICT = 0x0800;
849849

850+
/**
851+
* The bit mask of {@link AccessFlag#NULL_CHECKED} access and property modifier.
852+
*
853+
* @since Valhalla
854+
*/
855+
@PreviewFeature(feature = PreviewFeature.Feature.NULL_RESTRICTION, reflective = true)
856+
int ACC_NULL_CHECKED = 0x0200;
857+
850858
/**
851859
* The bit mask of {@link AccessFlag#STRICT_INIT} access and property modifier.
852860
*

src/java.base/share/classes/java/lang/reflect/AccessFlag.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,18 @@ public enum AccessFlag {
283283
List.of(Map.entry(RELEASE_16, Location.SET_METHOD),
284284
Map.entry(RELEASE_1, Location.EMPTY_SET))),
285285

286+
/**
287+
* The access flag {@code ACC_NULL_CHECKED}, with a mask value of
288+
* <code>{@value "0x%01x" ClassFile#ACC_NULL_CHECKED}</code>.
289+
*
290+
* @jvms TBD
291+
* @since Valhalla
292+
*/
293+
@PreviewFeature(feature = PreviewFeature.Feature.NULL_RESTRICTION, reflective=true)
294+
NULL_CHECKED(ACC_NULL_CHECKED, false,
295+
Location.SET_FIELD,
296+
List.of(Map.entry(latest(), Location.EMPTY_SET))),
297+
286298
/**
287299
* The access flag {@code ACC_STRICT_INIT}, with a mask value of
288300
* <code>{@value "0x%04x" ClassFile#ACC_STRICT_INIT}</code>.
@@ -479,7 +491,7 @@ public enum Location {
479491
*/
480492
FIELD(ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED |
481493
ACC_STATIC | ACC_FINAL | ACC_VOLATILE |
482-
ACC_TRANSIENT | ACC_SYNTHETIC | ACC_ENUM | ACC_STRICT_INIT,
494+
ACC_TRANSIENT | ACC_SYNTHETIC | ACC_ENUM | ACC_STRICT_INIT | ACC_NULL_CHECKED,
483495
List.of(Map.entry(latest(), // no strict_init
484496
ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED |
485497
ACC_STATIC | ACC_FINAL | ACC_VOLATILE |
@@ -763,7 +775,7 @@ private static AccessFlag[] findDefinition(Location location, ClassFileFormatVer
763775
CLASS_FLAGS = createDefinition(PUBLIC, FINAL, SUPER, INTERFACE, ABSTRACT, SYNTHETIC, ANNOTATION, ENUM, MODULE),
764776
CLASS_PREVIEW_FLAGS = createDefinition(PUBLIC, FINAL, IDENTITY, INTERFACE, ABSTRACT, SYNTHETIC, ANNOTATION, ENUM, MODULE), // identity
765777
FIELD_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, VOLATILE, TRANSIENT, SYNTHETIC, ENUM),
766-
FIELD_PREVIEW_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, VOLATILE, TRANSIENT, SYNTHETIC, ENUM, STRICT_INIT), // strict
778+
FIELD_PREVIEW_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, VOLATILE, TRANSIENT, SYNTHETIC, ENUM, STRICT_INIT, NULL_CHECKED), // strict
767779
METHOD_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, SYNCHRONIZED, BRIDGE, VARARGS, NATIVE, ABSTRACT, STRICT, SYNTHETIC),
768780
INNER_CLASS_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, INTERFACE, ABSTRACT, SYNTHETIC, ANNOTATION, ENUM),
769781
INNER_CLASS_PREVIEW_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, IDENTITY, STATIC, FINAL, INTERFACE, ABSTRACT, SYNTHETIC, ANNOTATION, ENUM), // identity

src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ public static EnumSet<FlagsEnum> asFlagSet(long flags) {
134134
public static final int ACC_VARARGS = 1<<7;
135135
@Use({FlagTarget.VARIABLE})
136136
@NoToStringValue
137+
public static final int ACC_NULL_CHECKED = 1<<9;
138+
@Use({FlagTarget.VARIABLE})
139+
@NoToStringValue
137140
public static final int ACC_STRICT = 1<<11;
138141
@Use({FlagTarget.CLASS})
139142
@NoToStringValue

src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3343,9 +3343,14 @@ public void readClassFile(ClassSymbol c) {
33433343

33443344
long adjustFieldFlags(long flags) {
33453345
boolean previewClassFile = minorVersion == ClassFile.PREVIEW_MINOR_VERSION;
3346-
if (allowValueClasses && previewClassFile && (flags & ACC_STRICT) != 0) {
3347-
flags &= ~ACC_STRICT;
3348-
flags |= STRICT;
3346+
if (allowValueClasses && previewClassFile) {
3347+
if ((flags & ACC_STRICT) != 0) {
3348+
flags &= ~ACC_STRICT;
3349+
flags |= STRICT;
3350+
}
3351+
if ((flags & ACC_NULL_CHECKED) != 0) {
3352+
flags &= ~ACC_NULL_CHECKED;
3353+
}
33493354
}
33503355
return flags;
33513356
}

src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1932,9 +1932,12 @@ int adjustFlags(Symbol sym, final long flags) {
19321932
}
19331933
}
19341934
if (sym.kind == VAR) {
1935-
if ((flags & STRICT) != 0 || (flags & MARK_STRICT_INIT) != 0 || types.isNonNullable(sym.type)) {
1935+
if ((flags & STRICT) != 0 || (flags & MARK_STRICT_INIT) != 0) {
19361936
result |= ACC_STRICT;
19371937
}
1938+
if (types.isNonNullable(sym.type)) {
1939+
result |= ACC_NULL_CHECKED;
1940+
}
19381941
}
19391942
return result;
19401943
}

test/langtools/tools/javac/nullability/NullabilityCompilationTests.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -620,10 +620,15 @@ class Test {
620620
for (var field : classFile.fields()) {
621621
if (!field.flags().has(AccessFlag.STATIC)) {
622622
Set<AccessFlag> fieldFlags = field.flags().flags();
623-
Assert.check(fieldFlags.size() == 1 && fieldFlags.contains(AccessFlag.STRICT_INIT));
623+
Assert.check(fieldFlags.size() == 2 &&
624+
fieldFlags.contains(AccessFlag.STRICT_INIT) &&
625+
fieldFlags.contains(AccessFlag.NULL_CHECKED));
624626
} else {
625627
Set<AccessFlag> fieldFlags = field.flags().flags();
626-
Assert.check(fieldFlags.size() == 2 && fieldFlags.contains(AccessFlag.STRICT_INIT) && fieldFlags.contains(AccessFlag.STATIC));
628+
Assert.check(fieldFlags.size() == 3 &&
629+
fieldFlags.contains(AccessFlag.STRICT_INIT) &&
630+
fieldFlags.contains(AccessFlag.STATIC) &&
631+
fieldFlags.contains(AccessFlag.NULL_CHECKED));
627632
}
628633
}
629634
}

0 commit comments

Comments
 (0)