1 2 package jas; 3 4 import java.io.*; 5 import java.util.Hashtable ; 6 import java.util.Enumeration ; 7 import java.util.Vector ; 8 9 16 17 public class ClassEnv implements RuntimeConstants 18 { 19 int magic; 20 short version_lo, version_hi; 21 CP this_class, super_class; 22 short class_access; 23 Hashtable cpe, cpe_index; 24 Vector interfaces; 25 Vector vars; 26 Vector methods; 27 SourceAttr source; 28 Vector generic; 29 boolean hasSuperClass; 30 InnerClassAttr inner_class_attr; 31 boolean classSynth; 32 SyntheticAttr synthAttr; 33 DeprecatedAttr deprAttr = null; 34 SignatureAttr sigAttr = null; 35 VisibilityAnnotationAttr visAnnotAttr = null; 36 EnclMethAttr encl_meth_attr; 37 boolean highVersion = false; 38 39 public ClassEnv() 40 { 41 magic = JAVA_MAGIC; 43 version_lo = (short) JAVA_MINOR_VERSION; 44 version_hi = (short) JAVA_VERSION; 45 cpe = new Hashtable (); 47 cpe_index = null; 48 interfaces = new Vector (); 49 vars = new Vector (); 50 methods = new Vector (); 51 generic = new Vector (); 52 } 53 54 public void setHighVersion(boolean b){ 55 highVersion = b; 56 version_lo = (short) JAVA_MINOR_HIGH_VERSION; 58 version_hi = (short) JAVA_HIGH_VERSION; 59 } 60 61 66 public void setClass(CP name) 67 { this_class = name; addCPItem(name); } 68 69 73 public void setNoSuperClass() 74 { 75 hasSuperClass = false; 76 } 77 78 83 public void setSuperClass(CP name) 84 { 85 hasSuperClass = true; 86 super_class = name; 87 addCPItem(name); 88 } 89 90 97 public void setClassAccess(short access) 98 { class_access = access; } 99 100 105 106 public void addInterface(CP ifc) 107 { 108 addCPItem(ifc); 109 interfaces.addElement(ifc); 110 } 111 112 118 public void addInterface(CP ilist[]) 119 { 120 for (int i=0; i<ilist.length; i++) 121 { 122 interfaces.addElement(ilist[i]); 123 addCPItem(ilist[i]); 124 } 125 } 126 127 public void addField(Var v) 128 { 129 vars.addElement(v); 130 v.resolve(this); 131 } 132 137 public void write(DataOutputStream out) 138 throws IOException, jasError 139 { 140 out.writeInt(magic); 142 out.writeShort(version_lo); 143 out.writeShort(version_hi); 144 145 int curidx = 1; 147 cpe_index = new Hashtable (); 149 for (Enumeration e = cpe.elements(); e.hasMoreElements();) 150 { 151 CP tmp = (CP)(e.nextElement()); 152 cpe_index.put(tmp.getUniq(), new Integer (curidx)); 153 curidx++; 154 if ((tmp instanceof LongCP) || 155 (tmp instanceof DoubleCP)) 156 curidx++; 157 } 158 out.writeShort((short)curidx); 159 160 for (Enumeration e = cpe.elements(); e.hasMoreElements();) 162 { 163 CP now = (CP) (e.nextElement()); 164 now.write(this, out); 165 } 166 167 out.writeShort(class_access); 169 out.writeShort(getCPIndex(this_class)); 170 if (hasSuperClass) 171 { out.writeShort(getCPIndex(super_class)); } 172 else 173 { out.writeShort(0); } 174 out.writeShort(interfaces.size()); 176 for (Enumeration e = interfaces.elements(); e.hasMoreElements();) 177 { 178 CP c = (CP)(e.nextElement()); 179 out.writeShort(getCPIndex(c)); 180 } 181 out.writeShort(vars.size()); 183 for (Enumeration e = vars.elements(); e.hasMoreElements();) 184 { 185 Var v = (Var)(e.nextElement()); 186 v.write(this, out); 187 } 188 189 out.writeShort(methods.size()); 191 for (Enumeration e = methods.elements(); e.hasMoreElements();) 192 { 193 Method m = (Method)(e.nextElement()); 194 m.write(this, out); 195 } 196 short numExtra = 0; 198 if (source != null) 199 { numExtra = 1; } 200 numExtra += generic.size(); 201 if (inner_class_attr != null) { 202 numExtra++; 203 } 204 if (isClassSynth()){ 205 numExtra++; 206 } 207 if (deprAttr != null){ 208 numExtra++; 209 } 210 if (sigAttr != null){ 211 numExtra++; 212 } 213 if (visAnnotAttr != null){ 214 numExtra++; 215 } 216 if (encl_meth_attr != null){ 217 numExtra++; 218 } 219 220 out.writeShort(numExtra); 221 if (source != null) 222 { source.write(this, out); } 223 for (Enumeration gen=generic.elements(); gen.hasMoreElements(); ) 224 { 225 GenericAttr gattr = (GenericAttr)gen.nextElement(); 226 gattr.write(this, out); 227 } 228 229 if (isClassSynth()){ 231 synthAttr.write(this, out); 235 } 236 if (deprAttr != null){ 238 deprAttr.write(this, out); 239 } 240 if (sigAttr != null){ 242 sigAttr.write(this, out); 243 } 244 if (encl_meth_attr != null){ 246 encl_meth_attr.write(this, out); 247 } 248 if (visAnnotAttr != null){ 250 visAnnotAttr.write(this, out); 251 } 252 if (inner_class_attr != null){ 254 inner_class_attr.write(this, out); 255 } 256 out.flush(); 257 } 258 259 267 268 public void addCPItem(CP cp) 269 { 270 String uniq = cp.getUniq(); 271 CP intern; 272 274 if ((intern = (CP)(cpe.get(uniq))) == null) 275 { 276 cpe.put(uniq, cp); 278 cp.resolve(this); 282 283 } 284 } 286 287 296 public void 297 addMethod(short acc, String name, String sig, CodeAttr code, ExceptAttr ex) 298 { 299 Method x = new Method(acc, new AsciiCP(name), new AsciiCP(sig), 300 code, ex); 301 x.resolve(this); 302 methods.addElement(x); 303 } 304 305 306 public void setClassSynth(boolean b){ 307 classSynth = b; 308 synthAttr = new SyntheticAttr(); 309 synthAttr.resolve(this); 310 } 311 312 public boolean isClassSynth(){ 313 return classSynth; 314 } 315 316 public void setClassDepr(DeprecatedAttr d){ 317 deprAttr = d; 318 deprAttr.resolve(this); 319 } 320 321 public void setClassSigAttr(SignatureAttr s){ 322 sigAttr = s; 323 sigAttr.resolve(this); 324 } 325 326 public void setClassAnnotAttr(VisibilityAnnotationAttr s){ 327 visAnnotAttr = s; 328 visAnnotAttr.resolve(this); 329 } 330 331 public void finishInnerClassAttr(InnerClassAttr attr){ 332 inner_class_attr = attr; 333 inner_class_attr.resolve(this); 334 } 335 336 public void addEnclMethAttr(EnclMethAttr attr){ 337 encl_meth_attr = attr; 338 encl_meth_attr.resolve(this); 339 } 340 341 346 347 public void setSource(SourceAttr source) 348 { this.source = source; source.resolve(this); } 349 350 355 public void setSource(String source) 356 { this.source = new SourceAttr(source); this.source.resolve(this); } 357 358 364 public void addGenericAttr(GenericAttr g) 365 { generic.addElement(g); g.resolve(this); } 366 367 371 public void addMethod(Method m) 372 { 373 m.resolve(this); 374 methods.addElement(m); 375 } 376 377 int getCPIndex(CP cp) 380 throws jasError 381 { 382 if (cpe_index == null) { 383 throw new jasError("Internal error: CPE index has not been generated"); 384 } 385 388 Integer idx = (Integer )(cpe_index.get(cp.getUniq())); 389 if (idx == null) 392 throw new jasError("Item " + cp + " not in the class"); 393 return (idx.intValue()); 394 } 395 } 396 | Popular Tags |