コード例 #1
0
ファイル: LoopRegion.java プロジェクト: GuardSources/jadx
 /** Move all preCondition block instructions before conditionBlock instructions */
 public void mergePreCondition() {
   if (preCondition != null && conditionBlock != null) {
     preCondition.getInstructions().addAll(conditionBlock.getInstructions());
     conditionBlock.getInstructions().clear();
     conditionBlock.getInstructions().addAll(preCondition.getInstructions());
     preCondition.getInstructions().clear();
   }
 }
コード例 #2
0
ファイル: LoopRegion.java プロジェクト: GuardSources/jadx
  /** Check if pre-conditions can be inlined into loop condition */
  public boolean checkPreCondition() {
    List<InsnNode> insns = preCondition.getInstructions();
    if (insns.isEmpty()) return true;

    IfNode ifInsn = getIfInsn();
    int size = insns.size();
    for (int i = 0; i < size; i++) {
      InsnNode insn = insns.get(i);
      if (insn.getResult() == null) {
        return false;
      } else {
        RegisterArg res = insn.getResult();
        if (res.getTypedVar().getUseList().size() > 2) return false;

        boolean found = false;
        // search result arg in other insns
        for (int j = i + 1; j < size; j++) {
          if (insns.get(i).containsArg(res)) found = true;
        }
        // or in if insn
        if (!found && ifInsn.containsArg(res)) found = true;

        if (!found) return false;
      }
    }
    return true;
  }
コード例 #3
0
ファイル: LoopRegion.java プロジェクト: GuardSources/jadx
 public IfNode getIfInsn() {
   return (IfNode)
       conditionBlock.getInstructions().get(conditionBlock.getInstructions().size() - 1);
 }