public void redirectTraps(Body b, Unit oldUnit, Unit newUnit) { Chain<Trap> traps = b.getTraps(); for (Trap trap : traps) { if (trap.getHandlerUnit() == oldUnit) { trap.setHandlerUnit(newUnit); } if (trap.getBeginUnit() == oldUnit) { trap.setBeginUnit(newUnit); } if (trap.getEndUnit() == oldUnit) { trap.setEndUnit(newUnit); } } }
t.setHandlerUnit(trapsToHandler.get(t));
private void fixJumps(Unit from, Unit to, Chain<Trap> t) { from.redirectJumpsToThisTo(to); for (Trap trap : t) { if (trap.getBeginUnit() == from) { trap.setBeginUnit(to); } if (trap.getEndUnit() == from) { trap.setEndUnit(to); } if (trap.getHandlerUnit() == from) { trap.setHandlerUnit(to); } } } }
public static void updateTraps(Unit oldu, Unit newu, Chain<Trap> traps) { int size = traps.size(); if (size == 0) { return; } Trap t = traps.getFirst(); do { if (t.getBeginUnit() == oldu) { t.setBeginUnit(newu); } if (t.getEndUnit() == oldu) { t.setEndUnit(newu); } if (t.getHandlerUnit() == oldu) { t.setHandlerUnit(newu); } } while ((--size > 0) && (t = traps.getSuccOf(t)) != null); }
t.setHandlerUnit(newBeginUnit);
@Override protected void internalTransform(Body b, String phaseName, Map<String, String> options) { for (Trap t : b.getTraps()) { // If the first statement already catches the exception, we're fine if (isCaughtExceptionRef(t.getHandlerUnit())) { continue; } // Add the exception reference Local l = new LocalGenerator(b).generateLocal(t.getException().getType()); Stmt caughtStmt = Jimple.v().newIdentityStmt(l, Jimple.v().newCaughtExceptionRef()); b.getUnits().add(caughtStmt); b.getUnits().add(Jimple.v().newGotoStmt(t.getHandlerUnit())); t.setHandlerUnit(caughtStmt); } }
cloneTrap.setHandlerUnit(handlerUnit); cloneTrap.setBeginUnit((Unit) bindings.get(originalTrap.getBeginUnit())); cloneTrap.setEndUnit((Unit) bindings.get(originalTrap.getEndUnit())); JGotoStmt jgs = new JGotoStmt((Unit) t.getHandlerUnit()); units.addLast(jgs); t.setHandlerUnit((Unit) jgs);