boolean (RootStatement root, SSAUConstructorSparseEx ssa) { CancellationManager cancellationManager = DecompilerContext.getCancellationManager(); FlattenStatementsHelper flatthelper = new FlattenStatementsHelper(); DirectGraph dgraph = flatthelper.buildDirectGraph(root); boolean res = false; Set<DirectNode> setVisited = new HashSet<>(); LinkedList<DirectNode> stack = new LinkedList<>(); LinkedList<Map<VarVersionPair, Exprent>> stackMaps = new LinkedList<>(); stack.add(dgraph.first); stackMaps.add(new HashMap<>()); while (!stack.isEmpty()) { cancellationManager.checkCanceled(); DirectNode nd = stack.removeFirst(); Map<VarVersionPair, Exprent> mapVarValues = stackMaps.removeFirst(); if (setVisited.contains(nd)) { continue; } setVisited.add(nd); List<List<Exprent>> lstLists = new ArrayList<>(); if (!nd.exprents.isEmpty()) { lstLists.add(nd.exprents); } if (nd.successors.size() == 1) { DirectNode ndsucc = nd.successors.get(0); if (ndsucc.type == DirectNodeType.TAIL && !ndsucc.exprents.isEmpty()) { lstLists.add(nd.successors.get(0).exprents); nd = ndsucc; } } for (int i = 0; i < lstLists.size(); i++) { List<Exprent> lst = lstLists.get(i); int index = 0; while (index < lst.size()) { Exprent next = null; if (index == lst.size() - 1) { if (i < lstLists.size() - 1) { next = lstLists.get(i + 1).get(0); } } else { next = lst.get(index + 1); } int[] ret = iterateExprent(lst, index, next, mapVarValues, ssa); if (ret[0] >= 0) { index = ret[0]; } else { index++; } res |= (ret[1] == 1); } } for (DirectNode ndx : nd.successors) { stack.add(ndx); stackMaps.add(new HashMap<>(mapVarValues)); } // make sure the 3 special exprent lists in a loop (init, condition, increment) are not empty // change loop type if necessary if (nd.exprents.isEmpty() && (nd.type == DirectNodeType.INIT || nd.type == DirectNodeType.CONDITION || nd.type == DirectNodeType.INCREMENT)) { nd.exprents.add(null); if (nd.statement.type == StatementType.DO) { DoStatement loop = (DoStatement)nd.statement; if (loop.getLoopType() == LoopType.FOR && loop.getInitExprent() == null && loop.getIncExprent() == null) { // "downgrade" loop to 'while' loop.setLoopType(LoopType.WHILE); } } } } return res; }