You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2021/11/27 17:17:39 UTC
[groovy] branch master updated: Tweak bytecode version management
This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new 4252862 Tweak bytecode version management
4252862 is described below
commit 42528624cff93a4a13b509d19d79f924af5eebf0
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sun Nov 28 01:14:20 2021 +0800
Tweak bytecode version management
---
.../groovy/classgen/DummyClassGenerator.java | 3 +--
.../groovy/classgen/asm/WriterController.java | 20 ++------------------
.../codehaus/groovy/control/CompilationUnit.java | 2 +-
.../groovy/control/CompilerConfiguration.java | 22 ++++++++++++++++++++++
.../codehaus/groovy/reflection/SunClassLoader.java | 8 ++++----
.../groovy/runtime/ProxyGeneratorAdapter.java | 7 +++----
.../groovy/runtime/callsite/CallSiteGenerator.java | 10 +++-------
.../runtime/callsite/GroovySunClassLoader.java | 2 +-
.../org/codehaus/groovy/tools/DgmConverter.java | 6 +++---
.../transform/stc/StaticTypeCheckingVisitor.java | 3 ++-
10 files changed, 42 insertions(+), 41 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/classgen/DummyClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/DummyClassGenerator.java
index ba1a22e..15cb674 100644
--- a/src/main/java/org/codehaus/groovy/classgen/DummyClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/DummyClassGenerator.java
@@ -37,7 +37,6 @@ import static org.objectweb.asm.Opcodes.ATHROW;
import static org.objectweb.asm.Opcodes.DUP;
import static org.objectweb.asm.Opcodes.INVOKESPECIAL;
import static org.objectweb.asm.Opcodes.NEW;
-import static org.objectweb.asm.Opcodes.V1_3;
/**
* To generate a class that has all the fields and methods, except that fields are not initialized
@@ -78,7 +77,7 @@ public class DummyClassGenerator extends ClassGenerator {
this.internalBaseClassName = BytecodeHelper.getClassInternalName(classNode.getSuperClass());
cv.visit(
- V1_3,
+ classNode.getCompileUnit().getConfig().getBytecodeVersion(),
classNode.getModifiers(),
internalClassName,
null,
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
index a266571..0f56c04 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
@@ -34,7 +34,6 @@ import org.codehaus.groovy.control.SourceUnit;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
import java.util.ArrayList;
import java.util.List;
@@ -67,7 +66,7 @@ public class WriterController {
private StatementWriter statementWriter;
private boolean fastPath;
private TypeChooser typeChooser;
- private int bytecodeVersion = Opcodes.V1_8;
+ private int bytecodeVersion = CompilerConfiguration.DEFAULT.getBytecodeVersion();
private int lineNumber = -1;
private int helperMethodIndex = 0;
private List<String> superMethodNames = new ArrayList<>();
@@ -93,7 +92,7 @@ public class WriterController {
this.outermostClass = null;
this.internalClassName = BytecodeHelper.getClassInternalName(cn);
- this.bytecodeVersion = chooseBytecodeVersion(invokedynamic, config.isPreviewFeatures(), config.getTargetBytecode());
+ this.bytecodeVersion = config.getBytecodeVersion();
if (invokedynamic) {
this.invocationWriter = new InvokeDynamicWriter(this);
@@ -141,21 +140,6 @@ public class WriterController {
return new LoggableClassVisitor(cv, config);
}
- private static int chooseBytecodeVersion(final boolean invokedynamic, final boolean previewFeatures, final String targetBytecode) {
- Integer bytecodeVersion = CompilerConfiguration.JDK_TO_BYTECODE_VERSION_MAP.get(targetBytecode);
- if (bytecodeVersion == null) {
- throw new GroovyBugError("Bytecode version [" + targetBytecode + "] is not supported by the compiler");
- }
-
- if (invokedynamic && bytecodeVersion <= Opcodes.V1_7) {
- return Opcodes.V1_7; // invokedynamic added here
- } else if (previewFeatures) {
- return bytecodeVersion | Opcodes.V_PREVIEW;
- } else {
- return bytecodeVersion;
- }
- }
-
//--------------------------------------------------------------------------
public AsmClassGenerator getAcg() {
diff --git a/src/main/java/org/codehaus/groovy/control/CompilationUnit.java b/src/main/java/org/codehaus/groovy/control/CompilationUnit.java
index 9e77602..72391a4 100644
--- a/src/main/java/org/codehaus/groovy/control/CompilationUnit.java
+++ b/src/main/java/org/codehaus/groovy/control/CompilationUnit.java
@@ -791,7 +791,7 @@ public class CompilationUnit extends ProcessingUnit {
};
protected ClassVisitor createClassVisitor() {
- return new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS) {
+ return new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) {
private ClassNode getClassNode(String name) {
// try classes under compilation
CompileUnit cu = getAST();
diff --git a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
index 829bcaa..20f76e3 100644
--- a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
+++ b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
@@ -19,6 +19,7 @@
package org.codehaus.groovy.control;
import org.apache.groovy.util.Maps;
+import org.codehaus.groovy.GroovyBugError;
import org.codehaus.groovy.control.customizers.CompilationCustomizer;
import org.codehaus.groovy.control.io.NullWriter;
import org.codehaus.groovy.control.messages.WarningMessage;
@@ -1079,6 +1080,27 @@ public class CompilerConfiguration {
}
/**
+ * Returns the ASM bytecode version
+ *
+ * @return ASM bytecode version
+ * @since 4.0.0
+ */
+ public int getBytecodeVersion() {
+ Integer bytecodeVersion = CompilerConfiguration.JDK_TO_BYTECODE_VERSION_MAP.get(targetBytecode);
+ if (bytecodeVersion == null) {
+ throw new GroovyBugError("Bytecode version [" + targetBytecode + "] is not supported by the compiler");
+ }
+
+ if (bytecodeVersion <= Opcodes.V1_8) {
+ return Opcodes.V1_8;
+ } else if (previewFeatures) {
+ return bytecodeVersion | Opcodes.V_PREVIEW;
+ } else {
+ return bytecodeVersion;
+ }
+ }
+
+ /**
* Returns the default target bytecode compatibility level
*
* @return the default target bytecode compatibility level
diff --git a/src/main/java/org/codehaus/groovy/reflection/SunClassLoader.java b/src/main/java/org/codehaus/groovy/reflection/SunClassLoader.java
index 8db79c1..2c78c96 100644
--- a/src/main/java/org/codehaus/groovy/reflection/SunClassLoader.java
+++ b/src/main/java/org/codehaus/groovy/reflection/SunClassLoader.java
@@ -18,6 +18,7 @@
*/
package org.codehaus.groovy.reflection;
+import org.codehaus.groovy.control.CompilerConfiguration;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
@@ -33,7 +34,6 @@ import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
import static org.objectweb.asm.Opcodes.ALOAD;
import static org.objectweb.asm.Opcodes.INVOKESPECIAL;
import static org.objectweb.asm.Opcodes.RETURN;
-import static org.objectweb.asm.Opcodes.V1_4;
/**
* Special class loader, which when running on Sun VM allows to generate accessor classes for any method
@@ -68,8 +68,8 @@ public class SunClassLoader extends ClassLoader {
}
private void loadMagic() {
- ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- cw.visit(V1_4, ACC_PUBLIC, "sun/reflect/GroovyMagic", null, "sun/reflect/MagicAccessorImpl", null);
+ ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+ cw.visit(CompilerConfiguration.DEFAULT.getBytecodeVersion(), ACC_PUBLIC, "sun/reflect/GroovyMagic", null, "sun/reflect/MagicAccessorImpl", null);
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
@@ -85,7 +85,7 @@ public class SunClassLoader extends ClassLoader {
protected void loadFromRes(String name) throws IOException {
try (final InputStream asStream = SunClassLoader.class.getClassLoader().getResourceAsStream(resName(name))) {
ClassReader reader = new ClassReader(asStream);
- final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+ final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
reader.accept(cw, ClassReader.SKIP_DEBUG);
define(cw.toByteArray(), name);
}
diff --git a/src/main/java/org/codehaus/groovy/runtime/ProxyGeneratorAdapter.java b/src/main/java/org/codehaus/groovy/runtime/ProxyGeneratorAdapter.java
index 6ad943e..9821da3 100644
--- a/src/main/java/org/codehaus/groovy/runtime/ProxyGeneratorAdapter.java
+++ b/src/main/java/org/codehaus/groovy/runtime/ProxyGeneratorAdapter.java
@@ -94,7 +94,6 @@ import static org.objectweb.asm.Opcodes.NEW;
import static org.objectweb.asm.Opcodes.POP;
import static org.objectweb.asm.Opcodes.PUTFIELD;
import static org.objectweb.asm.Opcodes.RETURN;
-import static org.objectweb.asm.Opcodes.V1_5;
/**
* A proxy generator responsible for mapping a map of closures to a class implementing a list of interfaces. For
@@ -180,7 +179,7 @@ public class ProxyGeneratorAdapter extends ClassVisitor {
final ClassLoader proxyLoader,
final boolean emptyBody,
final Class delegateClass) {
- super(CompilerConfiguration.ASM_API_VERSION, new ClassWriter(0));
+ super(CompilerConfiguration.ASM_API_VERSION, new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES));
this.loader = proxyLoader != null ? createInnerLoader(proxyLoader, interfaces) : findClassLoader(superClass, interfaces);
this.visitedMethods = new LinkedHashSet<Object>();
this.delegatedClosures = closureMap.isEmpty() ? EMPTY_DELEGATECLOSURE_MAP : new HashMap<String, Boolean>();
@@ -221,7 +220,7 @@ public class ProxyGeneratorAdapter extends ClassVisitor {
// generate bytecode
ClassWriter writer = (ClassWriter) cv;
- this.visit(V1_5, ACC_PUBLIC, proxyName, null, null, null);
+ this.visit(CompilerConfiguration.DEFAULT.getBytecodeVersion(), ACC_PUBLIC, proxyName, null, null, null);
byte[] b = writer.toByteArray();
// CheckClassAdapter.verify(new ClassReader(b), true, new PrintWriter(System.err));
cachedClass = loader.defineClass(proxyName.replace('/', '.'), b);
@@ -374,7 +373,7 @@ public class ProxyGeneratorAdapter extends ClassVisitor {
classList.add(GeneratedGroovyProxy.class);
interfacesSet.add("groovy/lang/GeneratedGroovyProxy");
}
- super.visit(V1_5, ACC_PUBLIC, proxyName, signature, BytecodeHelper.getClassInternalName(superClass), interfacesSet.toArray(EMPTY_STRING_ARRAY));
+ super.visit(CompilerConfiguration.DEFAULT.getBytecodeVersion(), ACC_PUBLIC, proxyName, signature, BytecodeHelper.getClassInternalName(superClass), interfacesSet.toArray(EMPTY_STRING_ARRAY));
visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
addDelegateFields();
if (addGroovyObjectSupport) {
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java b/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
index 163b3fc..643c084 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
+++ b/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
@@ -20,10 +20,10 @@ package org.codehaus.groovy.runtime.callsite;
import org.codehaus.groovy.classgen.GeneratorContext;
import org.codehaus.groovy.classgen.asm.BytecodeHelper;
+import org.codehaus.groovy.control.CompilerConfiguration;
import org.codehaus.groovy.reflection.CachedClass;
import org.codehaus.groovy.reflection.CachedMethod;
import org.codehaus.groovy.reflection.android.AndroidSupport;
-import org.codehaus.groovy.vmplugin.VMPluginFactory;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
@@ -154,7 +154,7 @@ public class CallSiteGenerator {
}
private static void classHeader(ClassWriter cw, String internalName, String superName) {
- cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, internalName, null, superName, null);
+ cw.visit(CompilerConfiguration.DEFAULT.getBytecodeVersion(), Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, internalName, null, superName, null);
}
public static byte[] genPogoMetaMethodSite(CachedMethod cachedMethod, ClassWriter cw, String name) {
@@ -209,11 +209,7 @@ public class CallSiteGenerator {
}
private static ClassWriter makeClassWriter() {
- if (VMPluginFactory.getPlugin().getVersion()>=8) {
- return new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
- } else {
- return new ClassWriter(ClassWriter.COMPUTE_MAXS);
- }
+ return new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
}
public static Constructor compilePogoMethod(CachedMethod cachedMethod) {
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java b/src/main/java/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java
index ddc4232..40ae164 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java
+++ b/src/main/java/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java
@@ -62,7 +62,7 @@ public class GroovySunClassLoader extends SunClassLoader {
private void loadAbstract(int parsingOptions) throws IOException {
try (final InputStream asStream = GroovySunClassLoader.class.getClassLoader().getResourceAsStream(resName("org.codehaus.groovy.runtime.callsite.AbstractCallSite"))) {
ClassReader reader = new ClassReader(asStream);
- final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+ final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
final ClassVisitor cv = new ClassVisitor(CompilerConfiguration.ASM_API_VERSION, cw) {
@Override
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
diff --git a/src/main/java/org/codehaus/groovy/tools/DgmConverter.java b/src/main/java/org/codehaus/groovy/tools/DgmConverter.java
index 34a14e4..004252a 100644
--- a/src/main/java/org/codehaus/groovy/tools/DgmConverter.java
+++ b/src/main/java/org/codehaus/groovy/tools/DgmConverter.java
@@ -19,6 +19,7 @@
package org.codehaus.groovy.tools;
import org.codehaus.groovy.classgen.asm.BytecodeHelper;
+import org.codehaus.groovy.control.CompilerConfiguration;
import org.codehaus.groovy.reflection.CachedClass;
import org.codehaus.groovy.reflection.CachedMethod;
import org.codehaus.groovy.reflection.GeneratedMetaMethod;
@@ -52,7 +53,6 @@ import static org.objectweb.asm.Opcodes.INVOKESTATIC;
import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
import static org.objectweb.asm.Opcodes.IRETURN;
import static org.objectweb.asm.Opcodes.RETURN;
-import static org.objectweb.asm.Opcodes.V1_3;
public class DgmConverter {
@@ -95,8 +95,8 @@ public class DgmConverter {
record.parameters = method.getNativeParameterTypes();
record.className = className;
- ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- cw.visit(V1_3, ACC_PUBLIC, className, null, "org/codehaus/groovy/reflection/GeneratedMetaMethod", null);
+ ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+ cw.visit(CompilerConfiguration.DEFAULT.getBytecodeVersion(), ACC_PUBLIC, className, null, "org/codehaus/groovy/reflection/GeneratedMetaMethod", null);
createConstructor(cw);
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 482425d..73d239c 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -103,6 +103,7 @@ import org.codehaus.groovy.ast.tools.WideningCategories;
import org.codehaus.groovy.classgen.ReturnAdder;
import org.codehaus.groovy.classgen.asm.InvocationWriter;
import org.codehaus.groovy.control.CompilationUnit;
+import org.codehaus.groovy.control.CompilerConfiguration;
import org.codehaus.groovy.control.ErrorCollector;
import org.codehaus.groovy.control.ResolveVisitor;
import org.codehaus.groovy.control.SourceUnit;
@@ -3807,7 +3808,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
&& directMethodCallCandidate.isStatic()
&& directMethodCallCandidate.getDeclaringClass().isInterface()
&& !(directMethodCallCandidate instanceof ExtensionMethodNode)) {
- typeCheckingContext.getEnclosingClassNode().putNodeMetaData(MINIMUM_BYTECODE_VERSION, Opcodes.V1_8);
+ typeCheckingContext.getEnclosingClassNode().putNodeMetaData(MINIMUM_BYTECODE_VERSION, CompilerConfiguration.DEFAULT.getBytecodeVersion());
}
checkOrMarkPrivateAccess(call, directMethodCallCandidate);