< prev index next >

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

Print this page
*** 23,10 ***
--- 23,13 ---
   * questions.
   */
  
  package java.lang.reflect;
  
+ import jdk.internal.javac.PreviewFeature;
+ import jdk.internal.misc.PreviewFeatures;
+ 
  import java.lang.classfile.ClassModel;
  import java.lang.classfile.FieldModel;
  import java.lang.classfile.MethodModel;
  import java.lang.classfile.attribute.InnerClassInfo;
  import java.lang.classfile.attribute.MethodParameterInfo;

*** 160,12 ***
       * 0x0020}.
       *
       * @apiNote
       * In Java SE 8 and above, the JVM treats the {@code ACC_SUPER}
       * flag as set in every class file (JVMS {@jvms 4.1}).
       */
!     SUPER(0x0000_0020, false, Location.SET_CLASS, List.of()),
  
      /**
       * The module flag {@code ACC_OPEN} with a mask value of {@code
       * 0x0020}.
       * @see java.lang.module.ModuleDescriptor#isOpen
--- 163,29 ---
       * 0x0020}.
       *
       * @apiNote
       * In Java SE 8 and above, the JVM treats the {@code ACC_SUPER}
       * flag as set in every class file (JVMS {@jvms 4.1}).
+      * If preview feature is enabled,
+      * the {@code 0x0020} access flag bit is {@linkplain #IDENTITY IDENTITY access flag}.
+      */
+     SUPER(0x0000_0020, false,
+           PreviewFeatures.isEnabled() ? Location.EMPTY_SET : Location.SET_CLASS,
+           List.of()),
+ 
+     /**
+      * The access flag {@code ACC_IDENTITY}, corresponding to the
+      * modifier {@link Modifier#IDENTITY identity}, with a mask
+      * value of <code>{@value "0x%04x" Modifier#IDENTITY}</code>.
+      * @jvms 4.1 -B. Class access and property modifiers
+      *
+      * @since Valhalla
       */
!     @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective=true)
+     IDENTITY(Modifier.IDENTITY, false,
+             PreviewFeatures.isEnabled() ? Location.SET_CLASS_INNER_CLASS : Location.EMPTY_SET,
+             List.of()),
  
      /**
       * The module flag {@code ACC_OPEN} with a mask value of {@code
       * 0x0020}.
       * @see java.lang.module.ModuleDescriptor#isOpen

*** 262,10 ***
--- 282,22 ---
       */
      STRICT(Modifier.STRICT, true, Location.EMPTY_SET,
             List.of(Map.entry(RELEASE_16, Location.SET_METHOD),
                     Map.entry(RELEASE_1, Location.EMPTY_SET))),
  
+     /**
+      * The access flag {@code ACC_STRICT_INIT}, with a mask
+      * value of {@code 0x0800}.
+      *
+      * @jvms 4.5 Fields
+      * @since Valhalla
+      */
+     @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective=true)
+     STRICT_INIT(Modifier.STRICT, false,
+             PreviewFeatures.isEnabled() ? Location.SET_FIELD : Location.EMPTY_SET,
+                 List.of()),
+ 
      /**
       * The access flag {@code ACC_SYNTHETIC} with a mask value of
       * <code>{@value "0x%04x" Modifier#SYNTHETIC}</code>.
       * @see Class#isSynthetic()
       * @see Executable#isSynthetic()

*** 375,11 ***
       * appropriate for the location in question}
       *
       * @param mask bit mask of access flags
       * @param location context to interpret mask value
       * @throws IllegalArgumentException if the mask contains bit
!      * positions not support for the location in question
       */
      public static Set<AccessFlag> maskToAccessFlags(int mask, Location location) {
          var definition = findDefinition(location);
          int flagsMask = location.flagsMask();
          int parsingMask = location == Location.METHOD ? flagsMask | ACC_STRICT : flagsMask; // flagMask lacks strictfp
--- 407,11 ---
       * appropriate for the location in question}
       *
       * @param mask bit mask of access flags
       * @param location context to interpret mask value
       * @throws IllegalArgumentException if the mask contains bit
!      * positions not supported for the location in question
       */
      public static Set<AccessFlag> maskToAccessFlags(int mask, Location location) {
          var definition = findDefinition(location);
          int flagsMask = location.flagsMask();
          int parsingMask = location == Location.METHOD ? flagsMask | ACC_STRICT : flagsMask; // flagMask lacks strictfp

*** 390,10 ***
--- 422,36 ---
                      " for location " + location);
          }
          return new AccessFlagSet(definition, mask);
      }
  
