1 19 20 25 26 27 package soot.jimple.parser; 28 29 import soot.jimple.parser.parser.*; 30 import soot.jimple.parser.lexer.*; 31 import soot.jimple.parser.node.*; 32 import soot.jimple.parser.analysis.*; 33 import java.io.*; 34 import java.util.*; 35 36 import soot.util.*; 37 import soot.*; 38 39 43 public class JimpleAST 44 { 45 private Start mTree = null; 46 private HashMap methodToParsedBodyMap = null; 47 48 52 public JimpleAST(InputStream aJIS) 53 { 54 Parser p = 55 new Parser(new Lexer( 56 new PushbackReader(new BufferedReader( 57 new InputStreamReader(aJIS)), 1024))); 58 try { 59 mTree = p.parse(); 60 } catch(ParserException e) { 61 throw new RuntimeException ("Parser exception occurred: " + e); 62 } catch(LexerException e) { 63 throw new RuntimeException ("Lexer exception occurred: " + e); 64 } catch(IOException e) { 65 throw new RuntimeException ("IOException occurred: " + e); 66 } 67 } 68 69 71 public SootClass createSootClass() 72 { 73 Walker w = new Walker(SootResolver.v()); 74 mTree.apply(w); 75 return w.getSootClass(); 76 } 77 78 85 public void getSkeleton(SootClass sc) 86 { 87 Walker w = new SkeletonExtractorWalker(SootResolver.v(), sc); 88 mTree.apply(w); 89 } 90 91 92 97 public Body getBody(SootMethod m) 98 { 99 if (methodToParsedBodyMap == null) 100 stashBodiesForClass(m.getDeclaringClass()); 101 return (Body)methodToParsedBodyMap.get(m); 102 } 103 104 105 109 public Set getCstPool() 110 { 111 CstPoolExtractor cpe = new CstPoolExtractor(mTree); 112 return cpe.getCstPool(); 113 } 114 115 116 public SootResolver getResolver() 117 { 118 return SootResolver.v(); 119 } 120 121 124 private void stashBodiesForClass(SootClass sc) 125 { 126 methodToParsedBodyMap = new HashMap(); 127 128 Walker w = new BodyExtractorWalker(sc, SootResolver.v(), methodToParsedBodyMap); 129 130 boolean oldPhantomValue = Scene.v().getPhantomRefs(); 131 132 Scene.v().setPhantomRefs(true); 133 mTree.apply(w); 134 Scene.v().setPhantomRefs(oldPhantomValue); 135 } 136 } | Popular Tags |