bug fixes with string split and other changes to make a little more sophisticated
[IRC.git] / Robust / src / IR / ClassDescriptor.java
index 504d026d818743121f04a31993f9c49837ac5468..ffae50948e25b34c3e9c113cbe69a5a16eafdad8 100644 (file)
@@ -3,132 +3,147 @@ import java.util.*;
 import IR.Tree.*;
 
 public class ClassDescriptor extends Descriptor {
-    public ClassDescriptor(String classname) {
-       super(classname);
-       this.classname=classname;
-       superclass=null;
-       fields=new SymbolTable();
-       methods=new SymbolTable();
-       classid=UIDCount++;
-    }
-    private static int UIDCount=0; 
-    private final int classid;
-    String classname;
-    String superclass;
-    ClassDescriptor superdesc;
-
-    Modifiers modifiers;
-
-    SymbolTable fields;
-    SymbolTable flags;
-    SymbolTable methods;
-
-    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 "+classname;
-       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";
-
-       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";
-
-       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");
-       flags.add(fd);
-    }
-
-    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 setName(String name) {
-       classname=name;
-    }
-
-    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;
-    }
+  private static int UIDCount=1; // start from 1 instead of 0 for multicore gc
+  private final int classid;
+  String superclass;
+  ClassDescriptor superdesc;
+  boolean hasFlags=false;
+  String packagename;
+
+  Modifiers modifiers;
+
+  SymbolTable fields;
+  Vector fieldvec;
+  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();
+    fieldvec=new Vector();
+    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 Vector getFieldVec() {
+    return fieldvec;
+  }
+
+  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";
+
+    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";
+
+    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);
+    fieldvec.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;
+  }
 }