1 19 20 package jode.flow; 21 import jode.decompiler.LocalInfo; 22 import jode.util.ArrayEnum; 23 24 import java.util.Collection ; 25 import java.util.AbstractSet ; 26 import java.util.Iterator ; 27 28 39 public final class VariableSet extends AbstractSet implements Cloneable { 40 LocalInfo[] locals; 41 int count; 42 43 46 public VariableSet() { 47 locals = null; 48 count = 0; 49 } 50 51 54 public VariableSet(LocalInfo[] locals) { 55 count = locals.length; 56 this.locals = locals; 57 } 58 59 public final void grow(int size) { 60 if (locals != null) { 61 size += count; 62 if (size > locals.length) { 63 int nextSize = locals.length * 2; 64 LocalInfo[] newLocals 66 = new LocalInfo[nextSize > size ? nextSize : size]; 67 System.arraycopy(locals, 0, newLocals, 0, count); 68 locals = newLocals; 69 } 70 } else if (size > 0) 71 locals = new LocalInfo[size]; 72 } 73 74 77 public boolean add(Object li) { 78 if (contains(li)) 79 return false; 80 grow(1); 81 locals[count++] = (LocalInfo) li; 82 return true; 83 } 84 85 88 public boolean contains(Object li) { 89 li = ((LocalInfo) li).getLocalInfo(); 90 for (int i=0; i<count;i++) 91 if (locals[i].getLocalInfo() == li) 92 return true; 93 return false; 94 } 95 96 99 public final boolean containsSlot(int slot) { 100 return findSlot(slot) != null; 101 } 102 103 106 public LocalInfo findLocal(String name) { 107 for (int i=0; i<count;i++) 108 if (locals[i].getName().equals(name)) 109 return locals[i]; 110 return null; 111 } 112 113 116 public LocalInfo findSlot(int slot) { 117 for (int i=0; i<count;i++) 118 if (locals[i].getSlot() == slot) 119 return locals[i]; 120 return null; 121 } 122 123 126 public boolean remove(Object li) { 127 li = ((LocalInfo) li).getLocalInfo(); 128 for (int i=0; i<count;i++) { 129 if (locals[i].getLocalInfo() == li) { 130 locals[i] = locals[--count]; 131 locals[count] = null; 132 return true; 133 } 134 } 135 return false; 136 } 137 138 public int size() { 139 return count; 140 } 141 142 public Iterator iterator() { 143 return new Iterator () { 144 int pos = 0; 145 146 public boolean hasNext() { 147 return pos < count; 148 } 149 150 public Object next() { 151 return locals[pos++]; 152 } 153 154 public void remove() { 155 if (pos < count) 156 System.arraycopy(locals, pos, 157 locals, pos-1, count - pos); 158 count--; 159 pos--; 160 locals[count] = null; 161 } 162 }; 163 } 164 165 168 public void clear() { 169 locals = null; 170 count = 0; 171 } 172 173 public Object clone() { 174 try { 175 VariableSet other = (VariableSet) super.clone(); 176 if (count > 0) { 177 other.locals = new LocalInfo[count]; 178 System.arraycopy(locals, 0, other.locals, 0, count); 179 } 180 return other; 181 } catch (CloneNotSupportedException ex) { 182 throw new jode.AssertError("Clone?"); 183 } 184 } 185 186 191 public VariableSet intersect(VariableSet vs) { 192 VariableSet intersection = new VariableSet(); 193 intersection.grow(Math.min(count, vs.count)); 194 big_loop: 195 for (int i=0; i<count; i++) { 196 LocalInfo li = locals[i]; 197 int slot = li.getSlot(); 198 if (vs.containsSlot(slot) 199 && !intersection.containsSlot(slot)) 200 intersection.locals[intersection.count++] = li.getLocalInfo(); 201 } 202 return intersection; 203 } 204 205 211 public void mergeGenKill(Collection gen, SlotSet kill) { 212 grow(gen.size()); 213 big_loop: 214 for (Iterator i = gen.iterator(); i.hasNext(); ) { 215 LocalInfo li2 = (LocalInfo) i.next(); 216 if (!kill.containsSlot(li2.getSlot())) 217 add(li2.getLocalInfo()); 218 } 219 } 220 } 221 222 | Popular Tags |