You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2019/12/12 23:35:41 UTC

[groovy] branch master updated: GROOVY-9329: OOME raised while `parseClass(scriptText)` (#1117)

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 635039e  GROOVY-9329: OOME raised while `parseClass(scriptText)` (#1117)
635039e is described below

commit 635039e03e71b361931e77e7328baff9481d85cd
Author: Daniel.Sun <su...@apache.org>
AuthorDate: Fri Dec 13 07:35:32 2019 +0800

    GROOVY-9329: OOME raised while `parseClass(scriptText)` (#1117)
---
 src/main/java/groovy/lang/GroovyClassLoader.java | 10 ++++--
 src/test/groovy/bugs/Groovy9329.groovy           | 42 ++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 3 deletions(-)

diff --git a/src/main/java/groovy/lang/GroovyClassLoader.java b/src/main/java/groovy/lang/GroovyClassLoader.java
index cd44d74..abc6da0 100644
--- a/src/main/java/groovy/lang/GroovyClassLoader.java
+++ b/src/main/java/groovy/lang/GroovyClassLoader.java
@@ -26,6 +26,7 @@
 package groovy.lang;
 
 import groovy.util.CharsetToolkit;
+import org.codehaus.groovy.GroovyBugError;
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.FieldNode;
@@ -115,7 +116,7 @@ public class GroovyClassLoader extends URLClassLoader {
                         URL ret = getSourceFile(filename, extension);
                         if (ret != null)
                             return ret;
-                    } catch (Throwable t) { //
+                    } catch (Throwable t) {
                     }
                 }
                 return null;
@@ -263,8 +264,11 @@ public class GroovyClassLoader extends URLClassLoader {
      * @return the main class defined in the given script
      */
     public Class parseClass(String text) throws CompilationFailedException {
-        return parseClass(text, "script" + System.currentTimeMillis() +
-                Math.abs((long) text.hashCode()) + ".groovy");
+        try {
+            return parseClass(text, "Script_" + EncodingGroovyMethods.md5(text) + ".groovy");
+        } catch (NoSuchAlgorithmException e) {
+            throw new GroovyBugError("Failed to generate md5", e); // should never happen
+        }
     }
 
     public synchronized String generateScriptName() {
diff --git a/src/test/groovy/bugs/Groovy9329.groovy b/src/test/groovy/bugs/Groovy9329.groovy
new file mode 100644
index 0000000..00cdce7
--- /dev/null
+++ b/src/test/groovy/bugs/Groovy9329.groovy
@@ -0,0 +1,42 @@
+/*
+ *  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 groovy.bugs
+
+import groovy.transform.CompileStatic
+import org.junit.Test
+
+import static groovy.test.GroovyAssert.assertScript
+
+@CompileStatic
+final class Groovy9329 {
+    @Test
+    void test() {
+        assertScript '''
+            def gcl = new GroovyClassLoader()
+            def scriptText = 'def x = 1'
+            gcl.parseClass(scriptText)
+            
+            def begin = gcl.@classCache.size()
+            3.times { gcl.parseClass(scriptText) }
+            def end = gcl.@classCache.size()
+            
+            assert end == begin
+        '''
+    }
+}