Copyright (c) 2000, 2018 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/ SPDX-License-Identifier: EPL-2.0 Contributors: IBM Corporation - initial API and implementation Jesper S Moller - Contributions for Bug 405066 - [1.8][compiler][codegen] Implement code generation infrastructure for JSR335 Bug 406982 - [1.8][compiler] Generation of MethodParameters Attribute in classfile Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas
/******************************************************************************* * Copyright (c) 2000, 2018 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * IBM Corporation - initial API and implementation * Jesper S Moller - Contributions for * Bug 405066 - [1.8][compiler][codegen] Implement code generation infrastructure for JSR335 * Bug 406982 - [1.8][compiler] Generation of MethodParameters Attribute in classfile * Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for * Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas *******************************************************************************/
package org.eclipse.jdt.internal.compiler.classfmt; import org.eclipse.jdt.internal.compiler.ast.ASTNode; public interface ClassFileConstants { int AccDefault = 0; /* * Modifiers */ int AccPublic = 0x0001; int AccPrivate = 0x0002; int AccProtected = 0x0004; int AccStatic = 0x0008; int AccFinal = 0x0010; int AccSynchronized = 0x0020; int AccVolatile = 0x0040; int AccBridge = 0x0040; int AccTransient = 0x0080; int AccVarargs = 0x0080; int AccNative = 0x0100; int AccInterface = 0x0200; int AccAbstract = 0x0400; int AccStrictfp = 0x0800; int AccSynthetic = 0x1000; int AccAnnotation = 0x2000; int AccEnum = 0x4000; int AccModule = 0x8000;
From classfile version 52 (compliance 1.8 up), meaning that a formal parameter is mandated by a language specification, so all compilers for the language must emit it.
/** * From classfile version 52 (compliance 1.8 up), meaning that a formal parameter is mandated * by a language specification, so all compilers for the language must emit it. */
int AccMandated = 0x8000;
Flags in module declaration - since java9
/** * Flags in module declaration - since java9 */
int ACC_OPEN = 0x0020; int ACC_TRANSITIVE = 0x0020; int ACC_STATIC_PHASE = 0x0040; int ACC_SYNTHETIC = 0x1000;
Other VM flags.
/** * Other VM flags. */
int AccSuper = 0x0020;
Extra flags for types and members attributes (not from the JVMS, should have been defined in ExtraCompilerModifiers).
/** * Extra flags for types and members attributes (not from the JVMS, should have been defined in ExtraCompilerModifiers). */
int AccAnnotationDefault = ASTNode.Bit18; // indicate presence of an attribute "DefaultValue" (annotation method) int AccDeprecated = ASTNode.Bit21; // indicate presence of an attribute "Deprecated" int Utf8Tag = 1; int IntegerTag = 3; int FloatTag = 4; int LongTag = 5; int DoubleTag = 6; int ClassTag = 7; int StringTag = 8; int FieldRefTag = 9; int MethodRefTag = 10; int InterfaceMethodRefTag = 11; int NameAndTypeTag = 12; int MethodHandleTag = 15; int MethodTypeTag = 16; int DynamicTag = 17; int InvokeDynamicTag = 18; int ModuleTag = 19; int PackageTag = 20; int ConstantMethodRefFixedSize = 5; int ConstantClassFixedSize = 3; int ConstantDoubleFixedSize = 9; int ConstantFieldRefFixedSize = 5; int ConstantFloatFixedSize = 5; int ConstantIntegerFixedSize = 5; int ConstantInterfaceMethodRefFixedSize = 5; int ConstantLongFixedSize = 9; int ConstantStringFixedSize = 3; int ConstantUtf8FixedSize = 3; int ConstantNameAndTypeFixedSize = 5; int ConstantMethodHandleFixedSize = 4; int ConstantMethodTypeFixedSize = 3; int ConstantDynamicFixedSize = 5; int ConstantInvokeDynamicFixedSize = 5; int ConstantModuleFixedSize = 3; int ConstantPackageFixedSize = 3; // JVMS 4.4.8 int MethodHandleRefKindGetField = 1; int MethodHandleRefKindGetStatic = 2; int MethodHandleRefKindPutField = 3; int MethodHandleRefKindPutStatic = 4; int MethodHandleRefKindInvokeVirtual = 5; int MethodHandleRefKindInvokeStatic = 6; int MethodHandleRefKindInvokeSpecial = 7; int MethodHandleRefKindNewInvokeSpecial = 8; int MethodHandleRefKindInvokeInterface = 9; int MAJOR_VERSION_1_1 = 45; int MAJOR_VERSION_1_2 = 46; int MAJOR_VERSION_1_3 = 47; int MAJOR_VERSION_1_4 = 48; int MAJOR_VERSION_1_5 = 49; int MAJOR_VERSION_1_6 = 50; int MAJOR_VERSION_1_7 = 51; int MAJOR_VERSION_1_8 = 52; int MAJOR_VERSION_9 = 53; int MAJOR_VERSION_10 = 54; int MAJOR_VERSION_11 = 55; int MAJOR_VERSION_12 = 56; int MAJOR_VERSION_13 = 57; int MAJOR_VERSION_0 = 44; int MAJOR_LATEST_VERSION = MAJOR_VERSION_13; int MINOR_VERSION_0 = 0; int MINOR_VERSION_1 = 1; int MINOR_VERSION_2 = 2; int MINOR_VERSION_3 = 3; int MINOR_VERSION_4 = 4; int MINOR_VERSION_PREVIEW = 0xffff; // JDK 1.1 -> 9, comparable value allowing to check both major/minor version at once 1.4.1 > 1.4.0 // 16 unsigned bits for major, then 16 bits for minor long JDK1_1 = ((long)ClassFileConstants.MAJOR_VERSION_1_1 << 16) + ClassFileConstants.MINOR_VERSION_3; // 1.1. is 45.3 long JDK1_2 = ((long)ClassFileConstants.MAJOR_VERSION_1_2 << 16) + ClassFileConstants.MINOR_VERSION_0; long JDK1_3 = ((long)ClassFileConstants.MAJOR_VERSION_1_3 << 16) + ClassFileConstants.MINOR_VERSION_0; long JDK1_4 = ((long)ClassFileConstants.MAJOR_VERSION_1_4 << 16) + ClassFileConstants.MINOR_VERSION_0; long JDK1_5 = ((long)ClassFileConstants.MAJOR_VERSION_1_5 << 16) + ClassFileConstants.MINOR_VERSION_0; long JDK1_6 = ((long)ClassFileConstants.MAJOR_VERSION_1_6 << 16) + ClassFileConstants.MINOR_VERSION_0; long JDK1_7 = ((long)ClassFileConstants.MAJOR_VERSION_1_7 << 16) + ClassFileConstants.MINOR_VERSION_0; long JDK1_8 = ((long)ClassFileConstants.MAJOR_VERSION_1_8 << 16) + ClassFileConstants.MINOR_VERSION_0; long JDK9 = ((long)ClassFileConstants.MAJOR_VERSION_9 << 16) + ClassFileConstants.MINOR_VERSION_0; long JDK10 = ((long)ClassFileConstants.MAJOR_VERSION_10 << 16) + ClassFileConstants.MINOR_VERSION_0; long JDK11 = ((long)ClassFileConstants.MAJOR_VERSION_11 << 16) + ClassFileConstants.MINOR_VERSION_0; long JDK12 = ((long)ClassFileConstants.MAJOR_VERSION_12 << 16) + ClassFileConstants.MINOR_VERSION_0; long JDK13 = ((long)ClassFileConstants.MAJOR_VERSION_13 << 16) + ClassFileConstants.MINOR_VERSION_0; public static long getLatestJDKLevel() { return ((long)ClassFileConstants.MAJOR_LATEST_VERSION << 16) + ClassFileConstants.MINOR_VERSION_0; }
As we move away from declaring every compliance level explicitly (such as JDK11, JDK12 etc.), this method can be used to compute the compliance level on the fly for a given Java major version.
Params:
  • major – Java major version
Returns:the compliance level for the given Java version
/** * As we move away from declaring every compliance level explicitly (such as JDK11, JDK12 etc.), * this method can be used to compute the compliance level on the fly for a given Java major version. * * @param major Java major version * @return the compliance level for the given Java version */
public static long getComplianceLevelForJavaVersion(int major) { switch(major) { case ClassFileConstants.MAJOR_VERSION_1_1: return ((long)ClassFileConstants.MAJOR_VERSION_1_1 << 16) + ClassFileConstants.MINOR_VERSION_3; default: major = Math.min(major, MAJOR_LATEST_VERSION); return ((long)major << 16) + ClassFileConstants.MINOR_VERSION_0; } } /* * cldc1.1 is 45.3, but we modify it to be different from JDK1_1. * In the code gen, we will generate the same target value as JDK1_1 */ long CLDC_1_1 = ((long)ClassFileConstants.MAJOR_VERSION_1_1 << 16) + ClassFileConstants.MINOR_VERSION_4; // jdk level used to denote future releases: optional behavior is not enabled for now, but may become so. In order to enable these, // search for references to this constant, and change it to one of the official JDT constants above. long JDK_DEFERRED = Long.MAX_VALUE; int INT_ARRAY = 10; int BYTE_ARRAY = 8; int BOOLEAN_ARRAY = 4; int SHORT_ARRAY = 9; int CHAR_ARRAY = 5; int LONG_ARRAY = 11; int FLOAT_ARRAY = 6; int DOUBLE_ARRAY = 7; // Debug attributes int ATTR_SOURCE = 0x1; // SourceFileAttribute int ATTR_LINES = 0x2; // LineNumberAttribute int ATTR_VARS = 0x4; // LocalVariableTableAttribute int ATTR_STACK_MAP_TABLE = 0x8; // Stack map table attribute int ATTR_STACK_MAP = 0x10; // Stack map attribute: cldc int ATTR_TYPE_ANNOTATION = 0x20; // type annotation attribute (jsr 308) int ATTR_METHOD_PARAMETERS = 0x40; // method parameters attribute (jep 118) // See java.lang.invoke.LambdaMetafactory constants - option bitflags when calling altMetaFactory() int FLAG_SERIALIZABLE = 0x01; int FLAG_MARKERS = 0x02; int FLAG_BRIDGES = 0x04; }