void (DirectGraph dgraph, HashSet<String> updated, boolean calcLiveVars) { CancellationManager cancellationManager = DecompilerContext.getCancellationManager(); for (DirectNode node : dgraph.nodes) { updated.remove(node.id); mergeInVarMaps(node, dgraph); SFormsFastMapDirect varmap = new SFormsFastMapDirect(inVarVersions.get(node.id)); SFormsFastMapDirect[] varmaparr = new SFormsFastMapDirect[]{varmap, null}; if (node.exprents != null) { for (Exprent expr : node.exprents) { cancellationManager.checkCanceled(); processExprent(expr, varmaparr, node.statement, calcLiveVars); } } if (varmaparr[1] == null) { varmaparr[1] = varmaparr[0]; } // quick solution: 'dummy' field variables should not cross basic block borders (otherwise problems e.g. with finally loops - usage without assignment in a loop) // For the full solution consider adding a dummy assignment at the entry point of the method boolean allow_field_propagation = node.successors.isEmpty() || (node.successors.size() == 1 && node.successors.get(0).predecessors.size() == 1); if (!allow_field_propagation && varmaparr[0] != null) { varmaparr[0].removeAllFields(); varmaparr[1].removeAllFields(); } boolean this_updated = !mapsEqual(varmaparr[0], outVarVersions.get(node.id)) || (outNegVarVersions.containsKey(node.id) && !mapsEqual(varmaparr[1], outNegVarVersions.get(node.id))); if (this_updated) { outVarVersions.put(node.id, varmaparr[0]); if (dgraph.mapNegIfBranch.containsKey(node.id)) { outNegVarVersions.put(node.id, varmaparr[1]); } for (DirectNode nd : node.successors) { updated.add(nd.id); } } } }