/** * Used to make up new field entries. Fields for a class can have * an additional "ConstantValue" attribute associated them, * which the java compiler uses to represent things like * static final int blah = foo; * * @author $Author: jonmeyerny $ * @version $Revision: 1.1 $ */ package jas; import java.io.*; import java.util.Vector; import java.util.Enumeration; public class Var { short var_acc; CP name, desc; SignatureAttr sig; ConstAttr const_attr; DeprecatedAttr depr; AnnotationAttr annVis, annInvis; Vector generic; /** * @param vacc access permissions for the field * @param name name of the field * @param desc type of the field * @param cattr Extra constant value information. Passing this as * null will not include this information for the record. * @see RuntimeConstants */ public Var(short vacc, CP name, CP desc, ConstAttr cattr) { var_acc = vacc; this.name = name; this.desc = desc; const_attr = cattr; sig = null; depr = null; annVis = annInvis = null; generic = new Vector(); } public void setSignature(SignatureAttr sig) { this.sig = sig; } public void setDeprecated(DeprecatedAttr depr) { this.depr = depr; } /** * Add a generic attribute to the field. A generic attribute * contains a stream of uninterpreted bytes which is ignored by * the VM (as long as its name doesn't conflict with other names * for attributes that are understood by the VM) */ public void addGenericAttr(GenericAttr g) { generic.addElement(g); } /* * procedure group for annotation description */ public Annotation addAnnotation(boolean visible, String clsname) { Annotation ann = new Annotation(clsname); AnnotationAttr aa = visible ? annVis : annInvis; if(aa == null) { aa = new AnnotationAttr(visible); if(visible) annVis = aa; else annInvis = aa; } aa.add(ann); return(ann); } void resolve(ClassEnv e) { e.addCPItem(name); e.addCPItem(desc); if (const_attr != null) { const_attr.resolve(e); } if(sig != null) sig.resolve(e); if(depr != null) depr.resolve(e); if(annVis != null) annVis.resolve(e); if(annInvis != null) annInvis.resolve(e); for(Enumeration gen = generic.elements(); gen.hasMoreElements(); ) { GenericAttr gattr = (GenericAttr)gen.nextElement(); gattr.resolve(e); } } void write(ClassEnv e, DataOutputStream out) throws IOException, jasError { out.writeShort(var_acc); out.writeShort(e.getCPIndex(name)); out.writeShort(e.getCPIndex(desc)); short nb = (short)generic.size(); if (const_attr != null) nb++; if(sig != null) nb++; if(depr != null) nb++; if(annVis != null) nb++; if(annInvis != null) nb++; out.writeShort(nb); if (const_attr != null) const_attr.write(e, out); if(sig != null) sig.write(e, out); if(depr != null) depr.write(e, out); if(annVis != null) annVis.write(e, out); if(annInvis != null) annInvis.write(e, out); for (Enumeration gen = generic.elements(); gen.hasMoreElements();) { GenericAttr gattr = (GenericAttr)gen.nextElement(); gattr.write(e, out); } } }