for(int i=0;i<flags.size();i++) {
FlagEffects fes=(FlagEffects)flags.get(i);
TempDescriptor flagtemp=getTempforVar(fes.getVar());
+ // Process the flags
for(int j=0;j<fes.numEffects();j++) {
FlagEffect fe=fes.getEffect(j);
ffan.addFlagAction(flagtemp, fe.getFlag(), fe.getStatus());
}
+ // Process the tags
+ for(int j=0;j<fes.numTagEffects();j++) {
+ TagEffect te=fes.getTagEffect(j);
+ TempDescriptor tagtemp=getTempforVar(te.getTag());
+
+ ffan.addTagAction(flagtemp, te.getTag().getTag(), tagtemp, te.getStatus());
+ }
}
}
FlatFlagActionNode ffan=new FlatFlagActionNode(FlatFlagActionNode.NEWOBJECT);
FlagEffects fes=con.getFlagEffects();
TempDescriptor flagtemp=out_temp;
- if (fes!=null)
+ if (fes!=null) {
for(int j=0;j<fes.numEffects();j++) {
FlagEffect fe=fes.getEffect(j);
ffan.addFlagAction(flagtemp, fe.getFlag(), fe.getStatus());
- } else {
- ffan.addFlagAction(flagtemp, null, false);
- }
+ }
+ for(int j=0;j<fes.numTagEffects();j++) {
+ TagEffect te=fes.getTagEffect(j);
+ TempDescriptor tagtemp=getTempforVar(te.getTag());
+ ffan.addTagAction(flagtemp, te.getTag().getTag(), tagtemp, te.getStatus());
+ }
+ } else {
+ ffan.addFlagAction(flagtemp, null, false);
+ }
last.addNext(ffan);
last=ffan;
}
}
}
- private TempDescriptor getTempforParam(VarDescriptor vd) {
- if (temptovar.containsKey(vd))
- return (TempDescriptor)temptovar.get(vd);
+ private NodePair flattenTagDeclarationNode(TagDeclarationNode dn) {
+ TagVarDescriptor tvd=dn.getTagVarDescriptor();
+ TagDescriptor tag=tvd.getTag();
+ TempDescriptor tmp=getTempforVar(tvd);
+ FlatTagDeclaration ftd=new FlatTagDeclaration(tag, tmp);
+ return new NodePair(ftd,ftd);
+ }
+
+ private TempDescriptor getTempforParam(Descriptor d) {
+ if (temptovar.containsKey(d))
+ return (TempDescriptor)temptovar.get(d);
else {
- TempDescriptor td=TempDescriptor.paramtempFactory(vd.getName(),vd.getType());
- temptovar.put(vd,td);
- return td;
+ if (d instanceof VarDescriptor) {
+ VarDescriptor vd=(VarDescriptor)d;
+ TempDescriptor td=TempDescriptor.paramtempFactory(vd.getName(),vd.getType());
+ temptovar.put(vd,td);
+ return td;
+ } else if (d instanceof TagVarDescriptor) {
+ TagVarDescriptor tvd=(TagVarDescriptor)d;
+ TempDescriptor td=TempDescriptor.paramtempFactory(tvd.getName(),tvd.getTag());
+ temptovar.put(tvd,td);
+ return td;
+ } else throw new Error("Unreconized Descriptor");
}
}
-
- private TempDescriptor getTempforVar(VarDescriptor vd) {
- if (temptovar.containsKey(vd))
- return (TempDescriptor)temptovar.get(vd);
+
+ private TempDescriptor getTempforVar(Descriptor d) {
+ if (temptovar.containsKey(d))
+ return (TempDescriptor)temptovar.get(d);
else {
- TempDescriptor td=TempDescriptor.tempFactory(vd.getName(),vd.getType());
- temptovar.put(vd,td);
- return td;
+ if (d instanceof VarDescriptor) {
+ VarDescriptor vd=(VarDescriptor)d;
+ TempDescriptor td=TempDescriptor.tempFactory(vd.getName(),vd.getType());
+ temptovar.put(vd,td);
+ return td;
+ } else if (d instanceof TagVarDescriptor) {
+ TagVarDescriptor tvd=(TagVarDescriptor)d;
+ TempDescriptor td=TempDescriptor.tempFactory(tvd.getName(),tvd.getTag());
+ temptovar.put(tvd,td);
+ return td;
+ } else throw new Error("Unrecognized Descriptor");
}
}
case Kind.DeclarationNode:
return flattenDeclarationNode((DeclarationNode)bsn);
+
+ case Kind.TagDeclarationNode:
+ return flattenTagDeclarationNode((TagDeclarationNode)bsn);
case Kind.IfStatementNode:
return flattenIfStatementNode((IfStatementNode)bsn);
package IR.Flat;
import IR.FlagDescriptor;
-import IR.TagVarDescriptor;
+import IR.TagDescriptor;
import java.util.Hashtable;
import java.util.HashSet;
import java.util.Iterator;
tempflagpairs.put(tfp, new Boolean(status));
}
- public void addTagAction(TempDescriptor td, TagVarDescriptor tvd, boolean status) {
- TempTagPair ttp=new TempTagPair(td,tvd);
+ public void addTagAction(TempDescriptor td, TagDescriptor tagd, TempDescriptor tagt, boolean status) {
+ TempTagPair ttp=new TempTagPair(td,tagd, tagt);
if (temptagpairs.containsKey(ttp)) {
throw new Error("Temp/Tag combination used twice: "+ttp);
}
int id;
// String safename;
TypeDescriptor type;
+ TagDescriptor tag;
public TempDescriptor(String name) {
super(name);
this(name);
type=td;
}
+
+ public TempDescriptor(String name, TagDescriptor td) {
+ this(name);
+ tag=td;
+ }
public static TempDescriptor tempFactory() {
return new TempDescriptor("temp_"+currentid);
return new TempDescriptor(name+currentid,td);
}
+ public static TempDescriptor tempFactory(String name, TagDescriptor tag) {
+ return new TempDescriptor(name+currentid,tag);
+ }
+
public static TempDescriptor paramtempFactory(String name, TypeDescriptor td) {
return new TempDescriptor(name,td);
}
+ public static TempDescriptor paramtempFactory(String name, TagDescriptor tag) {
+ return new TempDescriptor(name,tag);
+ }
public String toString() {
return safename;
public TypeDescriptor getType() {
return type;
}
+
+ public TagDescriptor getTag() {
+ return tag;
+ }
}
package IR.Flat;
-import IR.TagVarDescriptor;
+import IR.TagDescriptor;
public class TempTagPair {
- TagVarDescriptor tvd;
+ TagDescriptor tagd;
TempDescriptor td;
+ TempDescriptor tagt;
- public TempTagPair(TempDescriptor td, TagVarDescriptor tvd) {
- this.tvd=tvd;
+ public TempTagPair(TempDescriptor td, TagDescriptor tagd, TempDescriptor tagt) {
+ this.tagd=tagd;
+ this.tagt=tagt;
this.td=td;
}
public int hashCode() {
- if (tvd!=null)
- return tvd.hashCode()^td.hashCode();
- else
- return td.hashCode();
+ return tagd.hashCode()^td.hashCode()^tagt.hashCode();
}
-
+
public TempDescriptor getTemp() {
return td;
}
- public TagVarDescriptor getTag() {
- return tvd;
+ public TagDescriptor getTag() {
+ return tagd;
+ }
+
+ public TempDescriptor getTagTemp() {
+ return tagt;
}
public boolean equals(Object o) {
if (!(o instanceof TempTagPair))
return false;
TempTagPair ttp=(TempTagPair)o;
- return ttp.tvd==tvd&&(ttp.td==td);
+ return ttp.tagd.equals(tagd)&&ttp.tagt==tagt&&ttp.td==td;
}
public String toString() {
- return "<"+tvd+","+td+">";
+ return "<"+td+","+tagd+","+tagt+">";
}
}