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 2017/01/26 05:30:51 UTC

[17/50] groovy git commit: GROOVY-6175: invoking memoized closure property as method fails (closes #462)

GROOVY-6175: invoking memoized closure property as method fails (closes #462)

Per the Closure class docs, to be able to use a Closure in short form, e.g., c(), in subclasses, you need to provide a doCall method with any signature you want to, if no doCall method is provided a closure must be used in its long form, e.g., c.call().


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/ecefae0f
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/ecefae0f
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/ecefae0f

Branch: refs/heads/GROOVY_2_4_X
Commit: ecefae0fa2ff9d1e2c0dee0deebec2e708d8b60c
Parents: 46318ae
Author: John Wagenleitner <jw...@apache.org>
Authored: Wed Nov 23 20:52:31 2016 -0800
Committer: John Wagenleitner <jw...@apache.org>
Committed: Wed Nov 23 21:19:12 2016 -0800

----------------------------------------------------------------------
 .../groovy/runtime/memoize/Memoize.java         |  4 ++
 .../groovy/runtime/memoize/MemoizeTest.groovy   | 54 +++++++++++++++++++-
 2 files changed, 56 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/ecefae0f/src/main/org/codehaus/groovy/runtime/memoize/Memoize.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/runtime/memoize/Memoize.java b/src/main/org/codehaus/groovy/runtime/memoize/Memoize.java
index 544e06c..c4dd3d9 100644
--- a/src/main/org/codehaus/groovy/runtime/memoize/Memoize.java
+++ b/src/main/org/codehaus/groovy/runtime/memoize/Memoize.java
@@ -137,6 +137,10 @@ public abstract class Memoize {
             }
             return result == MEMOIZE_NULL ? null : (V) result;
         }
+
+        public V doCall(final Object... args) {
+            return call(args);
+        }
     }
     
     private static class SoftReferenceMemoizeFunction<V> extends MemoizeFunction<V> {

http://git-wip-us.apache.org/repos/asf/groovy/blob/ecefae0f/src/test/org/codehaus/groovy/runtime/memoize/MemoizeTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/runtime/memoize/MemoizeTest.groovy b/src/test/org/codehaus/groovy/runtime/memoize/MemoizeTest.groovy
index 8bc50d4..5c80530 100644
--- a/src/test/org/codehaus/groovy/runtime/memoize/MemoizeTest.groovy
+++ b/src/test/org/codehaus/groovy/runtime/memoize/MemoizeTest.groovy
@@ -63,10 +63,12 @@ public class MemoizeTest extends AbstractMemoizeTestCase {
         assert timesMethodBodyExecuted == 1
 
         timesMethodBodyExecuted = 0
-        lst.metaClass.getUsersByDeptAndMgrId = { String dept, int id ->
+        def code = { String dept, int id ->
             ++timesMethodBodyExecuted
             [dept, "${id}"]
-        }.memoize()
+        }
+
+        lst.metaClass.getUsersByDeptAndMgrId = code.memoize()
 
         assert lst.getUsersByDeptAndMgrId('123', 555) == ['123', '555']
         assert lst.getUsersByDeptAndMgrId('456', 999) == ['456', '999']
@@ -80,5 +82,53 @@ public class MemoizeTest extends AbstractMemoizeTestCase {
         assert lst.getUsersByDeptAndMgrId('456', 999) == ['456', '999']
 
         assert timesMethodBodyExecuted == 2
+
+        // test SoftReferenceMemoizeFunction
+        lst.metaClass.getUsersByDeptAndMgrId = code.memoizeAtLeast(4)
+
+        assert lst.getUsersByDeptAndMgrId('123', 555) == ['123', '555']
+        assert lst.getUsersByDeptAndMgrId('456', 999) == ['456', '999']
+
+        assert lst.getUsersByDeptAndMgrId('123', 555) == ['123', '555']
+        assert lst.getUsersByDeptAndMgrId('456', 999) == ['456', '999']
+
+        assert timesMethodBodyExecuted == 4
+    }
+
+    void testMemoizeClosureParameters() {
+        def clo = { String a, Date b, c -> 42 }.memoize()
+        assert clo.maximumNumberOfParameters == 3
+        assert clo.parameterTypes[0] == String
+        assert clo.parameterTypes[1] == Date
+        assert clo.parameterTypes[2] == Object
+
+        // test SoftReferenceMemoizeFunction
+        clo = { String a, Date b, c -> 42 }.memoizeAtLeast(2)
+        assert clo.maximumNumberOfParameters == 3
+        assert clo.parameterTypes[0] == String
+        assert clo.parameterTypes[1] == Date
+        assert clo.parameterTypes[2] == Object
+    }
+
+    // GROOVY-6175
+    void testMemoizeClosureAsProperty() {
+        def c = new ClassWithMemoizeClosureProperty();
+
+        assert c.mc() == 1
+        assert c.mc() == 1
+
+        assert c.mcSoftRef() == 1
+        assert c.mcSoftRef() == 1
+    }
+
+    private static class ClassWithMemoizeClosureProperty {
+        int timesCalled, timesCalledSoftRef
+        def mc = {
+            ++timesCalled
+        }.memoize()
+
+        def mcSoftRef = {
+            ++timesCalledSoftRef
+        }.memoizeAtLeast(4)
     }
 }