TAP5-2317: fix a StackOverflowError when counting a large flow
Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/602f43f5 Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/602f43f5 Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/602f43f5 Branch: refs/heads/master Commit: 602f43f5441a7f0309a712130587e3433c959448 Parents: d8ec30d Author: Jochen Kemnade <jochenkemn...@web.de> Authored: Sat Apr 26 13:19:09 2014 +0200 Committer: Jochen Kemnade <jochenkemn...@web.de> Committed: Sat Apr 26 13:19:09 2014 +0200 ---------------------------------------------------------------------- .../main/java/org/apache/tapestry5/func/AbstractFlow.java | 9 ++++++++- .../src/test/java/org/apache/tapestry5/func/FuncTest.java | 8 ++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/602f43f5/tapestry-func/src/main/java/org/apache/tapestry5/func/AbstractFlow.java ---------------------------------------------------------------------- diff --git a/tapestry-func/src/main/java/org/apache/tapestry5/func/AbstractFlow.java b/tapestry-func/src/main/java/org/apache/tapestry5/func/AbstractFlow.java index 9a5eb5b..e657c41 100644 --- a/tapestry-func/src/main/java/org/apache/tapestry5/func/AbstractFlow.java +++ b/tapestry-func/src/main/java/org/apache/tapestry5/func/AbstractFlow.java @@ -213,7 +213,14 @@ abstract class AbstractFlow<T> implements Flow<T> public int count() { - return isEmpty() ? 0 : 1 + rest().count(); + if (isEmpty()){ + return 0; + } + int count = 0; + for(Flow<T> flow = this; flow != null && !flow.isEmpty(); flow = flow.rest()){ + count++; + } + return count; } public Flow<T> take(int length) http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/602f43f5/tapestry-func/src/test/java/org/apache/tapestry5/func/FuncTest.java ---------------------------------------------------------------------- diff --git a/tapestry-func/src/test/java/org/apache/tapestry5/func/FuncTest.java b/tapestry-func/src/test/java/org/apache/tapestry5/func/FuncTest.java index 7bf527a..a9f2dc6 100644 --- a/tapestry-func/src/test/java/org/apache/tapestry5/func/FuncTest.java +++ b/tapestry-func/src/test/java/org/apache/tapestry5/func/FuncTest.java @@ -571,6 +571,14 @@ public class FuncTest extends BaseFuncTest } @Test + public void count_of_a_large_flow() + { + Flow<Integer> flow = F.series(1, 1).take(50000); + + assertEquals(flow.count(), 50000); + } + + @Test public void concat_empty_list() { Flow<Integer> flow = F.flow(1, 3);