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/d3257903 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/d3257903 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/d3257903 Branch: refs/heads/parrot Commit: d32579037f0b9a8f27edf38115369aa12b030200 Parents: c504e64 Author: John Wagenleitner <jwagenleit...@apache.org> Authored: Sun Oct 2 12:23:16 2016 -0700 Committer: John Wagenleitner <jwagenleit...@apache.org> Committed: Thu Oct 6 20:43:30 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/d3257903/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/d3257903/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 + } }