| /******************************************************************************* |
| * 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 |
| * Fraunhofer FIRST - extended API and implementation |
| * Technical University Berlin - extended 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; |
| |
| /** |
| * OTDT changes: |
| * What: more constants: team, valueParam |
| */ |
| 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; |
| } |