You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by bl...@apache.org on 2023/08/16 18:44:54 UTC
[groovy] 01/01: GROOVY-11156: remove illegal magic accessor usage
This is an automated email from the ASF dual-hosted git repository.
blackdrag pushed a commit to branch feature/remove_magic_accessor_usage
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 0cfa37331f23434e03e1544d0c25dcf153f174eb
Author: Jochen Theodorou <bl...@gmx.org>
AuthorDate: Wed Aug 16 20:44:31 2023 +0200
GROOVY-11156: remove illegal magic accessor usage
---
.../reflection/ClassLoaderForClassArtifacts.java | 7 --
.../codehaus/groovy/reflection/SunClassLoader.java | 125 ---------------------
.../groovy/runtime/callsite/CallSiteGenerator.java | 2 +-
.../runtime/callsite/GroovySunClassLoader.java | 81 -------------
4 files changed, 1 insertion(+), 214 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java b/src/main/java/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
index 1fe20f193b..413f28c141 100644
--- a/src/main/java/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
+++ b/src/main/java/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
@@ -21,7 +21,6 @@ package org.codehaus.groovy.reflection;
import groovy.lang.MetaClassImpl;
import groovy.lang.MetaMethod;
import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.GroovySunClassLoader;
import java.lang.ref.SoftReference;
import java.lang.reflect.Constructor;
@@ -50,12 +49,6 @@ public class ClassLoaderForClassArtifacts extends ClassLoader {
if (cls != null)
return cls;
- if (GroovySunClassLoader.sunVM != null) {
- cls = GroovySunClassLoader.sunVM.doesKnow(name);
- if (cls != null)
- return cls;
- }
-
return super.loadClass(name);
}
diff --git a/src/main/java/org/codehaus/groovy/reflection/SunClassLoader.java b/src/main/java/org/codehaus/groovy/reflection/SunClassLoader.java
deleted file mode 100644
index ee0a104390..0000000000
--- a/src/main/java/org/codehaus/groovy/reflection/SunClassLoader.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-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;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.util.HashMap;
-import java.util.Map;
-
-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;
-
-/**
- * Special class loader, which when running on Sun VM allows to generate accessor classes for any method
- */
-public class SunClassLoader extends ClassLoader {
- protected final Map<String, Class> knownClasses = new HashMap<String, Class>();
-
- protected static final SunClassLoader sunVM;
-
- static {
- SunClassLoader res;
- try {
- res = doPrivileged((PrivilegedAction<SunClassLoader>) () -> {
- try {
- return new SunClassLoader();
- } catch (Throwable e) {
- return null;
- }
- });
- } catch (Throwable e) {
- res = null;
- }
- sunVM = res;
- }
-
- @SuppressWarnings("removal") // TODO a future Groovy version should perform the operation not as a privileged action
- private static <T> T doPrivileged(PrivilegedAction<T> action) {
- return java.security.AccessController.doPrivileged(action);
- }
-
- protected SunClassLoader() throws Throwable {
- super(SunClassLoader.class.getClassLoader());
-
- final Class magic = ClassLoader.getSystemClassLoader().loadClass("sun.reflect.MagicAccessorImpl");
- knownClasses.put("sun.reflect.MagicAccessorImpl", magic);
- loadMagic();
- }
-
- private void loadMagic() {
- 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);
- mv.visitMethodInsn(INVOKESPECIAL, "sun/reflect/MagicAccessorImpl", "<init>", "()V", false);
- mv.visitInsn(RETURN);
- mv.visitMaxs(0, 0);
- mv.visitEnd();
- cw.visitEnd();
-
- define(cw.toByteArray(), "sun.reflect.GroovyMagic");
- }
-
- 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 | ClassWriter.COMPUTE_FRAMES);
- reader.accept(cw, ClassReader.SKIP_DEBUG);
- define(cw.toByteArray(), name);
- }
- }
-
- protected static String resName(String s) {
- return s.replace('.', '/') + ".class";
- }
-
- protected void define(byte[] bytes, final String name) {
- knownClasses.put(name, defineClass(name, bytes, 0, bytes.length));
- }
-
- @Override
- protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
- final Class aClass = knownClasses.get(name);
- if (aClass != null)
- return aClass;
- else {
- try {
- return super.loadClass(name, resolve);
- } catch (ClassNotFoundException e) {
- return getClass().getClassLoader().loadClass(name);
- }
- }
- }
-
- public Class doesKnow(String name) {
- return knownClasses.get(name);
- }
-}
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 643c08467f..4b9aac7654 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
+++ b/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
@@ -249,7 +249,7 @@ public class CallSiteGenerator {
}
public static boolean isCompilable (CachedMethod method) {
- return (GroovySunClassLoader.sunVM != null || Modifier.isPublic(method.cachedClass.getModifiers()) && method.isPublic() && publicParams(method))
+ return (Modifier.isPublic(method.cachedClass.getModifiers()) && method.isPublic() && publicParams(method))
&& !AndroidSupport.isRunningAndroid() && containsOnlyValidChars(method.getName());
}
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java b/src/main/java/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java
deleted file mode 100644
index 9dc48c4e8c..0000000000
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.codehaus.groovy.runtime.callsite;
-
-import org.codehaus.groovy.reflection.SunClassLoader;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.ClassWriter;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.security.PrivilegedAction;
-
-import static org.codehaus.groovy.control.CompilerConfiguration.ASM_API_VERSION;
-
-public class GroovySunClassLoader extends SunClassLoader {
-
- public static final SunClassLoader sunVM;
-
- static {
- sunVM = doPrivileged((PrivilegedAction<SunClassLoader>) () -> {
- try {
- if (SunClassLoader.sunVM != null) {
- return new GroovySunClassLoader();
- }
- } catch (Throwable ignore) {
- }
- return null;
- });
- }
-
- @SuppressWarnings("removal") // TODO a future Groovy version should perform the operation not as a privileged action
- private static <T> T doPrivileged(PrivilegedAction<T> action) {
- return java.security.AccessController.doPrivileged(action);
- }
-
- protected GroovySunClassLoader() throws Throwable {
- this(ClassReader.SKIP_CODE);
- }
-
- protected GroovySunClassLoader(int parsingOptions) throws Throwable {
- super();
- loadAbstract(parsingOptions);
- loadFromRes("org.codehaus.groovy.runtime.callsite.MetaClassSite");
- loadFromRes("org.codehaus.groovy.runtime.callsite.MetaMethodSite");
- loadFromRes("org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite");
- loadFromRes("org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite");
- loadFromRes("org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite");
- }
-
- 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 | ClassWriter.COMPUTE_FRAMES);
- final ClassVisitor cv = new ClassVisitor(ASM_API_VERSION, cw) {
- @Override
- public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
- super.visit(version, access, name, signature, "sun/reflect/GroovyMagic", interfaces);
- }
- };
- reader.accept(cv, parsingOptions);
- define(cw.toByteArray(), "org.codehaus.groovy.runtime.callsite.AbstractCallSite");
- }
- }
-}