private static void cleanUpUnreachableBlocks(Statement stat) { boolean found; do { found = false; for (int i = 0; i < stat.getStats().size(); i++) { Statement st = stat.getStats().get(i); cleanUpUnreachableBlocks(st); if (st.type == Statement.TYPE_SEQUENCE && st.getStats().size() > 1) { Statement last = st.getStats().getLast(); Statement secondlast = st.getStats().get(st.getStats().size() - 2); if (last.getExprents() == null || !last.getExprents().isEmpty()) { if (!secondlast.hasBasicSuccEdge()) { Set<Statement> set = last.getNeighboursSet(Statement.STATEDGE_DIRECT_ALL, Statement.DIRECTION_BACKWARD); set.remove(secondlast); if (set.isEmpty()) { last.setExprents(new ArrayList<>()); found = true; break; } } } } } } while (found); }
private static boolean collapseInlinedClass14(Statement stat) { boolean ret = class14Builder.match(stat); if (ret) { String class_name = (String)class14Builder.getVariableValue("$classname$"); AssignmentExprent assignment = (AssignmentExprent)class14Builder.getVariableValue("$assignfield$"); FieldExprent fieldExpr = (FieldExprent)class14Builder.getVariableValue("$field$"); assignment.replaceExprent(assignment.getRight(), new ConstExprent(VarType.VARTYPE_CLASS, class_name, null)); List<Exprent> data = new ArrayList<>(stat.getFirst().getExprents()); stat.setExprents(data); SequenceHelper.destroyAndFlattenStatement(stat); ClassWrapper wrapper = (ClassWrapper)DecompilerContext.getProperty(DecompilerContext.CURRENT_CLASS_WRAPPER); if (wrapper != null) { wrapper.getHiddenMembers().add(InterpreterUtil.makeUniqueKey(fieldExpr.getName(), fieldExpr.getDescriptor().descriptorString)); } } return ret; } }
newstat.setExprents(Arrays.asList(new Exprent[]{asexpr}));
private static boolean collapseInlinedClass14(Statement stat) { boolean ret = class14Builder.match(stat); if(ret) { String class_name = (String)class14Builder.getVariableValue("$classname$"); AssignmentExprent assfirst = (AssignmentExprent)class14Builder.getVariableValue("$assignfield$"); FieldExprent fieldexpr = (FieldExprent)class14Builder.getVariableValue("$field$"); assfirst.replaceExprent(assfirst.getRight(), new ConstExprent(VarType.VARTYPE_CLASS, class_name, null)); List<Exprent> data = new ArrayList<>(); data.addAll(stat.getFirst().getExprents()); stat.setExprents(data); SequenceHelper.destroyAndFlattenStatement(stat); ClassWrapper wrapper = (ClassWrapper)DecompilerContext.getProperty(DecompilerContext.CURRENT_CLASS_WRAPPER); if (wrapper != null) { wrapper.getHiddenMembers().add(InterpreterUtil.makeUniqueKey(fieldexpr.getName(), fieldexpr.getDescriptor().descriptorString)); } } return ret; }
private static void cleanUpUnreachableBlocks(Statement stat) { boolean found; do { found = false; for (int i = 0; i < stat.getStats().size(); i++) { Statement st = stat.getStats().get(i); cleanUpUnreachableBlocks(st); if (st.type == Statement.TYPE_SEQUENCE && st.getStats().size() > 1) { Statement last = st.getStats().getLast(); Statement secondlast = st.getStats().get(st.getStats().size() - 2); if (last.getExprents() == null || !last.getExprents().isEmpty()) { if (!secondlast.hasBasicSuccEdge()) { Set<Statement> set = last.getNeighboursSet(Statement.STATEDGE_DIRECT_ALL, Statement.DIRECTION_BACKWARD); set.remove(secondlast); if (set.isEmpty()) { last.setExprents(new ArrayList<>()); found = true; break; } } } } } } while (found); }
newstat.setExprents(Arrays.asList(new Exprent[]{asexpr}));