< prev index next > src/java.base/share/classes/jdk/internal/classfile/impl/AccessFlagsImpl.java
Print this page
/*
- * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 2026, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* questions.
*/
package jdk.internal.classfile.impl;
import java.lang.classfile.AccessFlags;
+ import java.lang.classfile.ClassFile;
import java.lang.reflect.AccessFlag;
+ import java.lang.reflect.ClassFileFormatVersion;
import java.util.Set;
+ import jdk.internal.misc.VM;
+
public final class AccessFlagsImpl extends AbstractElement
implements AccessFlags {
private final AccessFlag.Location location;
private final int flagsMask;
+ private final ClassFileFormatVersion formatVersion;
private Set<AccessFlag> flags;
public AccessFlagsImpl(AccessFlag.Location location, AccessFlag... flags) {
this.location = location;
this.flagsMask = Util.flagsToBits(location, flags);
this.flags = Set.of(flags);
+ this.formatVersion = ClassFileFormatVersion.latest();
}
public AccessFlagsImpl(AccessFlag.Location location, int mask) {
+ this(location, mask, ClassFileFormatVersion.latest());
+ }
+
+ public AccessFlagsImpl(AccessFlag.Location location, int mask, int version) {
+ int major = version & 0xFFFF;
+ int minor = version >>> Character.SIZE;
+
+ ClassFileFormatVersion cffv = minor == ClassFile.PREVIEW_MINOR_VERSION
+ ? ClassFileFormatVersion.CURRENT_PREVIEW_FEATURES // Try to guess for older preview features
+ : VM.isSupportedClassFileVersion(major, minor) ? ClassFileFormatVersion.fromMajor(major)
+ : ClassFileFormatVersion.latest(); // Fallback
+ this(location, mask, cffv);
+ }
+
+ private AccessFlagsImpl(AccessFlag.Location location, int mask, ClassFileFormatVersion version) {
this.location = location;
this.flagsMask = Util.checkFlags(mask);
+ this.formatVersion = version;
}
@Override
public int flagsMask() {
return flagsMask;
}
@Override
public Set<AccessFlag> flags() {
if (flags == null)
- flags = AccessFlag.maskToAccessFlags(flagsMask, location);
+ flags = AccessFlag.maskToAccessFlags(flagsMask, location, formatVersion);
return flags;
}
@Override
public void writeTo(DirectClassBuilder builder) {
< prev index next >