You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by jw...@apache.org on 2016/10/07 03:43:03 UTC
groovy git commit: GROOVY-6584: Cannot use memoize() to cache
metaclass method call (closes #434)
Repository: groovy
Updated Branches:
refs/heads/GROOVY_2_4_X b6eaffb98 -> 7eea223df
GROOVY-6584: Cannot use memoize() to cache metaclass method call (closes #434)
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/7eea223d
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/7eea223d
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/7eea223d
Branch: refs/heads/GROOVY_2_4_X
Commit: 7eea223dff2dec134e97ba30f2bf14e27a9da5f1
Parents: b6eaffb
Author: John Wagenleitner <jw...@apache.org>
Authored: Sun Oct 2 12:23:16 2016 -0700
Committer: John Wagenleitner <jw...@apache.org>
Committed: Thu Oct 6 20:40:49 2016 -0700
----------------------------------------------------------------------
.../groovy/runtime/memoize/Memoize.java | 2 ++
.../groovy/runtime/memoize/MemoizeTest.groovy | 33 ++++++++++++++++++++
2 files changed, 35 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/7eea223d/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 7858f93..544e06c 100644
--- a/src/main/org/codehaus/groovy/runtime/memoize/Memoize.java
+++ b/src/main/org/codehaus/groovy/runtime/memoize/Memoize.java
@@ -123,6 +123,8 @@ public abstract class Memoize {
super(closure.getOwner());
this.cache = cache;
this.closure = closure;
+ parameterTypes = closure.getParameterTypes();
+ maximumNumberOfParameters = closure.getMaximumNumberOfParameters();
}
@Override public V call(final Object... args) {
http://git-wip-us.apache.org/repos/asf/groovy/blob/7eea223d/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 0d3d7a9..8bc50d4 100644
--- a/src/test/org/codehaus/groovy/runtime/memoize/MemoizeTest.groovy
+++ b/src/test/org/codehaus/groovy/runtime/memoize/MemoizeTest.groovy
@@ -48,4 +48,37 @@ public class MemoizeTest extends AbstractMemoizeTestCase {
assert maxExecutionCount == 2
assert minExecutionCount == 2
}
+
+ // GROOVY-6584
+ void testMemoizeFunctionClosure() {
+ int timesMethodBodyExecuted = 0
+ def lst = []
+ lst.metaClass.getTotalCount = {
+ ++timesMethodBodyExecuted
+ 12
+ }.memoize()
+
+ assert lst.getTotalCount() == 12
+ assert lst.getTotalCount() == 12
+ assert timesMethodBodyExecuted == 1
+
+ timesMethodBodyExecuted = 0
+ lst.metaClass.getUsersByDeptAndMgrId = { String dept, int id ->
+ ++timesMethodBodyExecuted
+ [dept, "${id}"]
+ }.memoize()
+
+ assert lst.getUsersByDeptAndMgrId('123', 555) == ['123', '555']
+ assert lst.getUsersByDeptAndMgrId('456', 999) == ['456', '999']
+
+ assert timesMethodBodyExecuted == 2
+
+ 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 == 2
+ }
}