8270949: Make dynamically generated classes with the class file version of the current release
Reviewed-by: alanb
This commit is contained in:
parent
b7245c6164
commit
ddce47cd3c
@ -621,7 +621,7 @@ abstract class ClassSpecializer<T,K,S extends ClassSpecializer<T,K,S>.SpeciesDat
|
|||||||
|
|
||||||
final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
|
final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
|
||||||
final int NOT_ACC_PUBLIC = 0; // not ACC_PUBLIC
|
final int NOT_ACC_PUBLIC = 0; // not ACC_PUBLIC
|
||||||
cw.visit(V1_6, NOT_ACC_PUBLIC + ACC_FINAL + ACC_SUPER, className, null, superClassName, null);
|
cw.visit(CLASSFILE_VERSION, NOT_ACC_PUBLIC + ACC_FINAL + ACC_SUPER, className, null, superClassName, null);
|
||||||
|
|
||||||
final String sourceFile = className.substring(className.lastIndexOf('.')+1);
|
final String sourceFile = className.substring(className.lastIndexOf('.')+1);
|
||||||
cw.visitSource(sourceFile, null);
|
cw.visitSource(sourceFile, null);
|
||||||
|
@ -39,6 +39,7 @@ import java.util.TreeSet;
|
|||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static java.lang.invoke.LambdaForm.BasicType.*;
|
import static java.lang.invoke.LambdaForm.BasicType.*;
|
||||||
|
import static java.lang.invoke.MethodHandleStatics.CLASSFILE_VERSION;
|
||||||
import static java.lang.invoke.MethodTypeForm.*;
|
import static java.lang.invoke.MethodTypeForm.*;
|
||||||
import static java.lang.invoke.LambdaForm.Kind.*;
|
import static java.lang.invoke.LambdaForm.Kind.*;
|
||||||
|
|
||||||
@ -504,7 +505,7 @@ class GenerateJLIClassesHelper {
|
|||||||
*/
|
*/
|
||||||
private static byte[] generateCodeBytesForLFs(String className, String[] names, LambdaForm[] forms) {
|
private static byte[] generateCodeBytesForLFs(String className, String[] names, LambdaForm[] forms) {
|
||||||
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
|
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
|
||||||
cw.visit(Opcodes.V1_8, Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER,
|
cw.visit(CLASSFILE_VERSION, Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER,
|
||||||
className, null, InvokerBytecodeGenerator.INVOKER_SUPER_NAME, null);
|
className, null, InvokerBytecodeGenerator.INVOKER_SUPER_NAME, null);
|
||||||
cw.visitSource(className.substring(className.lastIndexOf('/') + 1), null);
|
cw.visitSource(className.substring(className.lastIndexOf('/') + 1), null);
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
package java.lang.invoke;
|
package java.lang.invoke;
|
||||||
|
|
||||||
import jdk.internal.misc.CDS;
|
import jdk.internal.misc.CDS;
|
||||||
|
import jdk.internal.misc.VM;
|
||||||
import jdk.internal.org.objectweb.asm.*;
|
import jdk.internal.org.objectweb.asm.*;
|
||||||
import sun.invoke.util.BytecodeDescriptor;
|
import sun.invoke.util.BytecodeDescriptor;
|
||||||
import sun.invoke.util.VerifyAccess;
|
import sun.invoke.util.VerifyAccess;
|
||||||
@ -56,7 +57,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
|
|||||||
* @see LambdaMetafactory
|
* @see LambdaMetafactory
|
||||||
*/
|
*/
|
||||||
/* package */ final class InnerClassLambdaMetafactory extends AbstractValidatingLambdaMetafactory {
|
/* package */ final class InnerClassLambdaMetafactory extends AbstractValidatingLambdaMetafactory {
|
||||||
private static final int CLASSFILE_VERSION = 59;
|
private static final int CLASSFILE_VERSION = VM.classFileVersion();
|
||||||
private static final String METHOD_DESCRIPTOR_VOID = Type.getMethodDescriptor(Type.VOID_TYPE);
|
private static final String METHOD_DESCRIPTOR_VOID = Type.getMethodDescriptor(Type.VOID_TYPE);
|
||||||
private static final String JAVA_LANG_OBJECT = "java/lang/Object";
|
private static final String JAVA_LANG_OBJECT = "java/lang/Object";
|
||||||
private static final String NAME_CTOR = "<init>";
|
private static final String NAME_CTOR = "<init>";
|
||||||
|
@ -340,7 +340,7 @@ class InvokerBytecodeGenerator {
|
|||||||
final int NOT_ACC_PUBLIC = 0; // not ACC_PUBLIC
|
final int NOT_ACC_PUBLIC = 0; // not ACC_PUBLIC
|
||||||
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
|
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
|
||||||
setClassWriter(cw);
|
setClassWriter(cw);
|
||||||
cw.visit(Opcodes.V1_8, NOT_ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER,
|
cw.visit(CLASSFILE_VERSION, NOT_ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER,
|
||||||
className, null, INVOKER_SUPER_NAME, null);
|
className, null, INVOKER_SUPER_NAME, null);
|
||||||
cw.visitSource(SOURCE_PREFIX + name, null);
|
cw.visitSource(SOURCE_PREFIX + name, null);
|
||||||
return cw;
|
return cw;
|
||||||
|
@ -1156,7 +1156,7 @@ abstract class MethodHandleImpl {
|
|||||||
// return vamh.invokeExact(args);
|
// return vamh.invokeExact(args);
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
cw.visit(52, ACC_PRIVATE | ACC_SUPER, "InjectedInvoker", null, "java/lang/Object", null);
|
cw.visit(CLASSFILE_VERSION, ACC_PRIVATE | ACC_SUPER, "InjectedInvoker", null, "java/lang/Object", null);
|
||||||
|
|
||||||
MethodVisitor mv = cw.visitMethod(ACC_STATIC, "invoke_V",
|
MethodVisitor mv = cw.visitMethod(ACC_STATIC, "invoke_V",
|
||||||
"(Ljava/lang/invoke/MethodHandle;[Ljava/lang/Object;)Ljava/lang/Object;",
|
"(Ljava/lang/invoke/MethodHandle;[Ljava/lang/Object;)Ljava/lang/Object;",
|
||||||
|
@ -27,6 +27,7 @@ package java.lang.invoke;
|
|||||||
|
|
||||||
import jdk.internal.misc.CDS;
|
import jdk.internal.misc.CDS;
|
||||||
import jdk.internal.misc.Unsafe;
|
import jdk.internal.misc.Unsafe;
|
||||||
|
import jdk.internal.misc.VM;
|
||||||
import sun.security.action.GetPropertyAction;
|
import sun.security.action.GetPropertyAction;
|
||||||
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
@ -46,6 +47,7 @@ class MethodHandleStatics {
|
|||||||
private MethodHandleStatics() { } // do not instantiate
|
private MethodHandleStatics() { } // do not instantiate
|
||||||
|
|
||||||
static final Unsafe UNSAFE = Unsafe.getUnsafe();
|
static final Unsafe UNSAFE = Unsafe.getUnsafe();
|
||||||
|
static final int CLASSFILE_VERSION = VM.classFileVersion();
|
||||||
|
|
||||||
static final boolean DEBUG_METHOD_HANDLE_NAMES;
|
static final boolean DEBUG_METHOD_HANDLE_NAMES;
|
||||||
static final boolean DUMP_CLASS_FILES;
|
static final boolean DUMP_CLASS_FILES;
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
package java.lang.reflect;
|
package java.lang.reflect;
|
||||||
|
|
||||||
|
import jdk.internal.misc.VM;
|
||||||
import jdk.internal.org.objectweb.asm.ClassWriter;
|
import jdk.internal.org.objectweb.asm.ClassWriter;
|
||||||
import jdk.internal.org.objectweb.asm.Label;
|
import jdk.internal.org.objectweb.asm.Label;
|
||||||
import jdk.internal.org.objectweb.asm.MethodVisitor;
|
import jdk.internal.org.objectweb.asm.MethodVisitor;
|
||||||
@ -55,7 +56,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
|
|||||||
* "generateProxyClass" method.
|
* "generateProxyClass" method.
|
||||||
*/
|
*/
|
||||||
final class ProxyGenerator extends ClassWriter {
|
final class ProxyGenerator extends ClassWriter {
|
||||||
|
private static final int CLASSFILE_VERSION = VM.classFileVersion();
|
||||||
private static final String JL_CLASS = "java/lang/Class";
|
private static final String JL_CLASS = "java/lang/Class";
|
||||||
private static final String JL_OBJECT = "java/lang/Object";
|
private static final String JL_OBJECT = "java/lang/Object";
|
||||||
private static final String JL_THROWABLE = "java/lang/Throwable";
|
private static final String JL_THROWABLE = "java/lang/Throwable";
|
||||||
@ -455,7 +456,7 @@ final class ProxyGenerator extends ClassWriter {
|
|||||||
* class file generation process.
|
* class file generation process.
|
||||||
*/
|
*/
|
||||||
private byte[] generateClassFile() {
|
private byte[] generateClassFile() {
|
||||||
visit(V14, accessFlags, dotToSlash(className), null,
|
visit(CLASSFILE_VERSION, accessFlags, dotToSlash(className), null,
|
||||||
JLR_PROXY, typeNames(interfaces));
|
JLR_PROXY, typeNames(interfaces));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -151,6 +151,14 @@ public class VM {
|
|||||||
private static int classFileMinorVersion;
|
private static int classFileMinorVersion;
|
||||||
private static final int PREVIEW_MINOR_VERSION = 65535;
|
private static final int PREVIEW_MINOR_VERSION = 65535;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the class file version of the current release.
|
||||||
|
* @jvms 4.1 Table 4.1-A. class file format major versions
|
||||||
|
*/
|
||||||
|
public static int classFileVersion() {
|
||||||
|
return classFileMajorVersion;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests if the given version is a supported {@code class}
|
* Tests if the given version is a supported {@code class}
|
||||||
* file version.
|
* file version.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user