+     /**
+      * {@return an unmodifiable set of access flags for the given mask value
+      * appropriate for the location in question}
+      *
+      * @param mask bit mask of access flags
+      * @param location context to interpret mask value
+      * @param cffv the class file format version
+      * @throws IllegalArgumentException if the mask contains bit
+      * positions not supported for the location in question
+      *
+      * @since Valhalla
+      */
+     public static Set<AccessFlag> maskToAccessFlags(int mask, Location location,
+                                                     ClassFileFormatVersion cffv) {
+         var definition = findDefinition(location);
+         int flagsMask = location.flagsMask(cffv);
+         int parsingMask = location == Location.METHOD ? flagsMask | ACC_STRICT : flagsMask; // flagMask lacks strictfp
+         int unmatchedMask = mask & (~parsingMask);
+         if (unmatchedMask != 0) {
+             throw new IllegalArgumentException("Unmatched bit position 0x" +
+                     Integer.toHexString(unmatchedMask) +
+                     " for location " + location);
+         }
+         return new AccessFlagSet(definition, mask);
+     }
+ 
      /**
       * A location within a {@code class} file where flags can be applied.
       * <p>
       * Note that since these locations represent {@code class} file structures
       * rather than language structures, many language structures, such

*** 408,11 ***
           * @see ClassModel#flags()
           * @see Modifier#classModifiers()
           * @see Modifier#interfaceModifiers()
           * @jvms 4.1 The {@code ClassFile} Structure
           */
