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");
-        }
-    }
-}

Reply via email to