private boolean removeBeginNode() { List heads = getHeads(); if (heads.size() != 1) { // System.out.println("heads: "+heads); // System.out.println("Error: the size of heads is not equal to 1!"); return false; // System.exit(1); } else { JPegStmt head = (JPegStmt) heads.get(0); // System.out.println("test head: "+head); if (!head.getName().equals("begin")) { System.err.println("Error: the head is not begin node!"); System.exit(1); } // remove begin node from heads list heads.remove(0); // set the preds list of the succs of head to a new list and put succs of head into heads Iterator succOfHeadIt = getSuccsOf(head).iterator(); while (succOfHeadIt.hasNext()) { JPegStmt succOfHead = (JPegStmt) succOfHeadIt.next(); unitToPreds.put(succOfHead, new ArrayList()); // put succs of head into heads heads.add(succOfHead); } // remove begin node from inlinee Peg if (!mainPegChain.remove(head)) { System.err.println("fail to remove begin node in from mainPegChain!"); System.exit(1); } if (!allNodes.contains(head)) { System.err.println("fail to find begin node in FlowSet allNodes!"); System.exit(1); } else { allNodes.remove(head); } // remove begin node from unitToSuccs if (unitToSuccs.containsKey(head)) { unitToSuccs.remove(head); } } return true; }
// STEP 5: Define flow equations. // in(s) = ( out(s) minus defs(s) ) union uses(s) // protected void flowThrough(Object inValue, Object unit, Object outValue) { MonitorSet in = (MonitorSet) inValue; MonitorSet out = (MonitorSet) outValue; JPegStmt s = (JPegStmt) unit; Tag tag = (Tag) s.getTags().get(0); // System.out.println("s: "+tag+" "+s); // Copy in to out // if (in.contains("&")) in.remove("&"); in.copy(out); // System.out.println("-----in: "); // in.test(); if (in.size() > 0) { if (!s.getName().equals("waiting") && !s.getName().equals("notified-entry")) updateMonitor(in, unit); } String objName = s.getObject(); // if (objName == null) throw new RuntimeException("null object: "+s.getUnit()); if (s.getName().equals("entry") || s.getName().equals("exit")) { if (out.contains("&")) out.remove("&"); Object obj = out.getMonitorDepth(objName); if (obj == null) { if (s.getName().equals("entry")) { MonitorDepth md = new MonitorDepth(objName, 1); out.add(md); // System.out.println("add to out: "+md.getObjName()+" "+md.getDepth()); } /* else{ throw new RuntimeException("The monitor depth can not be decreased at "+ (Tag)((JPegStmt)s).getTags().get(0)+" "+unit); } */ } else { // System.out.println("obj: "+obj); if (obj instanceof MonitorDepth) { MonitorDepth md = (MonitorDepth) obj; if (s.getName().equals("entry")) { md.increaseDepth(); // System.out.println("===increase depth==="); } else { if (md.getDepth() > 1) { // System.out.println("===decrease depth=="); md.decreaseDepth(); } else if (md.getDepth() == 1) { // System.out.println("===remove monitordepth: "+md); out.remove(md); } else throw new RuntimeException("The monitor depth can not be decreased at " + unit); } } else throw new RuntimeException("MonitorSet contains non MonitorDepth element!"); } } // System.out.println("-----out: "+out); // out.test(); // testForDebug(); }
private void buildSuccessor(Chain pegChain) { // Add regular successors { HashMap unitToPeg = (HashMap) unitToPegMap.get(pegChain); Iterator pegIt = pegChain.iterator(); JPegStmt currentNode, nextNode; currentNode = pegIt.hasNext() ? (JPegStmt) pegIt.next() : null; // June 19 add for begin node if (currentNode != null) { // System.out.println("currentNode: "+currentNode); // if the unit is "begin" node nextNode = pegIt.hasNext() ? (JPegStmt) pegIt.next() : null; if (currentNode.getName().equals("begin")) { List<JPegStmt> successors = new ArrayList<JPegStmt>(); successors.add(nextNode); unitToSuccs.put(currentNode, successors); currentNode = nextNode; } // end June 19 add for begin node while (currentNode != null) { // System.out.println("currentNode: "+currentNode); /* If unitToSuccs contains currentNode, it is the point to inline methods, * we need not compute its successors again */ if (unitToSuccs.containsKey(currentNode) && !currentNode.getName().equals("wait")) { currentNode = pegIt.hasNext() ? (JPegStmt) pegIt.next() : null; continue; } List<JPegStmt> successors = new ArrayList<JPegStmt>(); Unit unit = currentNode.getUnit(); UnitGraph unitGraph = currentNode.getUnitGraph(); List unitSucc = unitGraph.getSuccsOf(unit); Iterator succIt = unitSucc.iterator(); while (succIt.hasNext()) { Unit un = (Unit) succIt.next(); // Don't build the edge from "monitor exit" to exception handler if (unit instanceof ExitMonitorStmt && exceHandlers.contains(un)) { // System.out.println("====find it! unit: "+unit+"\n un: "+un); continue; } else if (unitToPeg.containsKey(un)) { JPegStmt pp = (JPegStmt) (unitToPeg.get(un)); if (pp != null && !successors.contains(pp)) successors.add(pp); } } // end while if (currentNode.getName().equals("wait")) { while (!(currentNode.getName().equals("notified-entry"))) { currentNode = pegIt.hasNext() ? (JPegStmt) pegIt.next() : null; } unitToSuccs.put(currentNode, successors); // System.out.println("put key: "+currentNode+" into unitToSucc"); } else { unitToSuccs.put(currentNode, successors); } if (currentNode.getName().equals("start")) { // System.out.println("-----build succ for start----"); if (startToThread.containsKey(currentNode)) { List runMethodChainList = startToThread.get(currentNode); Iterator possibleMethodIt = runMethodChainList.iterator(); while (possibleMethodIt.hasNext()) { Chain subChain = (Chain) possibleMethodIt.next(); if (subChain != null) { // System.out.println("build succ for subChain"); // buildSuccessor(subGraph, subChain, addExceptionEdges); buildSuccessor(subChain); } else System.out.println("*********subgraph is null!!!"); } } } currentNode = pegIt.hasNext() ? (JPegStmt) pegIt.next() : null; } // while // June 19 add for begin node } // end June 19 add for begin node } }