You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2020/02/21 02:07:56 UTC

[groovy] branch master updated: GROOVY-9409: org.codehaus.groovy.runtime.callsite.GroovySunClassLoader is unusable

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 5c61675  GROOVY-9409: org.codehaus.groovy.runtime.callsite.GroovySunClassLoader is unusable
5c61675 is described below

commit 5c61675c9f15815baded155dd3364b6d8279dcc8
Author: Paul King <pa...@asert.com.au>
AuthorDate: Fri Feb 21 00:11:03 2020 +1000

    GROOVY-9409: org.codehaus.groovy.runtime.callsite.GroovySunClassLoader is unusable
---
 .../codehaus/groovy/reflection/SunClassLoader.java | 20 +++++++--------
 .../runtime/callsite/GroovySunClassLoader.java     | 29 ++++++++++++----------
 2 files changed, 25 insertions(+), 24 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/reflection/SunClassLoader.java b/src/main/java/org/codehaus/groovy/reflection/SunClassLoader.java
index b8e9c1c..6ae9d71 100644
--- a/src/main/java/org/codehaus/groovy/reflection/SunClassLoader.java
+++ b/src/main/java/org/codehaus/groovy/reflection/SunClassLoader.java
@@ -34,7 +34,7 @@ import java.util.Map;
  * Special class loader, which when running on Sun VM allows to generate accessor classes for any method
  */
 public class SunClassLoader extends ClassLoader implements Opcodes {
-    protected final Map<String,Class> knownClasses = new HashMap<String,Class>();
+    protected final Map<String, Class> knownClasses = new HashMap<String, Class>();
 
     protected static final SunClassLoader sunVM;
 
@@ -48,19 +48,18 @@ public class SunClassLoader extends ClassLoader implements Opcodes {
                     return null;
                 }
             });
-        }
-        catch (Throwable e) {
+        } catch (Throwable e) {
             res = null;
         }
         sunVM = res;
     }
 
     protected SunClassLoader() throws Throwable {
-        super (SunClassLoader.class.getClassLoader());
+        super(SunClassLoader.class.getClassLoader());
 
         final Class magic = ClassLoader.getSystemClassLoader().loadClass("sun.reflect.MagicAccessorImpl");
         knownClasses.put("sun.reflect.MagicAccessorImpl", magic);
-        loadMagic ();
+        loadMagic();
     }
 
     private void loadMagic() {
@@ -71,7 +70,7 @@ public class SunClassLoader extends ClassLoader implements Opcodes {
         mv.visitVarInsn(ALOAD, 0);
         mv.visitMethodInsn(INVOKESPECIAL, "sun/reflect/MagicAccessorImpl", "<init>", "()V", false);
         mv.visitInsn(RETURN);
-        mv.visitMaxs(0,0);
+        mv.visitMaxs(0, 0);
         mv.visitEnd();
         cw.visitEnd();
 
@@ -82,13 +81,13 @@ public class SunClassLoader extends ClassLoader implements Opcodes {
         try (final InputStream asStream = SunClassLoader.class.getClassLoader().getResourceAsStream(resName(name))) {
             ClassReader reader = new ClassReader(asStream);
             final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-            reader.accept(cw, ClassWriter.COMPUTE_MAXS);
+            reader.accept(cw, ClassReader.SKIP_DEBUG);
             define(cw.toByteArray(), name);
         }
     }
 
     protected static String resName(String s) {
-        return s.replace('.','/') + ".class";
+        return s.replace('.', '/') + ".class";
     }
 
     protected void define(byte[] bytes, final String name) {
@@ -98,12 +97,11 @@ public class SunClassLoader extends ClassLoader implements Opcodes {
     protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
         final Class aClass = knownClasses.get(name);
         if (aClass != null)
-          return aClass;
+            return aClass;
         else {
             try {
                 return super.loadClass(name, resolve);
-            }
-            catch (ClassNotFoundException e) {
+            } catch (ClassNotFoundException e) {
                 return getClass().getClassLoader().loadClass(name);
             }
         }
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java b/src/main/java/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java
index 07a39d1..3d504bf 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java
+++ b/src/main/java/org/codehaus/groovy/runtime/callsite/GroovySunClassLoader.java
@@ -34,21 +34,24 @@ public class GroovySunClassLoader extends SunClassLoader {
     public static final SunClassLoader sunVM;
 
     static {
-            sunVM = AccessController.doPrivileged((PrivilegedAction<SunClassLoader>) () -> {
-                try {
-                    if (SunClassLoader.sunVM != null) {
-                        return new GroovySunClassLoader();
-                    }
+        sunVM = AccessController.doPrivileged((PrivilegedAction<SunClassLoader>) () -> {
+            try {
+                if (SunClassLoader.sunVM != null) {
+                    return new GroovySunClassLoader();
                 }
-                catch (Throwable t) {//
-                }
-                return null;
-            });
+            } catch (Throwable ignore) {
+            }
+            return null;
+        });
+    }
+
+    protected GroovySunClassLoader() throws Throwable {
+        this(ClassReader.SKIP_CODE);
     }
 
-    protected GroovySunClassLoader () throws Throwable {
+    protected GroovySunClassLoader(int parsingOptions) throws Throwable {
         super();
-        loadAbstract ();
+        loadAbstract(parsingOptions);
         loadFromRes("org.codehaus.groovy.runtime.callsite.MetaClassSite");
         loadFromRes("org.codehaus.groovy.runtime.callsite.MetaMethodSite");
         loadFromRes("org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite");
@@ -56,7 +59,7 @@ public class GroovySunClassLoader extends SunClassLoader {
         loadFromRes("org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite");
     }
 
-    private void loadAbstract() throws IOException {
+    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);
@@ -65,7 +68,7 @@ public class GroovySunClassLoader extends SunClassLoader {
                     super.visit(version, access, name, signature, "sun/reflect/GroovyMagic", interfaces);
                 }
             };
-            reader.accept(cv, ClassWriter.COMPUTE_MAXS);
+            reader.accept(cv, parsingOptions);
             define(cw.toByteArray(), "org.codehaus.groovy.runtime.callsite.AbstractCallSite");
         }
     }