public SFormsFastMapDirect getLiveVarVersionsMap(VarVersionPair varpaar) { VarVersionNode node = ssuversions.nodes.getWithKey(varpaar); if (node != null) { return node.live; } return null; }
public boolean contains(E element) { int[] index = colValuesInternal.getWithKey(element); if (index == null) { index = factory.addElement(element); } return index[0] < data.length && ((data[index[0]] & index[1]) != 0); }
public void add(E element) { int[] index = colValuesInternal.getWithKey(element); data[index[0]] |= index[1]; }
public boolean contains(E element) { int[] index = colValuesInternal.getWithKey(element); return (data[index[0]] & index[1]) != 0; }
public void remove(E element) { int[] index = colValuesInternal.getWithKey(element); data[index[0]] &= ~index[1]; }
public StructMethod getMethod(String key) { return methods.getWithKey(key); }
public boolean isDominator(Integer node, Integer dom) { while (!node.equals(dom)) { Integer idom = colOrderedIDoms.getWithKey(node); if (idom.equals(node)) { return false; // root node } else { node = idom; } } return true; } }
public boolean isDominator(IGraphNode node, IGraphNode dom) { while (!node.equals(dom)) { IGraphNode idom = colOrderedIDoms.getWithKey(node); if (idom == node) { return false; // root node or merging point } else if (idom == null) { throw new RuntimeException("Inconsistent idom sequence discovered!"); } else { node = idom; } } return true; } }
private void varMapToGraph(VarVersionPair varpaar, SFormsFastMapDirect varmap) { VBStyleCollection<VarVersionNode, VarVersionPair> nodes = ssuversions.nodes; VarVersionNode node = nodes.getWithKey(varpaar); node.live = new SFormsFastMapDirect(varmap); }
public void remove(E element) { int[] index = colValuesInternal.getWithKey(element); if (index == null) { index = factory.addElement(element); } int block = index[0]; if (block < data.length) { data[block] &= ~index[1]; if (data[block] == 0) { changeNext(next, block, block, next[block]); } } }
public StructField getField(String name, String descriptor) { return fields.getWithKey(InterpreterUtil.makeUniqueKey(name, descriptor)); }
public MethodWrapper getMethodWrapper(String name, String descriptor) { return methods.getWithKey(InterpreterUtil.makeUniqueKey(name, descriptor)); }
public StructMethod getMethod(String name, String descriptor) { return methods.getWithKey(InterpreterUtil.makeUniqueKey(name, descriptor)); }
public void add(E element) { int[] index = colValuesInternal.getWithKey(element); if (index == null) { index = factory.addElement(element); } int block = index[0]; if (block >= data.length) { ensureCapacity(block); } data[block] |= index[1]; changeNext(next, block, next[block], block); }
private static Integer getCommonIDom(Integer key1, Integer key2, VBStyleCollection<Integer, Integer> orderedIDoms) { if (key1 == null) { return key2; } else if (key2 == null) { return key1; } int index1 = orderedIDoms.getIndexByKey(key1); int index2 = orderedIDoms.getIndexByKey(key2); while (index1 != index2) { if (index1 > index2) { key1 = orderedIDoms.getWithKey(key1); index1 = orderedIDoms.getIndexByKey(key1); } else { key2 = orderedIDoms.getWithKey(key2); index2 = orderedIDoms.getIndexByKey(key2); } } return key1; }
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; }
private static void replaceSingleVar(Exprent parent, VarExprent var, Exprent dest, SSAUConstructorSparseEx ssau) { parent.replaceExprent(var, dest); // live sets SFormsFastMapDirect livemap = ssau.getLiveVarVersionsMap(new VarVersionPair(var)); Set<VarVersionPair> setVars = getAllVersions(dest); for (VarVersionPair varpaar : setVars) { VarVersionNode node = ssau.getSsuversions().nodes.getWithKey(varpaar); for (Iterator<Entry<Integer, FastSparseSet<Integer>>> itent = node.live.entryList().iterator(); itent.hasNext(); ) { Entry<Integer, FastSparseSet<Integer>> ent = itent.next(); Integer key = ent.getKey(); if (!livemap.containsKey(key)) { itent.remove(); } else { FastSparseSet<Integer> set = ent.getValue(); set.complement(livemap.get(key)); if (set.isEmpty()) { itent.remove(); } } } } }
private void calcIDoms() { orderStatements(); colOrderedIDoms.putWithKey(statement.getFirst().id, statement.getFirst().id); // exclude first statement List<Integer> lstIds = colOrderedIDoms.getLstKeys().subList(1, colOrderedIDoms.getLstKeys().size()); while (true) { boolean changed = false; for (Integer id : lstIds) { Statement stat = statement.getStats().getWithKey(id); Integer idom = null; for (StatEdge edge : stat.getAllPredecessorEdges()) { if (colOrderedIDoms.getWithKey(edge.getSource().id) != null) { idom = getCommonIDom(idom, edge.getSource().id, colOrderedIDoms); } } Integer oldidom = colOrderedIDoms.putWithKey(idom, id); if (!idom.equals(oldidom)) { changed = true; } } if (!changed) { break; } } }
private void setCatchMaps(Statement stat, DirectGraph dgraph, FlattenStatementsHelper flatthelper) { SFormsFastMapDirect map; switch (stat.type) { case Statement.TYPE_CATCHALL: case Statement.TYPE_TRYCATCH: List<VarExprent> lstVars; if (stat.type == Statement.TYPE_CATCHALL) { lstVars = ((CatchAllStatement)stat).getVars(); } else { lstVars = ((CatchStatement)stat).getVars(); } for (int i = 1; i < stat.getStats().size(); i++) { int varindex = lstVars.get(i - 1).getIndex(); int version = getNextFreeVersion(varindex); // == 1 map = new SFormsFastMapDirect(); setCurrentVar(map, varindex, version); extraVarVersions.put(dgraph.nodes.getWithKey(flatthelper.getMapDestinationNodes().get(stat.getStats().get(i).id)[0]).id, map); } } for (Statement st : stat.getStats()) { setCatchMaps(st, dgraph, flatthelper); } }
private void setCatchMaps(Statement stat, DirectGraph dgraph, FlattenStatementsHelper flatthelper) { SFormsFastMapDirect map; switch (stat.type) { case Statement.TYPE_CATCHALL: case Statement.TYPE_TRYCATCH: List<VarExprent> lstVars; if (stat.type == Statement.TYPE_CATCHALL) { lstVars = ((CatchAllStatement)stat).getVars(); } else { lstVars = ((CatchStatement)stat).getVars(); } for (int i = 1; i < stat.getStats().size(); i++) { int varindex = lstVars.get(i - 1).getIndex(); int version = getNextFreeVersion(varindex, stat); // == 1 map = new SFormsFastMapDirect(); setCurrentVar(map, varindex, version); extraVarVersions.put(dgraph.nodes.getWithKey(flatthelper.getMapDestinationNodes().get(stat.getStats().get(i).id)[0]).id, map); //ssuversions.createOrGetNode(new VarVersionPair(varindex, version)); ssuversions.createNode(new VarVersionPair(varindex, version)); } } for (Statement st : stat.getStats()) { setCatchMaps(st, dgraph, flatthelper); } }