1 19 20 25 26 27 package soot; 28 29 import soot.util.*; 30 import java.util.*; 31 32 34 public abstract class Pack implements HasPhaseOptions 35 { 36 final private boolean DEBUG = true; 37 private String name; 38 public String getPhaseName() { return name; } 39 public Pack( String name ) { 40 this.name = name; 41 } 42 Chain opts = new HashChain(); 43 44 public Iterator iterator() { return opts.iterator(); } 45 46 public void add(Transform t) { 47 PhaseOptions.v().getPM().notifyAddPack(); 48 if( get( t.getPhaseName() ) != null ) { 49 throw new RuntimeException ( "Phase "+t.getPhaseName()+" already " 50 +"in pack" ); 51 } 52 opts.add(t); 53 } 54 55 public void insertAfter(Transform t, String phaseName) 56 { 57 PhaseOptions.v().getPM().notifyAddPack(); 58 Iterator it = opts.iterator(); 59 while (it.hasNext()) 60 { 61 Transform tr = (Transform)it.next(); 62 if (tr.getPhaseName().equals(phaseName)) 63 { 64 opts.insertAfter(t, tr); 65 return; 66 } 67 } 68 throw new RuntimeException ("phase "+phaseName+" not found!"); 69 } 70 71 public void insertBefore(Transform t, String phaseName) 72 { 73 PhaseOptions.v().getPM().notifyAddPack(); 74 Iterator it = opts.iterator(); 75 while (it.hasNext()) 76 { 77 Transform tr = (Transform)it.next(); 78 if (tr.getPhaseName().equals(phaseName)) 79 { 80 opts.insertBefore(t, tr); 81 return; 82 } 83 } 84 throw new RuntimeException ("phase "+phaseName+" not found!"); 85 } 86 87 public Transform get( String phaseName ) { 88 for( Iterator trIt = opts.iterator(); trIt.hasNext(); ) { 89 final Transform tr = (Transform) trIt.next(); 90 if( tr.getPhaseName().equals(phaseName) ) { 91 return tr; 92 } 93 } 94 return null; 95 } 96 97 protected void internalApply() { 98 throw new RuntimeException ("wrong type of pack"); 99 } 100 101 protected void internalApply(Body b) { 102 throw new RuntimeException ("wrong type of pack"); 103 } 104 105 public final void apply() { 106 Map options = PhaseOptions.v().getPhaseOptions( this ); 107 if( !PhaseOptions.getBoolean( options, "enabled" ) ) return; 108 if (DEBUG) 109 PhaseDumper.v().dumpBefore(getPhaseName()); 110 internalApply(); 111 if (DEBUG) 112 PhaseDumper.v().dumpAfter(getPhaseName()); 113 } 114 115 public final void apply(Body b) { 116 Map options = PhaseOptions.v().getPhaseOptions( this ); 117 if( !PhaseOptions.getBoolean( options, "enabled" ) ) return; 118 if (DEBUG) 119 PhaseDumper.v().dumpBefore(b, getPhaseName()); 120 internalApply(b); 121 if (DEBUG) 122 PhaseDumper.v().dumpAfter(b, getPhaseName()); 123 } 124 125 public String getDeclaredOptions() { return soot.options.Options.getDeclaredOptionsForPhase( getPhaseName() ); } 126 public String getDefaultOptions() { return soot.options.Options.getDefaultOptionsForPhase( getPhaseName() ); } 127 } 128 | Popular Tags |