From 0456c02cf999c471f388ad3b3c5bcc5047ccf901 Mon Sep 17 00:00:00 2001 From: Peter Osterlund Date: Sat, 22 Sep 2012 09:04:57 +0000 Subject: [PATCH] DroidFish: Don't use recursion in GameTree.translateMovesHelper(). Recursion can crash with stack overflow error for long pgn games. --- .../petero/droidfish/gamelogic/GameTree.java | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/DroidFish/src/org/petero/droidfish/gamelogic/GameTree.java b/DroidFish/src/org/petero/droidfish/gamelogic/GameTree.java index 772ca52..d54d978 100644 --- a/DroidFish/src/org/petero/droidfish/gamelogic/GameTree.java +++ b/DroidFish/src/org/petero/droidfish/gamelogic/GameTree.java @@ -233,15 +233,32 @@ public class GameTree { } private final void translateMovesHelper() { - ArrayList moves = MoveGen.instance.legalMoves(currentPos); - currentNode.verifyChildren(currentPos, moves); - int nc = currentNode.children.size(); - for (int i = 0; i < nc; i++) { - Node child = currentNode.children.get(i); - child.moveStrLocal = TextIO.moveToString(currentPos, child.move, false, true, moves); - goForward(i, false); - translateMovesHelper(); - goBack(); + ArrayList currPath = new ArrayList(); + currPath.add(0); + while (!currPath.isEmpty()) { + int last = currPath.size() - 1; + int currChild = currPath.get(last); + if (currChild == 0) { + ArrayList moves = MoveGen.instance.legalMoves(currentPos); + currentNode.verifyChildren(currentPos, moves); + int nc = currentNode.children.size(); + for (int i = 0; i < nc; i++) { + Node child = currentNode.children.get(i); + child.moveStrLocal = TextIO.moveToString(currentPos, child.move, false, true, moves); + } + } + int nc = currentNode.children.size(); + if (currChild < nc) { + goForward(currChild, false); + currPath.add(0); + } else { + currPath.remove(last); + last--; + if (last >= 0) { + currPath.set(last, currPath.get(last) + 1); + goBack(); + } + } } }