Java tutorial
/******************************************************************************* * 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. */ int AccMandated = 0x8000; /** * 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. */ int AccSuper = 0x0020; /** * 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. * * @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; }