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 16:43:21 UTC
[groovy] branch danielsun/bump-bytecode-version updated: Tweak bytecode version management
This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch danielsun/bump-bytecode-version
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/danielsun/bump-bytecode-version by this push:
new c33c4b5 Tweak bytecode version management
c33c4b5 is described below
commit c33c4b5348d34c26e388e1f9d429ac5cc63ba97e
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sun Nov 28 00:42:45 2021 +0800
Tweak bytecode version management
---
.../groovy/classgen/DummyClassGenerator.java | 3 +--
.../groovy/classgen/asm/WriterController.java | 20 ++------------------
.../groovy/control/CompilerConfiguration.java | 22 ++++++++++++++++++++++
.../codehaus/groovy/reflection/SunClassLoader.java | 4 ++--
.../groovy/runtime/ProxyGeneratorAdapter.java | 5 ++---
.../groovy/runtime/callsite/CallSiteGenerator.java | 3 ++-
.../org/codehaus/groovy/tools/DgmConverter.java | 4 ++--
.../transform/stc/StaticTypeCheckingVisitor.java | 3 ++-
8 files changed, 35 insertions(+), 29 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/classgen/DummyClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/DummyClassGenerator.java
index c8a4b17..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_8;
/**
* 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_8,
+ 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 369035e..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_8) {
- return Opcodes.V1_8; // 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/CompilerConfiguration.java b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
index 829bcaa..a095a69 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; // invokedynamic added here
+ } 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 6a97025..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_8;
/**
* Special class loader, which when running on Sun VM allows to generate accessor classes for any method
@@ -69,7 +69,7 @@ public class SunClassLoader extends ClassLoader {
private void loadMagic() {
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
- cw.visit(V1_8, ACC_PUBLIC, "sun/reflect/GroovyMagic", null, "sun/reflect/MagicAccessorImpl", null);
+ 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);
diff --git a/src/main/java/org/codehaus/groovy/runtime/ProxyGeneratorAdapter.java b/src/main/java/org/codehaus/groovy/runtime/ProxyGeneratorAdapter.java
index 37e8a1b..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_8;
/**
* A proxy generator responsible for mapping a map of closures to a class implementing a list of interfaces. For
@@ -221,7 +220,7 @@ public class ProxyGeneratorAdapter extends ClassVisitor {
// generate bytecode
ClassWriter writer = (ClassWriter) cv;
- this.visit(V1_8, 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_8, 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 a6a2834..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,6 +20,7 @@ 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;
@@ -153,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) {
diff --git a/src/main/java/org/codehaus/groovy/tools/DgmConverter.java b/src/main/java/org/codehaus/groovy/tools/DgmConverter.java
index fec5803..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_8;
public class DgmConverter {
@@ -96,7 +96,7 @@ public class DgmConverter {
record.className = className;
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
- cw.visit(V1_8, ACC_PUBLIC, className, null, "org/codehaus/groovy/reflection/GeneratedMetaMethod", null);
+ 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);