1 30 31 36 37 package jbet.cmd; 38 import jbet.*; 39 import java.io.*; 40 import java.util.*; 41 42 public class regencode implements Command 43 { 44 public int helplevel() { return 3; } 45 public String shorthelp() { return "regen code for <method>"; } 46 public String longhelp() { 47 return 48 "jbet regencode <class>.<method>\t\tRegen code for <method>\n"; } 49 50 public void run (Lexer lexer) throws Exception { 51 52 boolean runcodegen = true; 53 boolean runanal = false; 54 55 loop: 56 while(true) { 57 switch(lexer.read().type) { 58 case 'g': runcodegen = true; break; 59 case 'a': runanal = true; break; 60 case Token.END_OF_OPTS: break loop; 61 default: lexer.unexpected(lexer.justread()); 62 } 63 } 64 65 Object thing = lexer.getThing(Jbet.default_class); 66 lexer.term(); 67 68 if (thing instanceof FieldInfo) throw new 69 GlobalException("can't regencode a field"); 70 71 Vector methods = new Vector(); 72 if (thing instanceof ClassInfo) { 73 ClassInfo cr = (ClassInfo) thing; 74 for (int i = 0; i < cr.numMethods(); i++) 75 methods.addElement (cr.methodAt (i)); 76 } 77 else 78 methods.addElement (thing); 79 80 for (int i = 0; i < methods.size(); i++) { 81 MethodInfo mi = (MethodInfo) methods.elementAt (i); 82 83 if (mi.name.equals ("<init>")) continue; 84 if (mi.code == null) continue; 85 try { 86 DagMethodInfo method = new DagMethodInfo (new DagClassInfo (mi.cr), mi, true); 87 DagSnippit dags = method.dags(); 88 89 SimpleCodeGen ra = new SimpleCodeGen (); 90 91 Snippit outcode = ra.codegen (dags); 92 93 mi.cr.setDirty(); 94 mi.code = outcode; 95 mi.maxStack = -1; 96 mi.maxLocals = -1; 97 mi.code.addLinesAsPCs(mi.cr.constantPool()); 98 99 DataFlow df = new DataFlow (mi); 100 df.run(); 101 102 mi.maxStack = df.maxStackDetected; 103 mi.maxLocals = df.maxLocalsDetected; 104 105 mi.removeDataFlow(); 106 107 Jbet.info.println("regencode " + mi.qualifiedName()); 108 109 } catch (Exception e) { 110 Jbet.output.println ("Warning : couldn't do method " + 111 mi.qualifiedName() + " " + e.getMessage()); 112 if (Main.verboseErrors) 113 e.printStackTrace(Jbet.output); 114 } 115 } 116 117 } 118 } 119 | Popular Tags |