package IR;
import IR.Tree.FlagExpressionNode;
+import IR.Tree.TagExpressionList;
import IR.Tree.FlagEffects;
import java.util.Vector;
import java.util.Hashtable;
public class TaskDescriptor extends Descriptor {
protected Hashtable flagstable;
+ protected Hashtable tagstable;
protected Vector vfe;
protected String identifier;
protected Vector params;
this.identifier=identifier;
this.uniqueid=count++;
flagstable=new Hashtable();
+ tagstable=new Hashtable(); //BUGFIX - added initialization here
params=new Vector();
paramtable=new SymbolTable();
}
return paramtable;
}
- public void addParameter(TypeDescriptor type, String paramname, FlagExpressionNode fen) {
+ public void addParameter(TypeDescriptor type, String paramname, FlagExpressionNode fen, TagExpressionList tel) {
if (paramname.equals("this"))
throw new Error("Can't have parameter named this");
VarDescriptor vd=new VarDescriptor(type, paramname);
params.add(vd);
flagstable.put(vd, fen);
+ if (tel!=null) {//BUGFIX - added null check here...test with any bristlecone program
+ tagstable.put(vd, tel);
+ for(int i=0;i<tel.numTags();i++) {
+ TagVarDescriptor tvd=new TagVarDescriptor(new TagDescriptor(tel.getType(i)), tel.getName(i));
+ if (!(paramtable.getFromSameScope(tel.getName(i)) instanceof TagVarDescriptor))
+ throw new Error("Parameter "+paramname+" already defined");
+ paramtable.add(tvd);
+ }
+ }
+
if (paramtable.getFromSameScope(paramname)!=null) {
throw new Error("Parameter "+paramname+" already defined");
}
return (FlagExpressionNode) flagstable.get(vd);
}
+ public TagExpressionList getTag(VarDescriptor vd) {
+ return (TagExpressionList) flagstable.get(vd);
+ }
+
public String toString() {
String st=identifier+"(";
for(int i=0;i<params.size();i++) {