6 public class ClassDescriptor extends Descriptor {
7 private static int UIDCount=1; // start from 1 instead of 0 for multicore gc
8 private final int classid;
10 ClassDescriptor superdesc;
11 boolean hasFlags=false;
21 int numstaticblocks = 0;
22 int numstaticfields = 0;
25 Vector<String> superinterfaces;
26 SymbolTable superIFdesc;
27 private int interfaceid;
30 boolean isInnerClass=false;
32 // inner classes/enum can have these
33 String surroundingclass=null;
34 ClassDescriptor surroudingdesc=null;
35 SymbolTable innerdescs;
38 boolean isEnum = false;
39 SymbolTable enumdescs;
40 HashMap<String, Integer> enumConstantTbl;
41 int enumconstantid = 0;
43 boolean isClassLibrary=false;
45 String sourceFileName;
47 public ClassDescriptor(String classname, boolean isInterface) {
48 this("", classname, isInterface);
51 public ClassDescriptor(String packagename, String classname, boolean isInterface) {
54 flags=new SymbolTable();
55 fields=new SymbolTable();
56 fieldvec=new Vector();
57 methods=new SymbolTable();
60 this.interfaceid = -1;
64 this.packagename=packagename;
65 superinterfaces = new Vector<String>();
66 superIFdesc = new SymbolTable();
67 this.innerdescs = new SymbolTable();
68 this.enumdescs = new SymbolTable();
72 if(this.isInterface()) {
73 return this.interfaceid;
78 public Iterator getMethods() {
79 return methods.getDescriptorsIterator();
82 public Iterator getFields() {
83 return fields.getDescriptorsIterator();
86 public Iterator getFlags() {
87 return flags.getDescriptorsIterator();
90 public Iterator getSuperInterfaces() {
91 return this.superIFdesc.getDescriptorsIterator();
94 public SymbolTable getFieldTable() {
98 public Vector getFieldVec() {
102 public SymbolTable getFlagTable() {
106 public SymbolTable getMethodTable() {
110 public SymbolTable getSuperInterfaceTable() {
111 return this.superIFdesc;
114 public String getSafeDescriptor() {
115 return "L"+safename.replace('.','/');
118 public String printTree(State state) {
120 String st=modifiers.toString()+"class "+getSymbol();
121 if (superclass!=null)
122 st+="extends "+superclass.toString();
123 if(this.superinterfaces != null) {
125 boolean needcomma = false;
126 for(int i = 0; i < this.superinterfaces.size(); i++) {
130 st += this.superinterfaces.elementAt(i);
135 indent=TreeNode.INDENT;
136 boolean printcr=false;
138 for(Iterator it=getFlags(); it.hasNext();) {
139 FlagDescriptor fd=(FlagDescriptor)it.next();
140 st+=TreeNode.printSpace(indent)+fd.toString()+"\n";
148 for(Iterator it=getFields(); it.hasNext();) {
149 FieldDescriptor fd=(FieldDescriptor)it.next();
150 st+=TreeNode.printSpace(indent)+fd.toString()+"\n";
156 for(Iterator it=this.getInnerClasses(); it.hasNext();) {
157 ClassDescriptor icd=(ClassDescriptor)it.next();
158 st+=icd.printTree(state)+"\n";
164 for(Iterator it=this.getEnum(); it.hasNext();) {
165 ClassDescriptor icd = (ClassDescriptor)it.next();
166 st += icd.getModifier().toString() + " enum " + icd.getSymbol() + " {\n ";
167 Set keys = icd.getEnumConstantTbl().keySet();
168 String[] econstants = new String[keys.size()];
169 Iterator it_keys = keys.iterator();
170 while(it_keys.hasNext()) {
171 String key = (String)it_keys.next();
172 econstants[icd.getEnumConstant(key)] = key;
174 for(int i = 0; i < econstants.length; i++) {
176 if(i < econstants.length-1) {
186 for(Iterator it=getMethods(); it.hasNext();) {
187 MethodDescriptor md=(MethodDescriptor)it.next();
188 st+=TreeNode.printSpace(indent)+md.toString()+" ";
189 BlockNode bn=state.getMethodBody(md);
190 st+=bn.printNode(indent)+"\n\n";
196 public MethodDescriptor getCalledMethod(MethodDescriptor md) {
197 ClassDescriptor cn=this;
202 Set possiblematches=cn.getMethodTable().getSet(md.getSymbol());
203 boolean foundmatch=false;
204 for(Iterator matchit=possiblematches.iterator(); matchit.hasNext();) {
205 MethodDescriptor matchmd=(MethodDescriptor)matchit.next();
206 if (md.matches(matchmd)) {
211 //Not found...walk one level up
212 cn=cn.getSuperDesc();
216 public void addFlag(FlagDescriptor fd) {
217 if (flags.contains(fd.getSymbol()))
218 throw new Error(fd.getSymbol()+" already defined");
223 public boolean hasFlags() {
224 return hasFlags||getSuperDesc()!=null&&getSuperDesc().hasFlags();
227 public void addField(FieldDescriptor fd) {
228 if (fields.contains(fd.getSymbol()))
229 throw new Error(fd.getSymbol()+" already defined");
233 this.incStaticFields();
235 fd.setClassDescriptor(this);
238 public void addMethod(MethodDescriptor md) {
242 public void setModifiers(Modifiers modifiers) {
243 this.modifiers=modifiers;
246 public void setSuper(String superclass) {
247 this.superclass=superclass;
250 public ClassDescriptor getSuperDesc() {
254 public void setSuper(ClassDescriptor scd) {
258 public String getSuper() {
262 public void addSuperInterface(String superif) {
263 this.superinterfaces.addElement(superif);
266 public Vector<String> getSuperInterface() {
267 return this.superinterfaces;
270 public void addSuperInterfaces(ClassDescriptor sif) {
271 this.superIFdesc.add(sif);
274 public void incStaticBlocks() {
275 this.numstaticblocks++;
278 public int getNumStaticBlocks() {
279 return this.numstaticblocks;
282 public void incStaticFields() {
283 this.numstaticfields++;
286 public int getNumStaticFields() {
287 return this.numstaticfields;
290 public boolean isAbstract() {
291 return this.modifiers.isAbstract();
294 public boolean isInterface() {
295 return (this.classid == -2);
298 public void setInterfaceId(int id) {
299 this.interfaceid = id;
302 public boolean isStatic() {
303 return this.modifiers.isStatic();
306 public void setAsInnerClass() {
307 this.isInnerClass = true;
310 public boolean isInnerClass() {
311 return this.isInnerClass;
314 public void setSurroundingClass(String sclass) {
315 this.surroundingclass=sclass;
318 public String getSurrounding() {
319 return this.surroundingclass;
322 public ClassDescriptor getSurroundingDesc() {
323 return this.surroudingdesc;
326 public void setSurrounding(ClassDescriptor scd) {
327 this.surroudingdesc=scd;
330 public void addInnerClass(ClassDescriptor icd) {
331 this.innerdescs.add(icd);
334 public Iterator getInnerClasses() {
335 return this.innerdescs.getDescriptorsIterator();
338 public SymbolTable getInnerClassTable() {
339 return this.innerdescs;
342 public void setAsEnum() {
346 public boolean isEnum() {
350 public void addEnum(ClassDescriptor icd) {
351 this.enumdescs.add(icd);
354 public Iterator getEnum() {
355 return this.enumdescs.getDescriptorsIterator();
358 public SymbolTable getEnumTable() {
359 return this.enumdescs;
362 public void addEnumConstant(String econstant) {
363 if(this.enumConstantTbl == null) {
364 this.enumConstantTbl = new HashMap<String, Integer>();
366 if(this.enumConstantTbl.containsKey(econstant)) {
369 this.enumConstantTbl.put(econstant, this.enumconstantid++);
374 public int getEnumConstant(String econstant) {
375 if(this.enumConstantTbl.containsKey(econstant)) {
376 return this.enumConstantTbl.get(econstant).intValue();
382 public HashMap<String, Integer> getEnumConstantTbl() {
383 return this.enumConstantTbl;
386 public Modifiers getModifier() {
387 return this.modifiers;
390 public void setClassLibrary(){
391 this.isClassLibrary=true;
394 public boolean isClassLibrary(){
395 return isClassLibrary;
398 public void setSourceFileName(String sourceFileName){
399 this.sourceFileName=sourceFileName;
402 public String getSourceFileName(){
403 return this.sourceFileName;