package IR;
import java.util.*;
import IR.Tree.*;
-import IR.FieldDescriptor;
-import IR.MethodDescriptor;
-import IR.NameDescriptor;
-
-public class ClassDescriptor {
- public ClassDescriptor() {
- classname=null;
- superclass=null;
- fields=new Vector();
- methods=new Vector();
- }
- String classname;
- NameDescriptor superclass;
- Modifiers modifiers;
- Vector fields;
- Vector methods;
-
- public Iterator getMethods() {
- return methods.iterator();
- }
-
- public String printTree(State state) {
- int indent;
- String st=modifiers.toString()+"class "+classname;
- if (superclass!=null)
- st+="extends "+superclass.toString();
- st+=" {\n";
- indent=TreeNode.INDENT;
- for(int i=0;i<fields.size();i++) {
- FieldDescriptor fd=(FieldDescriptor)fields.get(i);
- st+=TreeNode.printSpace(indent)+fd.toString()+"\n";
- }
- if (fields.size()>0)
- st+="\n";
-
- for(int i=0;i<methods.size();i++) {
- MethodDescriptor md=(MethodDescriptor)methods.get(i);
- st+=TreeNode.printSpace(indent)+md.toString()+" ";
- BlockNode bn=state.getMethodBody(md);
- st+=bn.printNode(indent)+"\n\n";
- }
- st+="}\n";
- return st;
- }
- public void addField(FieldDescriptor fd) {
- fields.add(fd);
- }
+public class ClassDescriptor extends Descriptor {
+ private static int UIDCount=0;
+ private final int classid;
+ String superclass;
+ ClassDescriptor superdesc;
+ boolean hasFlags=false;
+ String packagename;
- public void addMethod(MethodDescriptor md) {
- methods.add(md);
- }
-
- public void setModifiers(Modifiers modifiers) {
- this.modifiers=modifiers;
+ Modifiers modifiers;
+
+ SymbolTable fields;
+ SymbolTable flags;
+ SymbolTable methods;
+
+ public ClassDescriptor(String classname) {
+ this("", classname);
+ }
+
+ public ClassDescriptor(String packagename, String classname) {
+ super(classname);
+ superclass=null;
+ flags=new SymbolTable();
+ fields=new SymbolTable();
+ methods=new SymbolTable();
+ classid=UIDCount++;
+ this.packagename=packagename;
+ }
+
+ public int getId() {
+ return classid;
+ }
+
+ public Iterator getMethods() {
+ return methods.getDescriptorsIterator();
+ }
+
+ public Iterator getFields() {
+ return fields.getDescriptorsIterator();
+ }
+
+ public Iterator getFlags() {
+ return flags.getDescriptorsIterator();
+ }
+
+ public SymbolTable getFieldTable() {
+ return fields;
+ }
+
+ public SymbolTable getFlagTable() {
+ return flags;
+ }
+
+ public SymbolTable getMethodTable() {
+ return methods;
+ }
+
+ public String getSafeDescriptor() {
+ return "L"+safename.replace('.','/');
+ }
+
+ public String printTree(State state) {
+ int indent;
+ String st=modifiers.toString()+"class "+getSymbol();
+ if (superclass!=null)
+ st+="extends "+superclass.toString();
+ st+=" {\n";
+ indent=TreeNode.INDENT;
+ boolean printcr=false;
+
+ for(Iterator it=getFlags(); it.hasNext();) {
+ FlagDescriptor fd=(FlagDescriptor)it.next();
+ st+=TreeNode.printSpace(indent)+fd.toString()+"\n";
+ printcr=true;
}
+ if (printcr)
+ st+="\n";
- public void setName(String name) {
- classname=name;
+ printcr=false;
+
+ for(Iterator it=getFields(); it.hasNext();) {
+ FieldDescriptor fd=(FieldDescriptor)it.next();
+ st+=TreeNode.printSpace(indent)+fd.toString()+"\n";
+ printcr=true;
}
+ if (printcr)
+ st+="\n";
- public void setSuper(NameDescriptor superclass) {
- this.superclass=superclass;
+ for(Iterator it=getMethods(); it.hasNext();) {
+ MethodDescriptor md=(MethodDescriptor)it.next();
+ st+=TreeNode.printSpace(indent)+md.toString()+" ";
+ BlockNode bn=state.getMethodBody(md);
+ st+=bn.printNode(indent)+"\n\n";
}
+ st+="}\n";
+ return st;
+ }
+
+ public void addFlag(FlagDescriptor fd) {
+ if (flags.contains(fd.getSymbol()))
+ throw new Error(fd.getSymbol()+" already defined");
+ hasFlags=true;
+ flags.add(fd);
+ }
+
+ public boolean hasFlags() {
+ return hasFlags||getSuperDesc()!=null&&getSuperDesc().hasFlags();
+ }
+
+ public void addField(FieldDescriptor fd) {
+ if (fields.contains(fd.getSymbol()))
+ throw new Error(fd.getSymbol()+" already defined");
+ fields.add(fd);
+ }
+
+ public void addMethod(MethodDescriptor md) {
+ methods.add(md);
+ }
+
+ public void setModifiers(Modifiers modifiers) {
+ this.modifiers=modifiers;
+ }
+
+ public void setSuper(String superclass) {
+ this.superclass=superclass;
+ }
+
+ public ClassDescriptor getSuperDesc() {
+ return superdesc;
+ }
+
+ public void setSuper(ClassDescriptor scd) {
+ this.superdesc=scd;
+ }
+
+ public String getSuper() {
+ return superclass;
+ }
}