This is an automated email from the ASF dual-hosted git repository. paulk 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 2bcbef9739 GROOVY-11156: remove illegal magic accessor usage 2bcbef9739 is described below commit 2bcbef97399b15616c3112f8e3b7947f5f46ede8 Author: Jochen Theodorou <blackd...@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"); - } - } -}