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);

Reply via email to