vbPost = new VBStyleCollection<>(); List<Statement> lstAll = stat.getPostReversePostOrderList(); Set<Integer> set = mapExtPost.get(st.id); if (set != null) { vbPost.addWithKey(new ArrayList<>(set), st.id); // FIXME: sort order!! if (setFirst != null) { for (Integer id : setFirst) { List<Integer> lst = vbPost.getWithKey(id); if (lst == null) { vbPost.addWithKey(lst = new ArrayList<>(), id); for (int k = 0; k < vbPost.size(); k++) { Integer headid = vbPost.getKey(k); List<Integer> posts = vbPost.get(k); Statement head = stats.getWithKey(headid); Statement post = stats.getWithKey(postId); if ((setNodes.size() > 1 || head.getNeighbours(StatEdge.TYPE_REGULAR, Statement.DIRECTION_BACKWARD).contains(head)) && setNodes.size() < stats.size()) { if (checkSynchronizedCompleteness(setNodes)) { res = new GeneralStatement(head, setNodes, same ? null : post);
@Override public VBStyleCollection<E, K> clone() { VBStyleCollection<E, K> c = new VBStyleCollection<>(); c.addAll(new ArrayList<>(this)); c.setMap(new HashMap<>(map)); c.setLstKeys(new ArrayList<>(lstKeys)); return c; }
public void addNodes(Collection<VarVersionNode> colnodes, Collection<VarVersionPair> colpaars) { nodes.addAllWithKey(colnodes, colpaars); }
public int getPointerByAbsOffset(int offset) { Integer absoffset = offset; if (collinstr.containsKey(absoffset)) { return collinstr.getIndexByKey(absoffset); } else { return -1; } }
public int getPointerByRelOffset(int offset) { Integer absoffset = collinstr.getKey(pointer) + offset; if (collinstr.containsKey(absoffset)) { return collinstr.getIndexByKey(absoffset); } else { return -1; } }
private DoStatement(Statement head) { this(); first = head; stats.addWithKey(first, first.id); // post is always null! }
private VBStyleCollection<BasicBlock, Integer> createBasicBlocks(short[] startblock, InstructionSequence instrseq, Map<Integer, BasicBlock> mapInstrBlocks) { VBStyleCollection<BasicBlock, Integer> col = new VBStyleCollection<>(); InstructionSequence currseq = null; List<Integer> lstOffs = null; int len = startblock.length; short counter = 0; int blockoffset = 0; BasicBlock currentBlock = null; for (int i = 0; i < len; i++) { if (startblock[i] == 1) { currentBlock = new BasicBlock(++counter); currseq = currentBlock.getSeq(); lstOffs = currentBlock.getInstrOldOffsets(); col.addWithKey(currentBlock, currentBlock.id); blockoffset = instrseq.getOffset(i); } startblock[i] = counter; mapInstrBlocks.put(i, currentBlock); currseq.addInstruction(instrseq.getInstr(i), instrseq.getOffset(i) - blockoffset); lstOffs.add(instrseq.getOffset(i)); } last_id = counter; return col; }
private static RootStatement graphToStatement(ControlFlowGraph graph) { VBStyleCollection<Statement, Integer> stats = new VBStyleCollection<>(); VBStyleCollection<BasicBlock, Integer> blocks = graph.getBlocks(); stats.addWithKey(new BasicBlockStatement(block), block.id); Statement firstst = stats.getWithKey(firstblock.id); if (stats.size() > 1 || firstblock.isSuccessor(firstblock)) { // multiple basic blocks or an infinite loop of one block general = new GeneralStatement(firstst, stats, null); Statement stat = stats.getWithKey(block.id); Statement stsucc = stats.getWithKey(succ.id); Statement stsuccex = stats.getWithKey(succex.id);
Statement last = parent.type == Statement.TYPE_SEQUENCE ? parent.getStats().getLast() : ifstat; noelsestat = (last == ifstat); for (int i = sequence.getStats().size() - 1; i >= 0; i--) { Statement sttemp = sequence.getStats().get(i); if (sttemp == ifstat) { break; for (int i = sequence.getStats().size() - 1; i >= 0; i--) { Statement sttemp = sequence.getStats().get(i); if (sttemp == ifstat) { break; sequence.getStats().removeWithKey(st.id); ifstat.getStats().addWithKey(stelse, stelse.id); stelse.setParent(ifstat); ifstat.getStats().removeWithKey(ifbranch.id); ifstat.setIfstat(null); for (int i = sequence.getStats().size() - 1; i >= 0; i--) { Statement sttemp = sequence.getStats().get(i); if (sttemp == ifstat) { break; sequence.getStats().removeWithKey(st.id); ifstat.getStats().removeWithKey(ifbranch.id);
if (!wrapper.getDynamicFieldInitializers().containsKey(fieldWithDescr)) { wrapper.getDynamicFieldInitializers().addWithKey(value, fieldWithDescr);
private static void inlineBlock(SequenceStatement seq, int index) { Statement first = seq.getStats().get(index); Statement pre = seq.getStats().get(index - 1); pre.removeSuccessor(pre.getAllSuccessorEdges().get(0)); // single regular edge for (int i = seq.getStats().size() - 1; i >= index; i--) { lst.add(0, seq.getStats().remove(i)); ifparent.setIfstat(block); ifparent.getStats().addWithKey(block, block.id); block.setParent(ifparent);
Statement stcopy = st.getSimpleCopy(); to.getStats().addWithKey(stcopy, stcopy.id); mapAltToCopies.put(st, stcopy); for (int i = 0; i < from.getStats().size(); i++) { Statement stold = from.getStats().get(i); Statement stnew = to.getStats().get(i); for (int i = 0; i < from.getStats().size(); i++) { Statement stold = from.getStats().get(i); Statement stnew = to.getStats().get(i);
int statindex = stats.getIndexByKey(oldstat.id); stats.removeWithKey(oldstat.id); stats.addWithKeyAndIndex(statindex, newstat, newstat.id);
if (setNodes.containsKey(first.id)) { first = stat; if (!setNodes.containsKey(handler.id)) { stat.addSuccessor(new StatEdge(stat, handler, edge.getExceptions())); stats.removeWithKey(st.id); stats.addWithKey(stat, stat.id);
public void addAllWithKey(VBStyleCollection<E, K> c) { for (int i = 0; i < c.size(); i++) { addWithKey(c.get(i), c.getKey(i)); } }
public void sortReversePostOrder() { LinkedList<DirectNode> res = new LinkedList<>(); addToReversePostOrderListIterative(first, res); nodes.clear(); for (DirectNode node : res) { nodes.addWithKey(node, node.id); } }
@Override public void add(int index, E element) { addToListIndex(index, 1); lstKeys.add(index, null); super.add(index, element); }
public SequenceStatement(List<? extends Statement> lst) { this(); lastBasicType = lst.get(lst.size() - 1).getLastBasicType(); for (Statement st : lst) { stats.addWithKey(st, st.id); } first = stats.get(0); }
public DirectGraph buildDirectGraph(RootStatement root) { this.root = root; graph = new DirectGraph(); flattenStatement(); // dummy exit node Statement dummyexit = root.getDummyExit(); DirectNode node = new DirectNode(DirectNode.NODE_DIRECT, dummyexit, dummyexit.id.toString()); node.exprents = new ArrayList<>(); graph.nodes.addWithKey(node, node.id); mapDestinationNodes.put(dummyexit.id, new String[]{node.id, null}); setEdges(); graph.first = graph.nodes.getWithKey(mapDestinationNodes.get(root.id)[0]); graph.sortReversePostOrder(); return graph; }