boolean (ControlFlowGraph graph, BasicBlock pattern, BasicBlock sample, int type, int finallyType, List<int[]> lstStoreVars) { InstructionSequence seqPattern = pattern.getSeq(); InstructionSequence seqSample = sample.getSeq(); if (type != 0) { seqPattern = seqPattern.clone(); if ((type & 1) > 0) { // first if (finallyType > 0) { seqPattern.removeInstruction(0); } } if ((type & 2) > 0) { // last if (finallyType == 0 || finallyType == 2) { seqPattern.removeLast(); } if (finallyType == 2) { seqPattern.removeLast(); } } } if (seqPattern.length() > seqSample.length()) { return false; } for (int i = 0; i < seqPattern.length(); i++) { Instruction instrPattern = seqPattern.getInstr(i); Instruction instrSample = seqSample.getInstr(i); // compare instructions with respect to jumps if (!equalInstructions(instrPattern, instrSample, lstStoreVars)) { return false; } } if (seqPattern.length() < seqSample.length()) { // split in two blocks SimpleInstructionSequence seq = new SimpleInstructionSequence(); LinkedList<Integer> oldOffsets = new LinkedList<>(); for (int i = seqSample.length() - 1; i >= seqPattern.length(); i--) { seq.addInstruction(0, seqSample.getInstr(i), -1); oldOffsets.addFirst(sample.getOriginalOffset(i)); seqSample.removeInstruction(i); } BasicBlock newBlock = new BasicBlock(++graph.last_id, seq); newBlock.getOriginalOffsets().addAll(oldOffsets); List<BasicBlock> lstTemp = new ArrayList<>(sample.getSuccessors()); // move successors for (BasicBlock suc : lstTemp) { sample.removeSuccessor(suc); newBlock.addSuccessor(suc); } sample.addSuccessor(newBlock); graph.getBlocks().addWithKey(newBlock, newBlock.id); Set<BasicBlock> setFinallyExits = graph.getFinallyExits(); if (setFinallyExits.contains(sample)) { setFinallyExits.remove(sample); setFinallyExits.add(newBlock); } copyExceptionEdges(graph, sample, newBlock); } return true; }