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 1034c3ad13 make use of Runtime.version().feature() (#2019)
1034c3ad13 is described below
commit 1034c3ad13bc2b00b6684ff21c0d78d57eee9f62
Author: Jochen Theodorou <[email protected]>
AuthorDate: Tue Jan 9 17:46:27 2024 +0100
make use of Runtime.version().feature() (#2019)
* make use of Runtime.version().feature()
* try avoiding classloading failure for class version unsupported by asm
* rename failOnIllegalArguentException to
failOnUnexpectedParseClassException
---
.../org/codehaus/groovy/control/ClassNodeResolver.java | 13 ++++++++++---
.../codehaus/groovy/control/CompilerConfiguration.java | 3 +--
src/main/java/org/codehaus/groovy/vmplugin/VMPlugin.java | 2 ++
.../org/codehaus/groovy/vmplugin/VMPluginFactory.java | 15 ++++++---------
.../groovy/groovysh/util/SecurityManagerUtil.groovy | 11 +++++------
5 files changed, 24 insertions(+), 20 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/control/ClassNodeResolver.java
b/src/main/java/org/codehaus/groovy/control/ClassNodeResolver.java
index 8be558d3e1..94e8317853 100644
--- a/src/main/java/org/codehaus/groovy/control/ClassNodeResolver.java
+++ b/src/main/java/org/codehaus/groovy/control/ClassNodeResolver.java
@@ -188,15 +188,16 @@ public class ClassNodeResolver {
private LookupResult tryAsLoaderClassOrScript(final String name, final
CompilationUnit compilationUnit) {
GroovyClassLoader loader = compilationUnit.getClassLoader();
Map<String, Boolean> options =
compilationUnit.configuration.getOptimizationOptions();
+ boolean noClassLoaderResolving =
Boolean.FALSE.equals(options.get("classLoaderResolving"));
if (!Boolean.FALSE.equals(options.get("asmResolving"))) {
- LookupResult result = findDecompiled(name, compilationUnit,
loader);
+ LookupResult result = findDecompiled(name, compilationUnit,
loader, noClassLoaderResolving);
if (result != null) {
return result;
}
}
- if (!Boolean.FALSE.equals(options.get("classLoaderResolving"))) {
+ if (!noClassLoaderResolving) {
return findByClassLoading(name, compilationUnit, loader);
}
@@ -241,7 +242,7 @@ public class ClassNodeResolver {
/**
* Search for classes using ASM decompiler
*/
- private LookupResult findDecompiled(final String name, final
CompilationUnit compilationUnit, final GroovyClassLoader loader) {
+ private LookupResult findDecompiled(final String name, final
CompilationUnit compilationUnit, final GroovyClassLoader loader, boolean
failOnUnexpectedParseClassException) {
ClassNode node = ClassHelper.make(name);
if (node.isResolved()) {
return new LookupResult(null, node);
@@ -259,6 +260,12 @@ public class ClassNodeResolver {
}
} catch (IOException e) {
// fall through and attempt other search strategies
+ } catch (IllegalArgumentException e) {
+ // very likely resolving failed here due to a class format
error or similar
+ // if we do not try other means we should report this error to
the user
+ if (failOnUnexpectedParseClassException) {
+ throw e;
+ }
}
}
diff --git
a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
index 6d9522acd5..15eaeb9fa2 100644
--- a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
+++ b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
@@ -23,7 +23,6 @@ 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;
-import org.codehaus.groovy.vmplugin.VMPlugin;
import org.objectweb.asm.Opcodes;
import java.io.File;
@@ -1115,7 +1114,7 @@ public class CompilerConfiguration {
* @since 4.0.0
*/
private static String defaultTargetBytecode() {
- final String javaVersion = VMPlugin.getJavaVersion();
+ String javaVersion = Integer.toString(Runtime.version().feature());
if (JDK_TO_BYTECODE_VERSION_MAP.containsKey(javaVersion)) {
return javaVersion;
}
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/VMPlugin.java
b/src/main/java/org/codehaus/groovy/vmplugin/VMPlugin.java
index 5c27d9bb8e..602b452bf6 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/VMPlugin.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/VMPlugin.java
@@ -76,7 +76,9 @@ public interface VMPlugin {
*
* @return java version
* @since 4.0.0
+ * @deprecated
*/
+ @Deprecated
static String getJavaVersion() {
try {
return System.getProperty("java.specification.version");
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/VMPluginFactory.java
b/src/main/java/org/codehaus/groovy/vmplugin/VMPluginFactory.java
index 978d8c5308..875a184c55 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/VMPluginFactory.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/VMPluginFactory.java
@@ -21,7 +21,6 @@ package org.codehaus.groovy.vmplugin;
import org.apache.groovy.util.Maps;
import org.codehaus.groovy.runtime.DefaultGroovyMethods;
-import java.math.BigDecimal;
import java.util.Map;
/**
@@ -31,12 +30,10 @@ import java.util.Map;
*/
public class VMPluginFactory {
- private static final Map<BigDecimal,String> PLUGIN_MAP = Maps.of(
+ private static final Map<Integer,String> PLUGIN_MAP = Maps.of(
// NOTE: Declare the vm plugin entries in *descending* order!
- new BigDecimal( "16"), "org.codehaus.groovy.vmplugin.v16.Java16",
- new BigDecimal( "10"), "org.codehaus.groovy.vmplugin.v10.Java10",
- new BigDecimal( "9"), "org.codehaus.groovy.vmplugin.v9.Java9",
- new BigDecimal("1.8"), "org.codehaus.groovy.vmplugin.v8.Java8"
+ 16, "org.codehaus.groovy.vmplugin.v16.Java16",
+ 10, "org.codehaus.groovy.vmplugin.v10.Java10"
);
private static final VMPlugin PLUGIN = createPlugin();
@@ -44,9 +41,9 @@ public class VMPluginFactory {
private static VMPlugin createPlugin() {
return doPrivileged(() -> {
ClassLoader loader = VMPluginFactory.class.getClassLoader();
- BigDecimal specVer = new BigDecimal(VMPlugin.getJavaVersion());
- for (Map.Entry<BigDecimal,String> entry : PLUGIN_MAP.entrySet()) {
- if (DefaultGroovyMethods.isAtLeast(specVer, entry.getKey())) {
+ int specVer = Runtime.version().feature();
+ for (Map.Entry<Integer,String> entry : PLUGIN_MAP.entrySet()) {
+ if (specVer >= entry.getKey()) {
String fullName = entry.getValue();
try {
return (VMPlugin)
loader.loadClass(fullName).getDeclaredConstructor().newInstance();
diff --git
a/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/SecurityManagerUtil.groovy
b/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/SecurityManagerUtil.groovy
index b16daa5088..026535c953 100644
---
a/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/SecurityManagerUtil.groovy
+++
b/subprojects/groovy-groovysh/src/main/groovy/org/apache/groovy/groovysh/util/SecurityManagerUtil.groovy
@@ -18,9 +18,6 @@
*/
package org.apache.groovy.groovysh.util
-import org.codehaus.groovy.control.CompilerConfiguration
-import org.codehaus.groovy.vmplugin.VMPlugin
-
class SecurityManagerUtil {
private final SecurityManager saved
@@ -28,14 +25,16 @@ class SecurityManagerUtil {
if (explicitlyEnabled() || autoEnabledUntilJDK17()) {
saved = System.getSecurityManager()
System.setSecurityManager(new NoExitSecurityManager())
+ } else {
+ saved = null;
}
}
- private boolean autoEnabledUntilJDK17() {
- !CompilerConfiguration.isPostJDK18(VMPlugin.getJavaVersion())
+ private static boolean autoEnabledUntilJDK17() {
+ return Runtime.version().feature() < 18;
}
- private boolean explicitlyEnabled() {
+ private static boolean explicitlyEnabled() {
System.getProperty('java.security.manager', 'disallow') == 'allow'
}