!         CLASS(ACC_PUBLIC | ACC_FINAL | ACC_SUPER |
                ACC_INTERFACE | ACC_ABSTRACT |
                ACC_SYNTHETIC | ACC_ANNOTATION |
                ACC_ENUM | ACC_MODULE,
                List.of(Map.entry(RELEASE_8, // no module
                                  ACC_PUBLIC | ACC_FINAL | ACC_SUPER |
--- 466,11 ---
           * @see ClassModel#flags()
           * @see Modifier#classModifiers()
           * @see Modifier#interfaceModifiers()
           * @jvms 4.1 The {@code ClassFile} Structure
           */
!         CLASS(ACC_PUBLIC | ACC_FINAL | (PreviewFeatures.isEnabled() ? ACC_IDENTITY : ACC_SUPER) |
                ACC_INTERFACE | ACC_ABSTRACT |
                ACC_SYNTHETIC | ACC_ANNOTATION |
                ACC_ENUM | ACC_MODULE,
                List.of(Map.entry(RELEASE_8, // no module
                                  ACC_PUBLIC | ACC_FINAL | ACC_SUPER |

*** 430,11 ***
           * @see Modifier#fieldModifiers()
           * @jvms 4.5 Fields
           */
          FIELD(ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED |
                ACC_STATIC | ACC_FINAL | ACC_VOLATILE |
!               ACC_TRANSIENT | ACC_SYNTHETIC | ACC_ENUM,
                List.of(Map.entry(RELEASE_4, // no synthetic, enum
                                  ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED |
                                  ACC_STATIC | ACC_FINAL | ACC_VOLATILE |
                                  ACC_TRANSIENT))),
  
--- 488,11 ---
           * @see Modifier#fieldModifiers()
           * @jvms 4.5 Fields
           */
          FIELD(ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED |
                ACC_STATIC | ACC_FINAL | ACC_VOLATILE |
!               ACC_TRANSIENT | ACC_SYNTHETIC | ACC_ENUM | (PreviewFeatures.isEnabled() ? ACC_STRICT : 0),
                List.of(Map.entry(RELEASE_4, // no synthetic, enum
                                  ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED |
                                  ACC_STATIC | ACC_FINAL | ACC_VOLATILE |
                                  ACC_TRANSIENT))),
  

*** 472,11 ***
           * @see InnerClassInfo#flags()
           * @see Modifier#classModifiers()
           * @see Modifier#interfaceModifiers()
           * @jvms 4.7.6 The {@code InnerClasses} Attribute
           */
!         INNER_CLASS(ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED |
                      ACC_STATIC | ACC_FINAL | ACC_INTERFACE | ACC_ABSTRACT |
                      ACC_SYNTHETIC | ACC_ANNOTATION | ACC_ENUM,
                      List.of(Map.entry(RELEASE_4, // no synthetic, annotation, enum
                              ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED |
                              ACC_STATIC | ACC_FINAL | ACC_INTERFACE |
--- 530,11 ---
           * @see InnerClassInfo#flags()
           * @see Modifier#classModifiers()
           * @see Modifier#interfaceModifiers()
           * @jvms 4.7.6 The {@code InnerClasses} Attribute
           */
!         INNER_CLASS(ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | (PreviewFeatures.isEnabled() ? ACC_IDENTITY : 0) |
                      ACC_STATIC | ACC_FINAL | ACC_INTERFACE | ACC_ABSTRACT |
                      ACC_SYNTHETIC | ACC_ANNOTATION | ACC_ENUM,
                      List.of(Map.entry(RELEASE_4, // no synthetic, annotation, enum
                              ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED |
                              ACC_STATIC | ACC_FINAL | ACC_INTERFACE |

*** 688,11 ***
              ret[pos] = flag;
          }
          return ret;
      }
  
-     // Will take extra args in the future for valhalla switch
      private static AccessFlag[] findDefinition(Location location) {
          return switch (location) {
              case CLASS -> CLASS_FLAGS;
              case FIELD -> FIELD_FLAGS;
              case METHOD -> METHOD_FLAGS;
--- 746,10 ---

*** 704,14 ***
              case MODULE_OPENS -> MODULE_OPENS_FLAGS;
          };
      }
  
      private static final @Stable AccessFlag[] // Can use stable array and lazy init in the future
!             CLASS_FLAGS = createDefinition(PUBLIC, FINAL, SUPER, INTERFACE, ABSTRACT, SYNTHETIC, ANNOTATION, ENUM, MODULE),
!             FIELD_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, VOLATILE, TRANSIENT, SYNTHETIC, ENUM),
              METHOD_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, SYNCHRONIZED, BRIDGE, VARARGS, NATIVE, ABSTRACT, STRICT, SYNTHETIC),
!             INNER_CLASS_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, INTERFACE, ABSTRACT, SYNTHETIC, ANNOTATION, ENUM),
              METHOD_PARAMETER_FLAGS = createDefinition(FINAL, SYNTHETIC, MANDATED),
              MODULE_FLAGS = createDefinition(OPEN, SYNTHETIC, MANDATED),
              MODULE_REQUIRES_FLAGS = createDefinition(TRANSITIVE, STATIC_PHASE, SYNTHETIC, MANDATED),
              MODULE_EXPORTS_FLAGS = createDefinition(SYNTHETIC, MANDATED),
              MODULE_OPENS_FLAGS = createDefinition(SYNTHETIC, MANDATED);
--- 761,16 ---
              case MODULE_OPENS -> MODULE_OPENS_FLAGS;
          };
      }
  
      private static final @Stable AccessFlag[] // Can use stable array and lazy init in the future
!             CLASS_FLAGS = createDefinition(PUBLIC, FINAL, (PreviewFeatures.isEnabled() ? IDENTITY : SUPER), INTERFACE, ABSTRACT, SYNTHETIC, ANNOTATION, ENUM, MODULE),
!               FIELD_FLAGS = PreviewFeatures.isEnabled() ? // Using Valhalla
+               createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, VOLATILE, TRANSIENT, SYNTHETIC, ENUM, STRICT_INIT) :
+               createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, VOLATILE, TRANSIENT, SYNTHETIC, ENUM),
              METHOD_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, SYNCHRONIZED, BRIDGE, VARARGS, NATIVE, ABSTRACT, STRICT, SYNTHETIC),
!             INNER_CLASS_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, (PreviewFeatures.isEnabled() ? IDENTITY : SUPER), STATIC, FINAL, INTERFACE, ABSTRACT, SYNTHETIC, ANNOTATION, ENUM),
              METHOD_PARAMETER_FLAGS = createDefinition(FINAL, SYNTHETIC, MANDATED),
              MODULE_FLAGS = createDefinition(OPEN, SYNTHETIC, MANDATED),
              MODULE_REQUIRES_FLAGS = createDefinition(TRANSITIVE, STATIC_PHASE, SYNTHETIC, MANDATED),
              MODULE_EXPORTS_FLAGS = createDefinition(SYNTHETIC, MANDATED),
              MODULE_OPENS_FLAGS = createDefinition(SYNTHETIC, MANDATED);
< prev index next >