1 2 32 33 package jbet; 34 import java.util.*; 35 import java.io.*; 36 37 public class AliasDB { 38 39 Vector revdb; 40 Hashtable db; 41 int nextserial; 42 43 public AliasDB() { 44 nextserial = 1; 45 db = new Hashtable(); 46 revdb = new Vector(); 47 } 48 49 private int next() { 50 return nextserial++; 51 } 52 53 private int get(String key) { 54 Integer s = (Integer ) db.get(key); 55 if (s == null) { 56 int ret = next(); 57 db.put(key, new Integer (ret)); 58 return ret; 59 } else 60 return s.intValue(); 61 } 62 63 private int peek(String key) { 64 Integer s = (Integer ) db.get(key); 65 if (s == null) 66 return 0; 67 else 68 return s.intValue(); 69 } 70 71 private void set(String key, int val) { 72 db.put(key, new Integer (val)); 73 } 74 75 76 public int getField (int struc, String name) { 77 return get (struc + "," + name); 78 } 79 80 public int peekField (int struc, String name) { 81 return peek (struc + "," + name); 82 } 83 84 public void setField(int struc, String name, int val) { 85 set(struc + "," + name, val); 86 } 87 88 public int getSField(String cname, String fname) { 89 return get (cname + "." + fname); 90 } 91 92 public int peekSField(String cname, String fname) { 93 return peek (cname + "." + fname); 94 } 95 96 public void setSField(String cname, String fname, int val) { 97 set (cname + "." + fname, val); 98 } 99 100 public int getArrayElt (int array, int index) { 101 return get (array + "," + index); 102 } 103 104 public int peekArrayElt (int array, int index) { 105 return peek (array + "," + index); 106 } 107 108 public void setArrayElt (int array, int index, int value) { 109 set (array + "," + index, value); 110 } 111 112 public boolean isBad (int array) { 113 return db.get(array + ",,,BAD") != null; 114 } 115 116 public void setBad (int array) { 117 db.put(array + ",,,BAD", this); 118 } 119 120 public void print(LineWriter out) { 121 out.println("---"); 122 for (Enumeration e = db.keys(); e.hasMoreElements();) { 123 Object k = e.nextElement(); 124 Object v = db.get(k); 125 out.println(" " + k + " -> " + v); 126 } 127 out.println("---"); 128 } 129 130 133 134 public Iterator getNodes(int serial) { 135 List l = (List) revdb.elementAt(serial); 136 if (l == null) 137 return null; 138 else 139 return l.iterator(); 140 } 141 142 public void setNode (Node val, int serial) { 143 val.serial = serial; 144 if (revdb.size() <= serial) { 145 revdb.setSize(serial+1); 146 } 147 LinkedList l = (LinkedList) revdb.elementAt(serial); 148 if (l == null) { 149 l = new LinkedList(); 150 revdb.setElementAt(l, serial); 151 } 152 l.add (val); 153 } 154 155 public void setNode (Node val) { 156 if (val.serial == 0) 157 val.serial = next(); 158 setNode(val, val.serial); 159 } 160 161 162 public Node getNodeFromBlock(int serial, BasicBlock bb) { 163 for (Iterator i = getNodes(serial); i.hasNext();) { 164 Node n = (Node) i.next(); 165 if (n.sb == bb) return n; 166 } 167 return null; 168 } 169 170 public Node getGoodNodeFromBlock(int serial, BasicBlock bb) { 171 for (Iterator i = getNodes(serial); i.hasNext();) { 172 Node n = (Node) i.next(); 173 if (n.sb == bb && !(n instanceof Node.getfield || n instanceof Node.aload)) 174 return n; 175 } 176 return null; 177 } 178 179 public Node getBestNodeFromBlock (int serial, BasicBlock bb) { 180 Node n = getGoodNodeFromBlock(serial, bb); 181 if (n != null) return n; 182 return getNodeFromBlock(serial, bb); 183 } 184 185 public Node getGoodNode(int serial) { 186 for (Iterator i = getNodes(serial); i.hasNext();) { 187 Node n = (Node) i.next(); 188 if (!(n instanceof Node.getfield || n instanceof Node.aload || n instanceof Node.var)) 189 return n; 190 } 191 return null; 192 } 193 194 public Node getBestNode(int serial) { 195 Node var = null, lookup = null, other = null; 196 for (Iterator i = getNodes(serial); i.hasNext();) { 197 Node n = (Node) i.next(); 198 if (n instanceof Node.var && var==null) 199 var = n; 200 else if ((n instanceof Node.aload || n instanceof Node.getfield) && lookup==null) 201 lookup = n; 202 else if (other == null) 203 other = n; 204 if (var!=null && lookup!=null && other!=null) 205 break; 206 } 207 if (other != null) 208 return other; 209 else if (lookup != null) 210 return lookup; 211 else if (var != null) 212 return var; 213 else return null; 214 } 215 } 216 217 218 | Popular Tags |