public class RepairGenerator {
State state;
- java.io.PrintWriter outputrepair = null;
- java.io.PrintWriter outputaux = null;
- java.io.PrintWriter outputhead = null;
+ PrintWrapper outputrepair = null;
+ PrintWrapper outputaux = null;
+ PrintWrapper outputhead = null;
String name="foo";
String headername;
static VarDescriptor oldmodel=null;
}
public void generate(OutputStream outputrepair, OutputStream outputaux,OutputStream outputhead, String st) {
- this.outputrepair = new java.io.PrintWriter(outputrepair, true);
- this.outputaux = new java.io.PrintWriter(outputaux, true);
- this.outputhead = new java.io.PrintWriter(outputhead, true);
+ this.outputrepair = new PrintWrapper(new java.io.PrintWriter(outputrepair, true));
+ this.outputaux = new PrintWrapper(new java.io.PrintWriter(outputaux, true));
+ this.outputhead = new PrintWrapper(new java.io.PrintWriter(outputhead, true));
+
headername=st;
name_updates();
generatetypechecks(true);
generate_tokentable();
+ RelationDescriptor.prefix = "thisvar->";
+ SetDescriptor.prefix = "thisvar->";
+
generate_hashtables();
generate_stateobject();
+
+
+ /* Rewrite globals */
+ CodeWriter craux = new StandardCodeWriter(this.outputaux);
+ for (Iterator it=this.state.stGlobals.descriptors();it.hasNext();) {
+ VarDescriptor vd=(VarDescriptor)it.next();
+ craux.outputline("#define "+vd.getSafeSymbol()+" thisvar->"+vd.getSafeSymbol());
+ }
+
+
generate_call();
generate_start();
generate_rules();
generate_checks();
generate_teardown();
CodeWriter crhead = new StandardCodeWriter(this.outputhead);
- CodeWriter craux = new StandardCodeWriter(this.outputaux);
- crhead.outputline("};");
- craux.outputline("}");
+ craux = new StandardCodeWriter(this.outputaux);
+ craux.emptyBuffer();
+ craux.endblock();
if (Compiler.GENERATEDEBUGHOOKS) {
crhead.outputline("void debughook();");
private void generate_updates() {
int count=0;
- CodeWriter crhead = new StandardCodeWriter(outputhead);
- CodeWriter craux = new StandardCodeWriter(outputaux);
+ CodeWriter crhead = new StandardCodeWriter(outputhead);
+ CodeWriter craux = new StandardCodeWriter(outputaux);
RelationDescriptor.prefix = "model->";
SetDescriptor.prefix = "model->";
for (Iterator it=this.state.stGlobals.descriptors();it.hasNext();) {
VarDescriptor vd=(VarDescriptor)it.next();
+ craux.outputline("#undef "+vd.getSafeSymbol());
craux.outputline("#define "+vd.getSafeSymbol()+" "+ststate+"->"+vd.getSafeSymbol());
}
for (int i=0;i<mun.numUpdates();i++) {
UpdateNode un=mun.getUpdate(i);
String methodname=(String)updatenames.get(un);
-
+
switch(mun.op) {
case MultUpdateNode.ADD:
if (isrelation) {
- crhead.outputline("void "+methodname+"("+name+"_state * " +ststate+","+name+" * "+stmodel+", RepairHash * "+strepairtable+", int "+stleft+", int "+stright+");");
- craux.outputline("void "+methodname+"("+name+"_state * "+ ststate+","+name+" * "+stmodel+", RepairHash * "+strepairtable+", int "+stleft+", int "+stright+")");
+ crhead.outputline("void "+methodname+"(struct "+name+"_state * " +ststate+",struct "+name+" * "+stmodel+", struct RepairHash * "+strepairtable+", int "+stleft+", int "+stright+");");
+ craux.outputline("void "+methodname+"(struct "+name+"_state * "+ ststate+", struct "+name+" * "+stmodel+", struct RepairHash * "+strepairtable+", int "+stleft+", int "+stright+")");
} else {
- crhead.outputline("void "+methodname+"("+name+"_state * "+ ststate+","+name+" * "+stmodel+", RepairHash * "+strepairtable+", int "+stleft+");");
- craux.outputline("void "+methodname+"("+name+"_state * "+ststate+","+name+" * "+stmodel+", RepairHash * "+strepairtable+", int "+stleft+")");
+ crhead.outputline("void "+methodname+"(struct "+name+"_state * "+ ststate+", struct "+name+" * "+stmodel+", struct RepairHash * "+strepairtable+", int "+stleft+");");
+ craux.outputline("void "+methodname+"(struct "+name+"_state * "+ststate+", struct "+name+" * "+stmodel+", struct RepairHash * "+strepairtable+", int "+stleft+")");
}
craux.startblock();
- craux.outputline("int maybe=0;");
+ craux.startBuffer();
+ craux.addDeclaration("int","maybe");
+ craux.outputline("maybe=0;");
if (Compiler.GENERATEINSTRUMENT)
craux.outputline("updatecount++;");
- final SymbolTable st = un.getRule().getSymbolTable();
+ final SymbolTable st = un.getRule().getSymbolTable();
CodeWriter cr = new StandardCodeWriter(outputaux) {
public SymbolTable getSymbolTable() { return st; }
};
un.generate(cr, false, false, stleft,stright, null,this);
craux.outputline("if (maybe) printf(\"REALLY BAD\");");
+ craux.emptyBuffer();
craux.endblock();
break;
case MultUpdateNode.REMOVE: {
Rule r=un.getRule();
- String methodcall="void "+methodname+"("+name+"_state * "+ststate+","+name+" * "+stmodel+", RepairHash * "+strepairtable;
+ String methodcall="void "+methodname+"(struct "+name+"_state * "+ststate+", struct "+name+" * "+stmodel+", struct RepairHash * "+strepairtable;
for(int j=0;j<r.numQuantifiers();j++) {
Quantifier q=r.getQuantifier(j);
if (q instanceof SetQuantifier) {
methodcall+=","+sq.getVar().getType().getGenerateType().getSafeSymbol()+" "+sq.getVar().getSafeSymbol();
} else if (q instanceof RelationQuantifier) {
RelationQuantifier rq=(RelationQuantifier) q;
-
+
methodcall+=","+rq.x.getType().getGenerateType().getSafeSymbol()+" "+rq.x.getSafeSymbol();
methodcall+=","+rq.y.getType().getGenerateType().getSafeSymbol()+" "+rq.y.getSafeSymbol();
} else if (q instanceof ForQuantifier) {
crhead.outputline(methodcall+";");
craux.outputline(methodcall);
craux.startblock();
- craux.outputline("int maybe=0;");
+ craux.startBuffer();
+ craux.addDeclaration("int","maybe");
+ craux.outputline("maybe=0;");
if (Compiler.GENERATEINSTRUMENT)
craux.outputline("updatecount++;");
final SymbolTable st2 = un.getRule().getSymbolTable();
};
un.generate(cr2, true, false, null,null, null,this);
craux.outputline("if (maybe) printf(\"REALLY BAD\");");
+ craux.emptyBuffer();
craux.endblock();
}
break;
case MultUpdateNode.MODIFY: {
Rule r=un.getRule();
- String methodcall="void "+methodname+"("+name+"_state * "+ststate+","+name+" * "+stmodel+", RepairHash * "+strepairtable;
+ String methodcall="void "+methodname+"(struct "+name+"_state * "+ststate+", struct "+name+" * "+stmodel+", struct RepairHash * "+strepairtable;
for(int j=0;j<r.numQuantifiers();j++) {
Quantifier q=r.getQuantifier(j);
if (q instanceof SetQuantifier) {
methodcall+=","+sq.getVar().getType().getGenerateType().getSafeSymbol()+" "+sq.getVar().getSafeSymbol();
} else if (q instanceof RelationQuantifier) {
RelationQuantifier rq=(RelationQuantifier) q;
-
+
methodcall+=", "+rq.x.getType().getGenerateType().getSafeSymbol()+" "+rq.x.getSafeSymbol();
methodcall+=", "+rq.y.getType().getGenerateType().getSafeSymbol()+" "+rq.y.getSafeSymbol();
} else if (q instanceof ForQuantifier) {
crhead.outputline(methodcall+";");
craux.outputline(methodcall);
craux.startblock();
+ craux.startBuffer();
craux.outputline("int maybe=0;");
if (Compiler.GENERATEINSTRUMENT)
craux.outputline("updatecount++;");
};
un.generate(cr2, false, true, stleft, stright, stnew, this);
craux.outputline("if (maybe) printf(\"REALLY BAD\");");
+ craux.emptyBuffer();
craux.endblock();
}
break;
}
private void generate_call() {
- CodeWriter cr = new StandardCodeWriter(outputrepair);
+ CodeWriter cr = new StandardCodeWriter(outputrepair);
VarDescriptor vdstate=VarDescriptor.makeNew("repairstate");
- cr.outputline(name+"_state * "+vdstate.getSafeSymbol()+"=new "+name+"_state();");
+ cr.addDeclaration("struct "+ name+"_state *", vdstate.getSafeSymbol());
+ cr.outputline(vdstate.getSafeSymbol()+"=allocate"+name+"_state();");
Iterator globals=state.stGlobals.descriptors();
while (globals.hasNext()) {
VarDescriptor vd=(VarDescriptor) globals.next();
cr.outputline(vdstate.getSafeSymbol()+"->"+vd.getSafeSymbol()+"=("+vd.getType().getGenerateType().getSafeSymbol()+")"+vd.getSafeSymbol()+";");
}
/* Insert repair here */
- cr.outputline(vdstate.getSafeSymbol()+"->doanalysis();");
+ cr.outputline("doanalysis("+vdstate.getSafeSymbol()+");");
globals=state.stGlobals.descriptors();
while (globals.hasNext()) {
VarDescriptor vd=(VarDescriptor) globals.next();
cr.outputline("*(("+vd.getType().getGenerateType().getSafeSymbol()+"*) &"+vd.getSafeSymbol()+")="+vdstate.getSafeSymbol()+"->"+vd.getSafeSymbol()+";");
}
- cr.outputline("delete "+vdstate.getSafeSymbol()+";");
+ cr.outputline("free"+name+"_state("+vdstate.getSafeSymbol()+");");
}
private void generate_tokentable() {
- CodeWriter cr = new StandardCodeWriter(outputrepair);
- Iterator tokens = TokenLiteralExpr.tokens.keySet().iterator();
+ CodeWriter cr = new StandardCodeWriter(outputrepair);
+ Iterator tokens = TokenLiteralExpr.tokens.keySet().iterator();
cr.outputline("");
- cr.outputline("// Token values");
+ cr.outputline("/* Token values*/");
cr.outputline("");
while (tokens.hasNext()) {
Object token = tokens.next();
- cr.outputline("// " + token.toString() + " = " + TokenLiteralExpr.tokens.get(token).toString());
+ cr.outputline("/* " + token.toString() + " = " + TokenLiteralExpr.tokens.get(token).toString()+"*/");
}
cr.outputline("");
private void generate_stateobject() {
CodeWriter crhead = new StandardCodeWriter(outputhead);
- crhead.outputline("class "+name+"_state {");
- crhead.outputline("public:");
+ crhead.outputline("struct "+name+"_state {");
Iterator globals=state.stGlobals.descriptors();
while (globals.hasNext()) {
VarDescriptor vd=(VarDescriptor) globals.next();
crhead.outputline(vd.getType().getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+";");
}
- crhead.outputline("void computesizes(int *,int **);");
- crhead.outputline("void recomputesizes();");
+ crhead.outputline("};");
+ crhead.outputline("void "+name+"_statecomputesizes(struct "+name+"_state * ,int *,int **);");
+ crhead.outputline("void "+name+"_staterecomputesizes(struct "+name+"_state *);");
}
private void generate_computesizes() {
public SymbolTable getSymbolTable() { return st; }
};
- cr.outputline("void "+name+"_state::computesizes(int *sizearray,int **numele) {");
- cr.outputline("int maybe=0;");
+ cr.outputline("void "+name+"_statecomputesizes(struct "+name+"_state * thisvar,int *sizearray,int **numele)");
+ cr.startblock();
+ cr.startBuffer();
+ cr.addDeclaration("int","maybe");
+ cr.outputline("maybe=0;");
for(int i=0;i<max;i++) {
TypeDescriptor td=tdarray[i];
Expr size=td.getSizeExpr();
}
}
cr.outputline("if (maybe) printf(\"BAD ERROR\");");
- cr.outputline("}");
+ cr.emptyBuffer();
+ cr.endblock();
}
private void generate_recomputesizes() {
CodeWriter cr = new StandardCodeWriter(outputaux) {
public SymbolTable getSymbolTable() { return st; }
};
- cr.outputline("void "+name+"_state::recomputesizes() {");
- cr.outputline("int maybe=0;");
+ cr.outputline("void "+name+"_staterecomputesizes(struct "+name+"_state * thisvar)");
+ cr.startblock();
+ cr.startBuffer();
+ cr.addDeclaration("int","maybe");
+ cr.outputline("maybe=0;");
for(int i=0;i<max;i++) {
TypeDescriptor td=tdarray[i];
Expr size=td.getSizeExpr();
}
}
cr.outputline("if (maybe) printf(\"BAD ERROR\");");
- cr.outputline("}");
+ cr.emptyBuffer();
+ cr.endblock();
}
crhead.outputline("#ifndef "+name+"_h");
crhead.outputline("#define "+name+"_h");
crhead.outputline("#include \"SimpleHash.h\"");
- crhead.outputline("extern \"C\" {");
crhead.outputline("#include \"instrument.h\"");
- crhead.outputline("}");
crhead.outputline("#include <stdio.h>");
crhead.outputline("#include <stdlib.h>");
- crhead.outputline("class "+name+" {");
- crhead.outputline("public:");
- crhead.outputline(name+"();");
- crhead.outputline("~"+name+"();");
+ crhead.outputline("struct "+name+" * allocate"+name+"();");
+ crhead.outputline("void free"+name+"(struct "+name+" *);");
+ crhead.outputline("struct "+name+" {");
craux.outputline("#include \""+headername+"\"");
craux.outputline("#include \"size.h\"");
+ if (Compiler.TIME) {
+ craux.outputline("#include <sys/time.h>");
+ }
+ if (Compiler.ALLOCATECPLUSPLUS) {
+ for(Iterator it=state.stTypes.descriptors();it.hasNext();) {
+ TypeDescriptor td=(TypeDescriptor)it.next();
+ if (td instanceof StructureTypeDescriptor) {
+ if (((StructureTypeDescriptor)td).size()>0) {
+ FieldDescriptor fd=((StructureTypeDescriptor)td).get(0);
+ if (fd.getSymbol().startsWith("_vptr_")) {
+ String vtable="_ZTV";
+ vtable+=td.getSymbol().length();
+ vtable+=td.getSymbol();
+ craux.outputline("extern void * "+vtable+";");
+ }
+ }
+ }
+ }
+ }
+ craux.outputline("struct "+ name+"* "+name+"()");
+ craux.startblock();
+ craux.outputline("/* creating hashtables */");
- craux.outputline(name+"::"+name+"() {");
- craux.outputline("// creating hashtables ");
-
/* build sets */
Iterator sets = state.stSets.descriptors();
-
+ craux.addDeclaration("struct "+name+"*", "thisvar");
+ craux.outputline("thisvar=(struct "+name+"*) malloc(sizeof(struct "+name+"));");
+
/* first pass create all the hash tables */
while (sets.hasNext()) {
SetDescriptor set = (SetDescriptor) sets.next();
- crhead.outputline("SimpleHash* " + set.getSafeSymbol() + "_hash;");
- craux.outputline(set.getSafeSymbol() + "_hash = new SimpleHash();");
+ crhead.outputline("struct SimpleHash* " + set.getJustSafeSymbol() + "_hash;");
+ craux.outputline(set.getSafeSymbol() + "_hash = noargallocateSimpleHash();");
}
-
+
/* second pass build relationships between hashtables */
sets = state.stSets.descriptors();
-
+
while (sets.hasNext()) {
SetDescriptor set = (SetDescriptor) sets.next();
Iterator subsets = set.subsets();
-
+
while (subsets.hasNext()) {
- SetDescriptor subset = (SetDescriptor) subsets.next();
- craux.outputline(subset.getSafeSymbol() + "_hash->addParent(" + set.getSafeSymbol() + "_hash);");
+ SetDescriptor subset = (SetDescriptor) subsets.next();
+ craux.outputline("SimpleHashaddParent("+subset.getSafeSymbol() +"_hash ,"+ set.getSafeSymbol() + "_hash);");
}
- }
+ }
/* build relations */
Iterator relations = state.stRelations.descriptors();
-
+
/* first pass create all the hash tables */
while (relations.hasNext()) {
RelationDescriptor relation = (RelationDescriptor) relations.next();
-
+
if (relation.testUsage(RelationDescriptor.IMAGE)) {
- crhead.outputline("SimpleHash* " + relation.getSafeSymbol() + "_hash;");
- craux.outputline(relation.getSafeSymbol() + "_hash = new SimpleHash();");
+ crhead.outputline("struct SimpleHash* " + relation.getJustSafeSymbol() + "_hash;");
+ craux.outputline(relation.getSafeSymbol() + "_hash = noargallocateSimpleHash();");
}
if (relation.testUsage(RelationDescriptor.INVIMAGE)) {
- crhead.outputline("SimpleHash* " + relation.getSafeSymbol() + "_hashinv;");
- craux.outputline(relation.getSafeSymbol() + "_hashinv = new SimpleHash();");
- }
+ crhead.outputline("struct SimpleHash* " + relation.getJustSafeSymbol() + "_hashinv;");
+ craux.outputline(relation.getSafeSymbol() + "_hashinv = noargallocateSimpleHash();");
+ }
}
- craux.outputline("}");
+ craux.endblock();
crhead.outputline("};");
- craux.outputline(name+"::~"+name+"() {");
- craux.outputline("// deleting hashtables");
+ craux.outputline("void free"+name+"(struct "+ name +"* thisvar)");
+ craux.startblock();
+ craux.outputline("/* deleting hashtables */");
/* build destructor */
sets = state.stSets.descriptors();
-
+
/* first pass create all the hash tables */
while (sets.hasNext()) {
SetDescriptor set = (SetDescriptor) sets.next();
- craux.outputline("delete "+set.getSafeSymbol() + "_hash;");
- }
-
+ craux.outputline("freeSimpleHash("+set.getSafeSymbol() + "_hash);");
+ }
+
/* destroy relations */
relations = state.stRelations.descriptors();
-
+
/* first pass create all the hash tables */
while (relations.hasNext()) {
RelationDescriptor relation = (RelationDescriptor) relations.next();
-
+
if (relation.testUsage(RelationDescriptor.IMAGE)) {
- craux.outputline("delete "+relation.getSafeSymbol() + "_hash;");
+ craux.outputline("freeSimpleHash("+relation.getSafeSymbol() + "_hash);");
}
if (relation.testUsage(RelationDescriptor.INVIMAGE)) {
- craux.outputline("delete " + relation.getSafeSymbol() + "_hashinv;");
- }
+ craux.outputline("freeSimpleHash(" + relation.getSafeSymbol() + "_hashinv);");
+ }
}
- craux.outputline("}");
+ craux.outputline("free(thisvar);");
+ craux.endblock();
}
private void generate_start() {
craux.outputline("int rebuildcount;");
craux.outputline("int abstractcount;");
}
-
- crhead.outputline("void doanalysis();");
- craux.outputline("void "+name +"_state::doanalysis()");
+
+ crhead.outputline("void doanalysis(struct "+name+"_state *);");
+ craux.outputline("void doanalysis(struct "+name+"_state * thisvar)");
craux.startblock();
+ craux.startBuffer();
+ if (Compiler.TIME) {
+ craux.outputline("struct timeval _begin_time,_end_time;");
+ craux.outputline("gettimeofday(&_begin_time,NULL);");
+ }
if (Compiler.GENERATEINSTRUMENT) {
craux.outputline("updatecount=0;");
craux.outputline("rebuildcount=0;");
craux.outputline("abstractcount=0;");
}
- craux.outputline("int highmark;");
+ craux.addDeclaration("int","highmark");
+
+ craux.addDeclaration("struct "+name+ " * ",oldmodel.getSafeSymbol());
+ craux.outputline(oldmodel.getSafeSymbol()+"=0;");
+ craux.addDeclaration("struct WorkList * ",worklist.getSafeSymbol());
+ craux.outputline(worklist.getSafeSymbol()+" = allocateWorkList();");
+ craux.addDeclaration("struct RepairHash * ",repairtable.getSafeSymbol());
+ craux.outputline(repairtable.getSafeSymbol()+"=0;");
craux.outputline("initializestack(&highmark);");
- craux.outputline("typeobject *typeobject1=gettypeobject();");
- craux.outputline("typeobject1->computesizes(this);");
- craux.outputline("recomputesizes();");
- craux.outputline(name+ " * "+oldmodel.getSafeSymbol()+"=0;");
- craux.outputline("WorkList * "+worklist.getSafeSymbol()+" = new WorkList();");
- craux.outputline("RepairHash * "+repairtable.getSafeSymbol()+"=0;");
+ craux.outputline("computesizes(thisvar);");
+ craux.outputline(name+"_staterecomputesizes(thisvar);");
craux.outputline("while (1)");
craux.startblock();
- craux.outputline(name+ " * "+newmodel.getSafeSymbol()+"=new "+name+"();");
- craux.outputline(worklist.getSafeSymbol()+"->reset();");
+ craux.addDeclaration("struct "+name+ " * ",newmodel.getSafeSymbol());
+ craux.outputline(newmodel.getSafeSymbol()+"=allocate"+name+"();");
+ craux.outputline("WorkListreset("+worklist.getSafeSymbol()+");");
if (Compiler.GENERATEINSTRUMENT)
craux.outputline("rebuildcount++;");
}
-
+
private void generate_teardown() {
- CodeWriter cr = new StandardCodeWriter(outputaux);
+ CodeWriter cr = new StandardCodeWriter(outputaux);
cr.endblock();
+ if (Compiler.TIME) {
+ cr.outputline("gettimeofday(&_end_time,NULL);");
+ cr.outputline("printf(\"time=%ld uS\\n\",(_end_time.tv_sec-_begin_time.tv_sec)*1000000+_end_time.tv_usec-_begin_time.tv_usec);");
+ }
+
if (Compiler.GENERATEINSTRUMENT) {
cr.outputline("printf(\"updatecount=%d\\n\",updatecount);");
cr.outputline("printf(\"rebuildcount=%d\\n\",rebuildcount);");
}
private void generate_print() {
-
+
final SymbolTable st = new SymbolTable();
CodeWriter cr = new StandardCodeWriter(outputaux) {
public SymbolTable getSymbolTable() { return st; }
};
- cr.outputline("// printing sets!");
+ cr.outputline("/* printing sets!*/");
cr.outputline("printf(\"\\n\\nPRINTING SETS AND RELATIONS\\n\");");
Iterator setiterator = state.stSets.descriptors();
String setname = sd.getSafeSymbol();
cr.startblock();
- cr.outputline("// printing set " + setname);
- cr.outputline("printf(\"\\nPrinting set " + sd.getSymbol() + " - %d elements \\n\", " + setname + "_hash->count());");
- cr.outputline("SimpleIterator __setiterator;");
- cr.outputline("" + setname + "_hash->iterator(__setiterator);");
- cr.outputline("while (__setiterator.hasNext())");
+ cr.outputline("/* printing set " + setname+"*/");
+ cr.outputline("printf(\"\\nPrinting set " + sd.getSymbol() + " - %d elements \\n\", SimpleHashcountset("+setname+"_hash));");
+ cr.addDeclaration("struct SimpleIterator","__setiterator");
+ cr.outputline("SimpleHashiterator("+setname+"_hash,&__setiterator);");
+ cr.outputline("while (hasNext(&__setiterator))");
cr.startblock();
- cr.outputline("int __setval = (int) __setiterator.next();");
+ cr.addDeclaration("int","__setval");
+ cr.outputline("__setval = (int) next(&__setiterator);");
TypeDescriptor td = sd.getType();
if (td instanceof StructureTypeDescriptor) {
VarDescriptor vd = new VarDescriptor ("__setval", "__setval", td, false);
std.generate_printout(cr, vd);
} else { // Missing type descriptor or reserved type, just print int
- cr.outputline("printf(\"<%d> \", __setval);");
+ cr.outputline("printf(\"<%d> \", __setval);");
}
for(int sccindex=0;sccindex<mrd.numSCC();sccindex++) {
ruleset=mrd.getSCC(sccindex);
boolean needworklist=mrd.hasCycle(sccindex);
-
+
if (!needworklist) {
Iterator iterator_rs = ruleset.iterator();
while (iterator_rs.hasNext()) {
InvariantValue ivalue=new InvariantValue();
cr.setInvariantValue(ivalue);
- cr.outputline("// build " +escape(rule.toString()));
+ cr.outputline("/* build " +escape(rule.toString())+"*/");
cr.startblock();
- cr.outputline("int maybe=0;");
+ cr.addDeclaration("int","maybe");
+ cr.outputline("maybe=0;");
Expr ruleexpr=rule.getGuardExpr();
HashSet invariantvars=new HashSet();
invariants.addAll(((RelationInclusion)rule.getInclusion()).getRightExpr().findInvariants(invariantvars));
}
}
- ListIterator quantifiers = rule.quantifiers();
+ ListIterator quantifiers = rule.quantifiers();
while (quantifiers.hasNext()) {
Quantifier quantifier = (Quantifier) quantifiers.next();
if (quantifier instanceof ForQuantifier) {
}
}
+ int openparencount=0;
for(Iterator invit=invariants.iterator();invit.hasNext();) {
Expr invexpr=(Expr)invit.next();
VarDescriptor tmpvd=VarDescriptor.makeNew("tmpvar");
VarDescriptor maybevd=VarDescriptor.makeNew("maybevar");
invexpr.generate(cr,tmpvd);
- cr.outputline("int "+maybevd.getSafeSymbol()+"=maybe;");
+ cr.addDeclaration("int ",maybevd.getSafeSymbol());
+ cr.outputline(maybevd.getSafeSymbol()+"=maybe;");
cr.outputline("maybe=0;");
ivalue.assignPair(invexpr,tmpvd,maybevd);
+ openparencount++;
+ cr.startblock();
}
-
quantifiers = rule.quantifiers();
while (quantifiers.hasNext()) {
Quantifier quantifier = (Quantifier) quantifiers.next();
quantifier.generate_open(cr);
}
-
+
/* pretty print! */
- cr.output("//");
+ cr.output("/*");
rule.getGuardExpr().prettyPrint(cr);
- cr.outputline("");
-
+ cr.outputline("*/");
+
/* now we have to generate the guard test */
VarDescriptor guardval = VarDescriptor.makeNew();
rule.getGuardExpr().generate(cr, guardval);
cr.outputline("if (" + guardval.getSafeSymbol() + ")");
cr.startblock();
-
+
/* now we have to generate the inclusion code */
currentrule=rule;
rule.getInclusion().generate(cr);
cr.endblock();
}
cr.endblock();
+ while((openparencount--)>0)
+ cr.endblock();
cr.outputline("");
cr.outputline("");
}
}
} else {
CodeWriter cr2 = new StandardCodeWriter(outputaux);
-
+
for(Iterator initialworklist=ruleset.iterator();initialworklist.hasNext();) {
/** Construct initial worklist set */
Rule rule=(Rule)initialworklist.next();
- cr2.outputline(worklist.getSafeSymbol()+"->add("+rule.getNum()+",-1,0,0);");
+ cr2.outputline("WorkListadd("+worklist.getSafeSymbol()+","+rule.getNum()+",-1,0,0);");
}
- cr2.outputline("while ("+worklist.getSafeSymbol()+"->hasMoreElements())");
+ cr2.outputline("while (WorkListhasMoreElements("+worklist.getSafeSymbol()+"))");
cr2.startblock();
VarDescriptor idvar=VarDescriptor.makeNew("id");
- cr2.outputline("int "+idvar.getSafeSymbol()+"="+worklist.getSafeSymbol()+"->getid();");
-
+ cr2.addDeclaration("int ",idvar.getSafeSymbol());
+ cr2.outputline(idvar.getSafeSymbol()+"=WorkListgetid("+worklist.getSafeSymbol()+");");
+
String elseladder = "if";
-
+
Iterator iterator_rules = ruleset.iterator();
while (iterator_rules.hasNext()) {
-
+
Rule rule = (Rule) iterator_rules.next();
int dispatchid = rule.getNum();
-
+
{
final SymbolTable st = rule.getSymbolTable();
CodeWriter cr = new StandardCodeWriter(outputaux) {
public SymbolTable getSymbolTable() { return st; }
};
-
+
cr.indent();
cr.outputline(elseladder + " ("+idvar.getSafeSymbol()+" == " + dispatchid + ")");
cr.startblock();
- cr.outputline("int maybe=0;");
+ cr.addDeclaration("int","maybe");
+ cr.outputline("maybe=0;");
VarDescriptor typevar=VarDescriptor.makeNew("type");
VarDescriptor leftvar=VarDescriptor.makeNew("left");
VarDescriptor rightvar=VarDescriptor.makeNew("right");
- cr.outputline("int "+typevar.getSafeSymbol()+"="+worklist.getSafeSymbol()+"->gettype();");
- cr.outputline("int "+leftvar.getSafeSymbol()+"="+worklist.getSafeSymbol()+"->getlvalue();");
- cr.outputline("int "+rightvar.getSafeSymbol()+"="+worklist.getSafeSymbol()+"->getrvalue();");
- cr.outputline("// build " +escape(rule.toString()));
-
-
+ cr.addDeclaration("int",typevar.getSafeSymbol());
+ cr.outputline(typevar.getSafeSymbol()+"= WorkListgettype("+worklist.getSafeSymbol()+");");
+ cr.addDeclaration("int",leftvar.getSafeSymbol());
+ cr.outputline(leftvar.getSafeSymbol()+"= WorkListgetlvalue("+worklist.getSafeSymbol()+");");
+ cr.addDeclaration("int",rightvar.getSafeSymbol());
+ cr.outputline(rightvar.getSafeSymbol()+"= WorkListgetrvalue("+worklist.getSafeSymbol()+");");
+ cr.outputline("/* build " +escape(rule.toString())+"*/");
+
+
for (int j=0;j<rule.numQuantifiers();j++) {
Quantifier quantifier = rule.getQuantifier(j);
quantifier.generate_open(cr, typevar.getSafeSymbol(),j,leftvar.getSafeSymbol(),rightvar.getSafeSymbol());
}
-
+
/* pretty print! */
- cr.output("//");
-
+ cr.output("/*");
+
rule.getGuardExpr().prettyPrint(cr);
- cr.outputline("");
-
+ cr.outputline("*/");
+
/* now we have to generate the guard test */
-
+
VarDescriptor guardval = VarDescriptor.makeNew();
rule.getGuardExpr().generate(cr, guardval);
-
+
cr.outputline("if (" + guardval.getSafeSymbol() + ")");
cr.startblock();
-
+
/* now we have to generate the inclusion code */
currentrule=rule;
rule.getInclusion().generate(cr);
cr.endblock();
-
+
for (int j=0;j<rule.numQuantifiers();j++) {
cr.endblock();
}
-
+
// close startblocks generated by DotExpr memory checks
//DotExpr.generate_memory_endblocks(cr);
-
+
cr.endblock(); // end else-if WORKLIST ladder
-
+
elseladder = "else if";
}
}
cr2.outputline("exit(1);");
cr2.endblock();
// end block created for worklist
- cr2.outputline(worklist.getSafeSymbol()+"->pop();");
+ cr2.outputline("WorkListpop("+worklist.getSafeSymbol()+");");
cr2.endblock();
}
}
constraint= (Constraint) ((GraphNode)i.next()).getOwner();
else
constraint=(Constraint)i.next();
-
+
{
final SymbolTable st = constraint.getSymbolTable();
CodeWriter cr = new StandardCodeWriter(outputaux);
cr.pushSymbolTable(constraint.getSymbolTable());
- cr.outputline("// checking " + escape(constraint.toString()));
+ cr.outputline("/* checking " + escape(constraint.toString())+"*/");
cr.startblock();
ListIterator quantifiers = constraint.quantifiers();
quantifier.generate_open(cr);
}
- cr.outputline("int maybe = 0;");
-
+ cr.addDeclaration("int","maybe");
+ cr.outputline("maybe = 0;");
+
/* now we have to generate the guard test */
-
+
VarDescriptor constraintboolean = VarDescriptor.makeNew("constraintboolean");
constraint.getLogicStatement().generate(cr, constraintboolean);
-
+
cr.outputline("if (maybe)");
cr.startblock();
cr.outputline("printf(\"maybe fail " + escape(constraint.toString()) + ". \\n\");");
cr.startblock();
if (!Compiler.REPAIR||Compiler.GENERATEDEBUGHOOKS)
cr.outputline("printf(\"fail " + escape(constraint.toString()) + ". \\n\");");
-
+
if (Compiler.REPAIR) {
/* Do repairs */
/* Build new repair table */
+
cr.outputline("if ("+repairtable.getSafeSymbol()+")");
- cr.outputline("delete "+repairtable.getSafeSymbol()+";");
- cr.outputline(repairtable.getSafeSymbol()+"=new RepairHash();");
-
+ cr.outputline("freeRepairHash("+repairtable.getSafeSymbol()+");");
+ cr.outputline(repairtable.getSafeSymbol()+"=noargallocateRepairHash();");
+
if (Compiler.GENERATEDEBUGHOOKS)
cr.outputline("debughook();");
/* Compute cost of each repair */
dnfconst.addAll((Set)termination.conjunctionmap.get(constraint));
if (dnfconst.size()<=1) {
- cr.outputline("int "+mincostindex.getSafeSymbol()+"=0;");
+ cr.addDeclaration("int",mincostindex.getSafeSymbol());
+ cr.outputline(mincostindex.getSafeSymbol()+"=0;");
}
if (dnfconst.size()>1) {
- cr.outputline("int "+mincostindex.getSafeSymbol()+";");
+ cr.addDeclaration("int",mincostindex.getSafeSymbol());
boolean first=true;
for(int j=0;j<dnfconst.size();j++) {
GraphNode gn=(GraphNode)dnfconst.get(j);
Conjunction conj=((TermNode)gn.getOwner()).getConjunction();
if (removed.contains(gn))
continue;
-
+
VarDescriptor costvar;
if (first) {
costvar=mincost;
boolean negate=dpred.isNegated();
VarDescriptor predvalue=VarDescriptor.makeNew("Predicatevalue");
p.generate(cr,predvalue);
- if (k==0)
- cr.outputline("int "+costvar.getSafeSymbol()+"=0;");
-
+ if (k==0) {
+ cr.addDeclaration("int",costvar.getSafeSymbol());
+ cr.outputline(costvar.getSafeSymbol()+"=0;");
+ }
if (negate)
cr.outputline("if (maybe||"+predvalue.getSafeSymbol()+")");
else
cr.outputline("if (maybe||!"+predvalue.getSafeSymbol()+")");
cr.outputline(costvar.getSafeSymbol()+"+="+cost.getCost(dpred)+";");
}
-
+
if(!first) {
cr.outputline("if ("+costvar.getSafeSymbol()+"<"+mincost.getSafeSymbol()+")");
cr.startblock();
first=false;
}
}
- cr.outputline("switch("+mincostindex.getSafeSymbol()+") {");
+ cr.outputline("switch("+mincostindex.getSafeSymbol()+")");
+ cr.startblock();
for(int j=0;j<dnfconst.size();j++) {
GraphNode gn=(GraphNode)dnfconst.get(j);
Conjunction conj=((TermNode)gn.getOwner()).getConjunction();
cr.endblock();
cr.outputline("break;");
}
- cr.outputline("}");
-
+ cr.endblock();
+
cr.outputline("if ("+oldmodel.getSafeSymbol()+")");
- cr.outputline("delete "+oldmodel.getSafeSymbol()+";");
+ cr.outputline("free"+name+"("+oldmodel.getSafeSymbol()+");");
cr.outputline(oldmodel.getSafeSymbol()+"="+newmodel.getSafeSymbol()+";");
cr.outputline("goto rebuild;"); /* Rebuild model and all */
}
cr.endblock();
-
+
while (quantifiers.hasPrevious()) {
Quantifier quantifier = (Quantifier) quantifiers.previous();
cr.endblock();
CodeWriter cr = new StandardCodeWriter(outputaux);
cr.startblock();
cr.outputline("if ("+repairtable.getSafeSymbol()+")");
- cr.outputline("delete "+repairtable.getSafeSymbol()+";");
+ cr.outputline("freeRepairHash("+repairtable.getSafeSymbol()+");");
cr.outputline("if ("+oldmodel.getSafeSymbol()+")");
- cr.outputline("delete "+oldmodel.getSafeSymbol()+";");
- cr.outputline("delete "+newmodel.getSafeSymbol()+";");
- cr.outputline("delete "+worklist.getSafeSymbol()+";");
+ cr.outputline("free"+name+"("+oldmodel.getSafeSymbol()+");");
+ cr.outputline("free"+name+"("+newmodel.getSafeSymbol()+");");
+ cr.outputline("freeWorkList("+worklist.getSafeSymbol()+");");
cr.outputline("resettypemap();");
cr.outputline("break;");
cr.endblock();
cr.outputline("rebuild:");
- cr.outputline(";");
+ cr.outputline(";");
}
-
+
private MultUpdateNode getmultupdatenode(Conjunction conj, DNFPredicate dpred, int repairtype) {
Set nodes=getmultupdatenodeset(conj,dpred,repairtype);
Iterator it=nodes.iterator();
private Set getmultupdatenodeset(Conjunction conj, DNFPredicate dpred, int repairtype) {
HashSet hs=new HashSet();
- MultUpdateNode mun=null;
GraphNode gn=(GraphNode) termination.conjtonodemap.get(conj);
- for(Iterator edgeit=gn.edges();(mun==null)&&edgeit.hasNext();) {
+ for(Iterator edgeit=gn.edges();edgeit.hasNext();) {
GraphNode gn2=((GraphNode.Edge) edgeit.next()).getTarget();
TermNode tn2=(TermNode)gn2.getOwner();
if (tn2.getType()==TermNode.ABSTRACT) {
if (!removed.contains(gn3)) {
TermNode tn3=(TermNode)gn3.getOwner();
if (tn3.getType()==TermNode.UPDATE) {
- hs.add(mun);
+ hs.add(tn3.getUpdate());
}
}
}
MultUpdateNode mun=(MultUpdateNode)it.next();
if (mun.getType()==MultUpdateNode.ADD) {
munadd=mun;
- } else if (mun.getType()==MultUpdateNode.REMOVE) {
+ } else if (mun.getType()==MultUpdateNode.REMOVE) {
munremove=mun;
} else if (mun.getType()==MultUpdateNode.MODIFY) {
munmodify=mun;
}
}
-
+
ExprPredicate ep=(ExprPredicate)dpred.getPredicate();
RelationDescriptor rd=(RelationDescriptor)ep.getDescriptor();
boolean usageimage=rd.testUsage(RelationDescriptor.IMAGE);
VarDescriptor leftside=VarDescriptor.makeNew("leftside");
VarDescriptor rightside=VarDescriptor.makeNew("rightside");
VarDescriptor newvalue=VarDescriptor.makeNew("newvalue");
- if (!inverted) {
+ boolean needremoveloop=ar.mayNeedFunctionEnforcement(state)&&ar.needsRemoves(state);
+
+ if (needremoveloop&&((munadd==null)||(munremove==null))) {
+ System.out.println("Warning: need to have individual remove operations for"+dpred.name());
+ needremoveloop=false;
+ }
+ if (needremoveloop) {
+ cr.outputline("while (1)");
+ cr.startblock();
+ }
+ if (!inverted) {
((RelationExpr)expr.getLeftExpr()).getExpr().generate(cr,leftside);
expr.getRightExpr().generate(cr,newvalue);
- cr.outputline(rd.getRange().getType().getGenerateType().getSafeSymbol()+" "+rightside.getSafeSymbol()+";");
- cr.outputline(rd.getSafeSymbol()+"_hash->get("+leftside.getSafeSymbol()+","+rightside.getSafeSymbol()+");");
+ cr.addDeclaration(rd.getRange().getType().getGenerateType().getSafeSymbol(),rightside.getSafeSymbol());
+ cr.outputline("SimpleHashget("+rd.getSafeSymbol()+"_hash,"+leftside.getSafeSymbol()+", &"+rightside.getSafeSymbol()+");");
} else {
((RelationExpr)expr.getLeftExpr()).getExpr().generate(cr,rightside);
expr.getRightExpr().generate(cr,newvalue);
cr.outputline(rd.getDomain().getType().getGenerateType().getSafeSymbol()+" "+leftside.getSafeSymbol()+";");
- cr.outputline(rd.getSafeSymbol()+"_hashinv->get("+rightside.getSafeSymbol()+","+leftside.getSafeSymbol()+");");
+ cr.outputline("SimpleHashget("+rd.getSafeSymbol()+"_hashinv,"+rightside.getSafeSymbol()+", &"+leftside.getSafeSymbol()+");");
}
- if (negated)
- if (opcode==Opcode.GT) {
- opcode=Opcode.LE;
- } else if (opcode==Opcode.GE) {
- opcode=Opcode.LT;
- } else if (opcode==Opcode.LT) {
- opcode=Opcode.GE;
- } else if (opcode==Opcode.LE) {
- opcode=Opcode.GT;
- } else if (opcode==Opcode.EQ) {
- opcode=Opcode.NE;
- } else if (opcode==Opcode.NE) {
- opcode=Opcode.EQ;
- } else {
- throw new Error("Unrecognized Opcode");
- }
+
+ opcode=Opcode.translateOpcode(negated,opcode);
if (opcode==Opcode.GT) {
cr.outputline(newvalue.getSafeSymbol()+"++;");
}
/* Do abstract repairs */
if (usageimage) {
- cr.outputline(rd.getSafeSymbol()+"_hash->remove("+leftside.getSafeSymbol()+","+rightside.getSafeSymbol()+");");
+ cr.outputline("SimpleHashremove("+rd.getSafeSymbol()+"_hash, "+leftside.getSafeSymbol()+","+rightside.getSafeSymbol()+");");
+ }
+ if (usageinvimage) {
+ cr.outputline("SimpleHashremove("+rd.getSafeSymbol()+"_hashinv, "+rightside.getSafeSymbol()+","+leftside.getSafeSymbol()+");");
+ }
+
+ if (needremoveloop) {
if (!inverted) {
- cr.outputline(rd.getSafeSymbol()+"_hash->add("+leftside.getSafeSymbol()+","+newvalue.getSafeSymbol()+");");
+ cr.outputline("if (SimpleHashcontainskey("+rd.getSafeSymbol()+"_hash, "+leftside.getSafeSymbol()+"))");
+ cr.startblock();
} else {
- cr.outputline(rd.getSafeSymbol()+"_hash->add("+newvalue.getSafeSymbol()+","+rightside.getSafeSymbol()+");");
+ cr.outputline("if (SimpleHashcontainskey("+rd.getSafeSymbol()+"_hashinv, "+rightside.getSafeSymbol()+"))");
+ cr.startblock();
+ }
+ for(int i=0;i<state.vRules.size();i++) {
+ Rule r=(Rule)state.vRules.get(i);
+ if (r.getInclusion().getTargetDescriptors().contains(rd)) {
+ for(int j=0;j<munremove.numUpdates();j++) {
+ UpdateNode un=munremove.getUpdate(i);
+ if (un.getRule()==r) {
+ /* Update for rule r */
+ String name=(String)updatenames.get(un);
+ cr.outputline("RepairHashaddrelation("+repairtable.getSafeSymbol()+","+rd.getNum()+","+r.getNum()+","+leftside.getSafeSymbol()+","+rightside.getSafeSymbol()+",(int) &"+name+");");
+ }
+ }
+ }
+ }
+ cr.outputline("continue;");
+ cr.endblock();
+ }
+
+ if (usageimage) {
+ if (!inverted) {
+ cr.outputline("SimpleHashadd("+rd.getSafeSymbol()+"_hash,"+leftside.getSafeSymbol()+","+newvalue.getSafeSymbol()+");");
+ } else {
+ cr.outputline("SimpleHashadd("+rd.getSafeSymbol()+"_hash, "+newvalue.getSafeSymbol()+","+rightside.getSafeSymbol()+");");
}
}
if (usageinvimage) {
- cr.outputline(rd.getSafeSymbol()+"_hashinv->remove("+rightside.getSafeSymbol()+","+leftside.getSafeSymbol()+");");
if (!inverted) {
- cr.outputline(rd.getSafeSymbol()+"_hashinv->add("+newvalue.getSafeSymbol()+","+leftside.getSafeSymbol()+");");
+ cr.outputline("SimpleHashadd("+rd.getSafeSymbol()+"_hashinv, "+newvalue.getSafeSymbol()+","+leftside.getSafeSymbol()+");");
} else {
- cr.outputline(rd.getSafeSymbol()+"_hashinv->add("+rightside.getSafeSymbol()+","+newvalue.getSafeSymbol()+");");
+ cr.outputline("SimpleHashadd("+rd.getSafeSymbol()+"_hashinv,"+rightside.getSafeSymbol()+","+newvalue.getSafeSymbol()+");");
}
}
/* Do concrete repairs */
- if (munmodify!=null) {
+ if (munmodify!=null&&(!ar.mayNeedFunctionEnforcement(state))||(munadd==null)||(ar.needsRemoves(state)&&(munremove==null))) {
for(int i=0;i<state.vRules.size();i++) {
Rule r=(Rule)state.vRules.get(i);
if (r.getInclusion().getTargetDescriptors().contains(rd)) {
if (un.getRule()==r) {
/* Update for rule r */
String name=(String)updatenames.get(un);
- cr.outputline(repairtable.getSafeSymbol()+"->addrelation("+rd.getNum()+","+r.getNum()+","+leftside.getSafeSymbol()+","+rightside.getSafeSymbol()+",(int) &"+name+","+newvalue.getSafeSymbol()+");");
+ cr.outputline("RepairHashaddrelation2("+repairtable.getSafeSymbol()+","+rd.getNum()+","+r.getNum()+","+leftside.getSafeSymbol()+","+rightside.getSafeSymbol()+",(int) &"+name+","+newvalue.getSafeSymbol()+");");
}
}
}
if (un.getRule()==r) {
/* Update for rule r */
String name=(String)updatenames.get(un);
- cr.outputline(repairtable.getSafeSymbol()+"->addrelation("+rd.getNum()+","+r.getNum()+","+leftside.getSafeSymbol()+","+rightside.getSafeSymbol()+",(int) &"+name+");");
+ cr.outputline("RepairHashaddrelation("+repairtable.getSafeSymbol()+","+rd.getNum()+","+r.getNum()+","+leftside.getSafeSymbol()+","+rightside.getSafeSymbol()+",(int) &"+name+");");
}
}
}
UpdateNode un=munadd.getUpdate(0);
String name=(String)updatenames.get(un);
if (!inverted) {
- cr.outputline(name+"(this,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+leftside.getSafeSymbol()+","+newvalue.getSafeSymbol()+");");
+ cr.outputline(name+"(thisvar,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+leftside.getSafeSymbol()+","+newvalue.getSafeSymbol()+");");
} else {
- cr.outputline(name+"(this,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+newvalue.getSafeSymbol()+","+rightside.getSafeSymbol()+");");
+ cr.outputline(name+"(thisvar,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+newvalue.getSafeSymbol()+","+rightside.getSafeSymbol()+");");
}
}
+ if (needremoveloop) {
+ cr.outputline("break;");
+ cr.endblock();
+ }
}
public void generatesizerepair(Conjunction conj, DNFPredicate dpred, CodeWriter cr) {
VarDescriptor sizevar=VarDescriptor.makeNew("size");
((OpExpr)expr).left.generate(cr, sizevar);
VarDescriptor change=VarDescriptor.makeNew("change");
- cr.outputline("int "+change.getSafeSymbol()+";");
+ cr.addDeclaration("int",change.getSafeSymbol());
boolean generateadd=false;
boolean generateremove=false;
if (opcode==Opcode.GT) {
cr.outputline(change.getSafeSymbol()+"="+String.valueOf(size)+"-"+sizevar.getSafeSymbol()+";");
if (size==0)
generateadd=false;
- else
+ else
generateadd=true;
generateremove=true;
} else if (opcode==Opcode.NE) {
// In some cases the analysis has determined that generating removes
// is unnecessary
- if (generateremove&&munremove==null)
+ if (generateremove&&munremove==null)
generateremove=false;
Descriptor d=ep.getDescriptor();
VarDescriptor rightvar=VarDescriptor.makeNew("rightvar");
if (d instanceof RelationDescriptor) {
if (ep.inverted()) {
- rightvar=((ImageSetExpr)((SizeofExpr)((OpExpr)expr).left).setexpr).getVar();
- cr.outputline("int "+leftvar.getSafeSymbol()+";");
- cr.outputline(d.getSafeSymbol()+"_hashinv->get((int)"+rightvar.getSafeSymbol()+","+leftvar.getSafeSymbol()+");");
+ ((ImageSetExpr)((SizeofExpr)expr.left).setexpr).generate_leftside(cr,rightvar);
+ cr.addDeclaration("int",leftvar.getSafeSymbol());
+ cr.outputline("SimpleHashget("+d.getSafeSymbol()+"_hashinv,(int)"+rightvar.getSafeSymbol()+", &"+leftvar.getSafeSymbol()+");");
} else {
- leftvar=((ImageSetExpr)((SizeofExpr)((OpExpr)expr).left).setexpr).getVar();
- cr.outputline("int "+rightvar.getSafeSymbol()+"=0;");
- cr.outputline(d.getSafeSymbol()+"_hash->get((int)"+leftvar.getSafeSymbol()+","+rightvar.getSafeSymbol()+");");
+ ((ImageSetExpr)((SizeofExpr)expr.left).setexpr).generate_leftside(cr,leftvar);
+ cr.addDeclaration("int",rightvar.getSafeSymbol());
+ cr.outputline("SimpleHashget("+d.getSafeSymbol()+"_hash ,(int)"+leftvar.getSafeSymbol()+", &"+rightvar.getSafeSymbol()+");");
}
} else {
- cr.outputline("int "+leftvar.getSafeSymbol()+"="+d.getSafeSymbol()+"_hash->firstkey();");
+ cr.addDeclaration("int",leftvar.getSafeSymbol());
+ cr.outputline(leftvar.getSafeSymbol()+"= SimpleHashfirstkey("+d.getSafeSymbol()+"_hash);");
}
/* Generate abstract remove instruction */
if (d instanceof RelationDescriptor) {
boolean usageimage=rd.testUsage(RelationDescriptor.IMAGE);
boolean usageinvimage=rd.testUsage(RelationDescriptor.INVIMAGE);
if (usageimage)
- cr.outputline(rd.getSafeSymbol() + "_hash->remove((int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");");
+ cr.outputline("SimpleHashremove("+rd.getSafeSymbol()+"_hash, (int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");");
if (usageinvimage)
- cr.outputline(rd.getSafeSymbol() + "_hashinv->remove((int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
+ cr.outputline("SimpleHashremove("+rd.getSafeSymbol()+"_hashinv ,(int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
} else {
- cr.outputline(d.getSafeSymbol() + "_hash->remove((int)" + leftvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
+ cr.outputline("SimpleHashremove("+d.getSafeSymbol()+"_hash, (int)" + leftvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
}
/* Generate concrete remove instruction */
for(int i=0;i<state.vRules.size();i++) {
/* Update for rule rule r */
String name=(String)updatenames.get(un);
if (d instanceof RelationDescriptor) {
- cr.outputline(repairtable.getSafeSymbol()+"->addrelation("+d.getNum()+","+r.getNum()+","+leftvar.getSafeSymbol()+","+rightvar.getSafeSymbol()+",(int) &"+name+");");
+ cr.outputline("RepairHashaddrelation("+repairtable.getSafeSymbol()+","+d.getNum()+","+r.getNum()+","+leftvar.getSafeSymbol()+","+rightvar.getSafeSymbol()+",(int) &"+name+");");
} else {
- cr.outputline(repairtable.getSafeSymbol()+"->addset("+d.getNum()+","+r.getNum()+","+leftvar.getSafeSymbol()+",(int) &"+name+");");
+ cr.outputline("RepairHashaddset("+repairtable.getSafeSymbol()+","+d.getNum()+","+r.getNum()+","+leftvar.getSafeSymbol()+",(int) &"+name+");");
}
}
}
}
cr.endblock();
}
+
+// In some cases the analysis has determined that generating removes
+// is unnecessary
+ if (generateadd&&munadd==null)
+ generateadd=false;
+
if (generateadd) {
cr.outputline("for(;"+change.getSafeSymbol()+">0;"+change.getSafeSymbol()+"--)");
cr.startblock();
VarDescriptor newobject=VarDescriptor.makeNew("newobject");
if (d instanceof RelationDescriptor) {
- VarDescriptor otherside=((ImageSetExpr)((SizeofExpr)((OpExpr)ep.expr).left).setexpr).vd;
+ VarDescriptor otherside=VarDescriptor.makeNew("otherside");
+ ((ImageSetExpr)((SizeofExpr)expr.left).setexpr).generate_leftside(cr,otherside);
+
RelationDescriptor rd=(RelationDescriptor)d;
if (termination.sources.relsetSource(rd,!ep.inverted())) {
/* Set Source */
SetDescriptor sd=termination.sources.relgetSourceSet(rd,!ep.inverted());
VarDescriptor iterator=VarDescriptor.makeNew("iterator");
- cr.outputline(sd.getType().getGenerateType().getSafeSymbol() +" "+newobject.getSafeSymbol()+";");
- cr.outputline("SimpleIterator "+iterator.getSafeSymbol()+";");
- cr.outputline("for("+sd.getSafeSymbol()+"_hash->iterator("+ iterator.getSafeSymbol() +");"+iterator.getSafeSymbol()+".hasNext();)");
+ cr.addDeclaration(sd.getType().getGenerateType().getSafeSymbol(),newobject.getSafeSymbol());
+ cr.addDeclaration("struct SimpleIterator",iterator.getSafeSymbol());
+ cr.outputline("for(SimpleHashiterator("+sd.getSafeSymbol()+"_hash , &"+ iterator.getSafeSymbol() +"); hasNext(&"+iterator.getSafeSymbol()+");)");
cr.startblock();
if (ep.inverted()) {
- cr.outputline("if (!"+rd.getSafeSymbol()+"_hashinv->contains("+iterator.getSafeSymbol()+".key(),"+otherside.getSafeSymbol()+"))");
+ cr.outputline("if (!SimpleHashcontainskeydata("+rd.getSafeSymbol()+"_hashinv,"+iterator.getSafeSymbol()+".key(),"+otherside.getSafeSymbol()+"))");
} else {
- cr.outputline("if (!"+rd.getSafeSymbol()+"_hash->contains("+otherside.getSafeSymbol()+","+iterator.getSafeSymbol()+".key()))");
+ cr.outputline("if (!SimpleHashcontainskeydata("+rd.getSafeSymbol()+"_hash, "+otherside.getSafeSymbol()+","+iterator.getSafeSymbol()+".key()))");
}
- cr.outputline(newobject.getSafeSymbol()+"="+iterator.getSafeSymbol()+".key();");
- cr.outputline(iterator.getSafeSymbol()+".next();");
+ cr.outputline(newobject.getSafeSymbol()+"=key(&"+iterator.getSafeSymbol()+");");
+ cr.outputline("next(&"+iterator.getSafeSymbol()+");");
cr.endblock();
} else if (termination.sources.relallocSource(rd,!ep.inverted())) {
/* Allocation Source*/
boolean usageimage=rd.testUsage(RelationDescriptor.IMAGE);
boolean usageinvimage=rd.testUsage(RelationDescriptor.INVIMAGE);
if (usageimage)
- cr.outputline(rd.getSafeSymbol()+"_hash->add("+newobject.getSafeSymbol()+","+otherside.getSafeSymbol()+");");
+ cr.outputline("SimpleHashadd("+rd.getSafeSymbol()+"_hash, "+newobject.getSafeSymbol()+","+otherside.getSafeSymbol()+");");
if (usageinvimage)
- cr.outputline(rd.getSafeSymbol()+"_hashinv->add("+otherside.getSafeSymbol()+","+newobject.getSafeSymbol()+");");
+ cr.outputline("SimpleHashadd("+rd.getSafeSymbol()+"_hashinv, "+otherside.getSafeSymbol()+","+newobject.getSafeSymbol()+");");
UpdateNode un=munadd.getUpdate(0);
String name=(String)updatenames.get(un);
- cr.outputline(name+"(this,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+newobject.getSafeSymbol()+","+otherside.getSafeSymbol()+");");
+ cr.outputline(name+"(thisvar,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+newobject.getSafeSymbol()+","+otherside.getSafeSymbol()+");");
} else {
boolean usageimage=rd.testUsage(RelationDescriptor.IMAGE);
boolean usageinvimage=rd.testUsage(RelationDescriptor.INVIMAGE);
if (usageimage)
- cr.outputline(rd.getSafeSymbol()+"_hash->add("+otherside.getSafeSymbol()+","+newobject.getSafeSymbol()+");");
+ cr.outputline("SimpleHashadd("+rd.getSafeSymbol()+"_hash, "+otherside.getSafeSymbol()+","+newobject.getSafeSymbol()+");");
if (usageinvimage)
- cr.outputline(rd.getSafeSymbol()+"_hashinv->add("+newobject.getSafeSymbol()+","+otherside.getSafeSymbol()+");");
+ cr.outputline("SimpleHashadd("+rd.getSafeSymbol()+"_hashinv, "+newobject.getSafeSymbol()+","+otherside.getSafeSymbol()+");");
UpdateNode un=munadd.getUpdate(0);
String name=(String)updatenames.get(un);
- cr.outputline(name+"(this,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+otherside.getSafeSymbol()+","+newobject.getSafeSymbol()+");");
+ cr.outputline(name+"(thisvar, "+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+otherside.getSafeSymbol()+","+newobject.getSafeSymbol()+");");
}
} else {
SetDescriptor sd=(SetDescriptor)d;
/* Set Source */
SetDescriptor sourcesd=termination.sources.getSourceSet(sd);
VarDescriptor iterator=VarDescriptor.makeNew("iterator");
- cr.outputline(sourcesd.getType().getGenerateType().getSafeSymbol() +" "+newobject.getSafeSymbol()+";");
- cr.outputline("SimpleIterator "+iterator.getSafeSymbol()+";");
- cr.outputline("for("+sourcesd.getSafeSymbol()+"_hash->iterator("+iterator.getSafeSymbol()+");"+iterator.getSafeSymbol()+".hasNext();)");
+ cr.addDeclaration(sourcesd.getType().getGenerateType().getSafeSymbol(), newobject.getSafeSymbol());
+ cr.addDeclaration("struct SimpleIterator",iterator.getSafeSymbol());
+ cr.outputline("for(SimpleHashiterator("+sourcesd.getSafeSymbol()+"_hash, &"+iterator.getSafeSymbol()+"); hasNext(&"+iterator.getSafeSymbol()+");)");
cr.startblock();
- cr.outputline("if (!"+sd.getSafeSymbol()+"_hash->contains("+iterator.getSafeSymbol()+".key()))");
- cr.outputline(newobject.getSafeSymbol()+"="+iterator.getSafeSymbol()+".key();");
- cr.outputline(iterator.getSafeSymbol()+".next();");
+ cr.outputline("if (!SimpleHashcontainskey("+sd.getSafeSymbol()+"_hash, key(&"+iterator.getSafeSymbol()+")))");
+ cr.outputline(newobject.getSafeSymbol()+"=key(&"+iterator.getSafeSymbol()+");");
+ cr.outputline("next(&"+iterator.getSafeSymbol()+");");
cr.endblock();
} else if (termination.sources.allocSource(sd)) {
/* Allocation Source*/
termination.sources.generateSourceAlloc(cr,newobject,sd);
} else throw new Error("No source for adding to Set");
- cr.outputline(sd.getSafeSymbol()+"_hash->add("+newobject.getSafeSymbol()+","+newobject.getSafeSymbol()+");");
+ cr.outputline("SimpleHashadd("+sd.getSafeSymbol()+"_hash, "+newobject.getSafeSymbol()+","+newobject.getSafeSymbol()+");");
UpdateNode un=munadd.getUpdate(0);
String name=(String)updatenames.get(un);
- cr.outputline(name+"(this,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+newobject.getSafeSymbol()+");");
+ cr.outputline(name+"(thisvar,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+newobject.getSafeSymbol()+");");
}
cr.endblock();
}
boolean usageinvimage=rd.testUsage(RelationDescriptor.INVIMAGE);
if (inverse) {
if (usageimage)
- cr.outputline(rd.getSafeSymbol() + "_hash->remove((int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
+ cr.outputline("SimpleHashremove("+rd.getSafeSymbol()+"_hash, (int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
if (usageinvimage)
- cr.outputline(rd.getSafeSymbol() + "_hashinv->remove((int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");");
+ cr.outputline("SimpleHashremove("+rd.getSafeSymbol()+"_hashinv, (int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");");
} else {
if (usageimage)
- cr.outputline(rd.getSafeSymbol() + "_hash->remove((int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");");
+ cr.outputline("SimpleHashremove("+rd.getSafeSymbol()+"_hash ,(int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");");
if (usageinvimage)
- cr.outputline(rd.getSafeSymbol() + "_hashinv->remove((int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
+ cr.outputline("SimpleHashremove("+rd.getSafeSymbol()+"_hashinv, (int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
}
for(int i=0;i<state.vRules.size();i++) {
Rule r=(Rule)state.vRules.get(i);
/* Update for rule rule r */
String name=(String)updatenames.get(un);
if (inverse) {
- cr.outputline(repairtable.getSafeSymbol()+"->addrelation("+rd.getNum()+","+r.getNum()+","+rightvar.getSafeSymbol()+","+leftvar.getSafeSymbol()+",(int) &"+name+");");
+ cr.outputline("RepairHashaddrelation("+repairtable.getSafeSymbol()+","+rd.getNum()+","+r.getNum()+","+rightvar.getSafeSymbol()+","+leftvar.getSafeSymbol()+",(int) &"+name+");");
} else {
- cr.outputline(repairtable.getSafeSymbol()+"->addrelation("+rd.getNum()+","+r.getNum()+","+leftvar.getSafeSymbol()+","+rightvar.getSafeSymbol()+",(int) &"+name+");");
+ cr.outputline("RepairHashaddrelation("+repairtable.getSafeSymbol()+","+rd.getNum()+","+r.getNum()+","+leftvar.getSafeSymbol()+","+rightvar.getSafeSymbol()+",(int) &"+name+");");
}
}
}
}
} else {
SetDescriptor sd=ip.setexpr.sd;
- cr.outputline(sd.getSafeSymbol() + "_hash->remove((int)" + leftvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
+ cr.outputline("SimpleHashremove("+sd.getSafeSymbol()+"_hash, (int)" + leftvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
for(int i=0;i<state.vRules.size();i++) {
Rule r=(Rule)state.vRules.get(i);
if (un.getRule()==r) {
/* Update for rule rule r */
String name=(String)updatenames.get(un);
- cr.outputline(repairtable.getSafeSymbol()+"->addset("+sd.getNum()+","+r.getNum()+","+leftvar.getSafeSymbol()+",(int) &"+name+");");
+ cr.outputline("RepairHashaddset("+repairtable.getSafeSymbol()+","+sd.getNum()+","+r.getNum()+","+leftvar.getSafeSymbol()+",(int) &"+name+");");
}
}
}
boolean usageinvimage=rd.testUsage(RelationDescriptor.INVIMAGE);
if (inverse) {
if (usageimage)
- cr.outputline(rd.getSafeSymbol() + "_hash->add((int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
+ cr.outputline("SimpleHashadd("+rd.getSafeSymbol()+"_hash, (int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
if (usageinvimage)
- cr.outputline(rd.getSafeSymbol() + "_hashinv->add((int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");");
+ cr.outputline("SimpleHashadd("+rd.getSafeSymbol()+"_hashinv, (int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");");
} else {
if (usageimage)
- cr.outputline(rd.getSafeSymbol() + "_hash->add((int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");");
+ cr.outputline("SimpleHashadd("+rd.getSafeSymbol()+"_hash, (int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");");
if (usageinvimage)
- cr.outputline(rd.getSafeSymbol() + "_hashinv->add((int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
+ cr.outputline("SimpleHashadd("+rd.getSafeSymbol()+"_hashinv, (int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
}
UpdateNode un=mun.getUpdate(0);
String name=(String)updatenames.get(un);
if (inverse) {
- cr.outputline(name+"(this,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+rightvar.getSafeSymbol()+","+leftvar.getSafeSymbol()+");");
+ cr.outputline(name+"(thisvar,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+rightvar.getSafeSymbol()+","+leftvar.getSafeSymbol()+");");
} else {
- cr.outputline(name+"(this,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+leftvar.getSafeSymbol()+","+rightvar.getSafeSymbol()+");");
+ cr.outputline(name+"(thisvar,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+leftvar.getSafeSymbol()+","+rightvar.getSafeSymbol()+");");
}
} else {
SetDescriptor sd=ip.setexpr.sd;
- cr.outputline(sd.getSafeSymbol() + "_hash->add((int)" + leftvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
+ cr.outputline("SimpleHashadd("+sd.getSafeSymbol()+"_hash, (int)" + leftvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");");
UpdateNode un=mun.getUpdate(0);
/* Update for rule rule r */
String name=(String)updatenames.get(un);
- cr.outputline(name+"(this,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+leftvar.getSafeSymbol()+");");
+ cr.outputline(name+"(thisvar,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+leftvar.getSafeSymbol()+");");
}
}
}
for (int i = 0; i < rules.size(); i++) {
Rule rule = (Rule) rules.elementAt(i);
Set requiredsymbols = rule.getRequiredDescriptors();
-
+
// #TBD#: in general this is wrong because these descriptors may contain descriptors
// bound in "in?" expressions which need to be dealt with in a topologically sorted
// fashion...
if (!(usageinvimage||usageimage)) /* not used at all*/
return;
- cr.outputline("// RELATION DISPATCH ");
+ cr.outputline("/* RELATION DISPATCH */");
if (Compiler.REPAIR) {
cr.outputline("if ("+oldmodel.getSafeSymbol()+"&&");
if (usageimage)
- cr.outputline("!"+oldmodel.getSafeSymbol() +"->"+rd.getJustSafeSymbol()+"_hash->contains("+leftvar+","+rightvar+"))");
+ cr.outputline("!SimpleHashcontainskeydata("+oldmodel.getSafeSymbol()+"->"+rd.getJustSafeSymbol() + "_hash, "+leftvar+","+rightvar+"))");
else
- cr.outputline("!"+oldmodel.getSafeSymbol() +"->"+rd.getJustSafeSymbol()+"_hashinv->contains("+rightvar+","+leftvar+"))");
+ cr.outputline("!SimpleHashcontainskeydata("+oldmodel.getSafeSymbol() +"->"+rd.getJustSafeSymbol()+"_hashinv, "+rightvar+","+leftvar+"))");
cr.startblock(); {
/* Adding new item */
/* Perform safety checks */
cr.outputline("if ("+repairtable.getSafeSymbol()+"&&");
- cr.outputline(repairtable.getSafeSymbol()+"->containsrelation("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+"))");
+ cr.outputline("RepairHashcontainsrelation("+repairtable.getSafeSymbol()+","+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+"))");
cr.startblock(); {
/* Have update to call into */
VarDescriptor mdfyptr=VarDescriptor.makeNew("modifyptr");
VarDescriptor ismdfyptr=VarDescriptor.makeNew("ismodifyptr");
- cr.outputline("int "+ismdfyptr.getSafeSymbol()+"="+repairtable.getSafeSymbol()+"->ismodify("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
+ cr.addDeclaration("int ",ismdfyptr.getSafeSymbol());
+ cr.outputline(ismdfyptr.getSafeSymbol()+"=RepairHashismodify("+repairtable.getSafeSymbol()+","+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
+
-
String parttype="";
for(int i=0;i<currentrule.numQuantifiers();i++) {
if (currentrule.getQuantifier(i) instanceof RelationQuantifier)
else
parttype=parttype+", int";
}
- VarDescriptor funptr=VarDescriptor.makeNew("updateptr");
+
VarDescriptor tmpptr=VarDescriptor.makeNew("tempupdateptr");
-
- String methodcall="("+funptr.getSafeSymbol()+") (this,"+oldmodel.getSafeSymbol()+","+repairtable.getSafeSymbol();
+
+ String methodcall="(thisvar,"+oldmodel.getSafeSymbol()+","+repairtable.getSafeSymbol();
for(int i=0;i<currentrule.numQuantifiers();i++) {
Quantifier q=currentrule.getQuantifier(i);
if (q instanceof SetQuantifier) {
methodcall+=","+fq.getVar().getSafeSymbol();
}
}
-
-
-
- cr.outputline("void *"+tmpptr.getSafeSymbol()+"=");
- cr.outputline("(void *) "+repairtable.getSafeSymbol()+"->getrelation("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
+
+
+
+ cr.addDeclaration("void *",tmpptr.getSafeSymbol());
+ cr.outputline(tmpptr.getSafeSymbol()+"=");
+ cr.outputline("(void *) RepairHashgetrelation("+repairtable.getSafeSymbol()+","+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
cr.outputline("if ("+ismdfyptr.getSafeSymbol()+")");
{
+ VarDescriptor funptr=VarDescriptor.makeNew("updateptr");
+ String methodcallprefix="("+funptr.getSafeSymbol()+") ";
cr.startblock();
- cr.outputline("int "+mdfyptr.getSafeSymbol()+"="+repairtable.getSafeSymbol()+"->getrelation2("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
- cr.outputline("void (*"+funptr.getSafeSymbol()+") ("+name+"_state *,"+name+"*,RepairHash *"+parttype+",int,int,int)="+"(void (*) ("+name+"_state *,"+name+"*,RepairHash *"+parttype+",int,int,int)) "+tmpptr.getSafeSymbol()+";");
- cr.outputline(methodcall+","+leftvar+", "+rightvar+", "+mdfyptr.getSafeSymbol() +");");
+ cr.addDeclaration("int",mdfyptr.getSafeSymbol());
+ cr.outputline(mdfyptr.getSafeSymbol()+"=RepairHashgetrelation2("+repairtable.getSafeSymbol()+","+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
+ cr.addDeclaration("void (*"+funptr.getSafeSymbol()+") (struct "+name+"_state *, struct "+name+"*, struct RepairHash *"+parttype+",int,int,int);");
+ cr.outputline(funptr.getSafeSymbol()+"="+"(void (*) (struct "+name+"_state *, struct "+name+"*, struct RepairHash *"+parttype+",int,int,int)) "+tmpptr.getSafeSymbol()+";");
+ cr.outputline(methodcallprefix+methodcall+","+leftvar+", "+rightvar+", "+mdfyptr.getSafeSymbol() +");");
cr.endblock();
}
cr.outputline("else ");
{
+ VarDescriptor funptr=VarDescriptor.makeNew("updateptr");
+ String methodcallprefix="("+funptr.getSafeSymbol()+") ";
cr.startblock();
- cr.outputline("void (*"+funptr.getSafeSymbol()+") ("+name+"_state *,"+name+"*,RepairHash *"+parttype+")="+"(void (*) ("+name+"_state *,"+name+"*,RepairHash *"+parttype+")) "+tmpptr.getSafeSymbol()+";");
- cr.outputline(methodcall+");");
+ cr.addDeclaration("void (*"+funptr.getSafeSymbol()+") (struct "+name+"_state *, struct "+name+"*,struct RepairHash *"+parttype+");");
+ cr.outputline(funptr.getSafeSymbol()+"="+"(void (*) (struct "+name+"_state *,struct "+name+"*,struct RepairHash *"+parttype+")) "+tmpptr.getSafeSymbol()+";");
+ cr.outputline(methodcallprefix+methodcall+");");
cr.endblock();
}
- cr.outputline("delete "+newmodel.getSafeSymbol()+";");
+ cr.outputline("free"+name+"("+newmodel.getSafeSymbol()+");");
cr.outputline("goto rebuild;");
}
cr.endblock();
-
+
/* Build standard compensation actions */
if (need_compensation(currentrule)) {
UpdateNode un=find_compensation(currentrule);
String name=(String)updatenames.get(un);
usedupdates.add(un); /* Mark as used */
- String methodcall=name+"(this,"+oldmodel.getSafeSymbol()+","+repairtable.getSafeSymbol();
+ String methodcall=name+"(thisvar,"+oldmodel.getSafeSymbol()+","+repairtable.getSafeSymbol();
for(int i=0;i<currentrule.numQuantifiers();i++) {
Quantifier q=currentrule.getQuantifier(i);
if (q instanceof SetQuantifier) {
}
methodcall+=");";
cr.outputline(methodcall);
- cr.outputline("delete "+newmodel.getSafeSymbol()+";");
+ cr.outputline("free"+name+"("+newmodel.getSafeSymbol()+");");
cr.outputline("goto rebuild;");
}
}
}
String addeditem = (VarDescriptor.makeNew("addeditem")).getSafeSymbol();
- cr.outputline("int " + addeditem + "=0;");
+ cr.startblock();
+ cr.addDeclaration("int" , addeditem);
+ cr.outputline(addeditem + "=0;");
- String ifstring="if (!maybe&&";
- boolean dogenerate=false;
+ String ifstring="if (!maybe";
if (rd.getDomain().getType() instanceof StructureTypeDescriptor) {
- dogenerate=true;
- ifstring+=leftvar;
+ ifstring+="&&"+leftvar;
}
if (rd.getRange().getType() instanceof StructureTypeDescriptor) {
- if (dogenerate)
- ifstring+="&&"+rightvar;
- else
- ifstring+=rightvar;
- dogenerate=true;
+ ifstring+="&&"+rightvar;
}
ifstring+=")";
if (rd.testUsage(RelationDescriptor.IMAGE)) {
cr.outputline(ifstring);
- cr.outputline(addeditem + " = " + rd.getSafeSymbol() + "_hash->add((int)" + leftvar + ", (int)" + rightvar+ ");");
+ cr.outputline(addeditem + " = SimpleHashadd("+rd.getSafeSymbol()+"_hash, (int)" + leftvar + ", (int)" + rightvar+ ");");
}
-
+
if (rd.testUsage(RelationDescriptor.INVIMAGE)) {
cr.outputline(ifstring);
- cr.outputline(addeditem + " = " + rd.getSafeSymbol() + "_hashinv->add((int)" + rightvar + ", (int)" + leftvar + ");");
+ cr.outputline(addeditem + " = SimpleHashadd("+rd.getSafeSymbol()+"_hashinv, (int)" + rightvar + ", (int)" + leftvar + ");");
}
-
+
Vector dispatchrules = getrulelist(rd);
-
+
Set toremove=new HashSet();
for(int i=0;i<dispatchrules.size();i++) {
Rule r=(Rule)dispatchrules.get(i);
}
dispatchrules.removeAll(toremove);
if (dispatchrules.size() == 0) {
- cr.outputline("// nothing to dispatch");
+ cr.outputline("/* nothing to dispatch */");
+ cr.endblock();
return;
}
cr.outputline("if (" + addeditem + ")");
cr.startblock();
-
+
for(int i = 0; i < dispatchrules.size(); i++) {
Rule rule = (Rule) dispatchrules.elementAt(i);
if (rule.getGuardExpr().getRequiredDescriptors().contains(rd)) {
/* Guard depends on this relation, so we recomput everything */
- cr.outputline(worklist.getSafeSymbol()+"->add("+rule.getNum()+",-1,0,0);");
+ cr.outputline("WorkListadd("+worklist.getSafeSymbol()+","+rule.getNum()+",-1,0,0);");
} else {
for (int j=0;j<rule.numQuantifiers();j++) {
Quantifier q=rule.getQuantifier(j);
if (q.getRequiredDescriptors().contains(rd)) {
/* Generate add */
- cr.outputline(worklist.getSafeSymbol()+"->add("+rule.getNum()+","+j+","+leftvar+","+rightvar+");");
+ cr.outputline("WorkListadd("+worklist.getSafeSymbol()+","+rule.getNum()+","+j+","+leftvar+","+rightvar+");");
}
}
}
}
-
+ cr.endblock();
cr.endblock();
}
public void generate_dispatch(CodeWriter cr, SetDescriptor sd, String setvar) {
- cr.outputline("// SET DISPATCH ");
+ cr.outputline("/* SET DISPATCH */");
if (Compiler.REPAIR) {
cr.outputline("if ("+oldmodel.getSafeSymbol()+"&&");
- cr.outputline("!"+oldmodel.getSafeSymbol() +"->"+sd.getJustSafeSymbol()+"_hash->contains("+setvar+"))");
+ cr.outputline("!SimpleHashcontainskey("+oldmodel.getSafeSymbol() +"->"+sd.getJustSafeSymbol()+"_hash, "+setvar+"))");
cr.startblock(); {
/* Adding new item */
/* See if there is an outstanding update in the repairtable */
cr.outputline("if ("+repairtable.getSafeSymbol()+"&&");
- cr.outputline(repairtable.getSafeSymbol()+"->containsset("+sd.getNum()+","+currentrule.getNum()+","+setvar+"))");
+ cr.outputline("RepairHashcontainsset("+repairtable.getSafeSymbol()+","+sd.getNum()+","+currentrule.getNum()+","+setvar+"))");
cr.startblock(); {
/* Have update to call into */
VarDescriptor funptr=VarDescriptor.makeNew("updateptr");
else
parttype=parttype+", int";
}
- cr.outputline("void (*"+funptr.getSafeSymbol()+") ("+name+"_state *,"+name+"*,RepairHash *"+parttype+")=");
- cr.outputline("(void (*) ("+name+"_state *,"+name+"*,RepairHash *"+parttype+")) "+repairtable.getSafeSymbol()+"->getset("+sd.getNum()+","+currentrule.getNum()+","+setvar+");");
- String methodcall="("+funptr.getSafeSymbol()+") (this,"+oldmodel.getSafeSymbol()+","+
+ cr.addDeclaration("void (*"+funptr.getSafeSymbol()+") (struct "+name+"_state *,struct "+name+"*,struct RepairHash *"+parttype+");");
+ cr.outputline(funptr.getSafeSymbol()+"=");
+ cr.outputline("(void (*) (struct "+name+"_state *,struct "+name+"*,struct RepairHash *"+parttype+")) RepairHashgetset("+repairtable.getSafeSymbol()+","+sd.getNum()+","+currentrule.getNum()+","+setvar+");");
+ String methodcall="("+funptr.getSafeSymbol()+") (thisvar,"+oldmodel.getSafeSymbol()+","+
repairtable.getSafeSymbol();
for(int i=0;i<currentrule.numQuantifiers();i++) {
Quantifier q=currentrule.getQuantifier(i);
}
methodcall+=");";
cr.outputline(methodcall);
- cr.outputline("delete "+newmodel.getSafeSymbol()+";");
+ cr.outputline("free"+name+"("+newmodel.getSafeSymbol()+");");
cr.outputline("goto rebuild;");
}
cr.endblock();
ruleset.addAll((Set)state.implicitruleinv.get(currentrule));
for(int i=0;i<ruleset.size();i++) {
Rule itrule=(Rule)ruleset.get(i);
-
+
if (need_compensation(itrule)) {
UpdateNode un=find_compensation(itrule);
String name=(String)updatenames.get(un);
usedupdates.add(un); /* Mark as used */
-
- String methodcall=name+"(this,"+oldmodel.getSafeSymbol()+","+
+
+ String methodcall=name+"(thisvar,"+oldmodel.getSafeSymbol()+","+
repairtable.getSafeSymbol();
for(int j=0;j<currentrule.numQuantifiers();j++) {
Quantifier q=currentrule.getQuantifier(j);
if (currentrule!=itrule) {
SetDescriptor sdrule=((SetInclusion)itrule.getInclusion()).getSet();
cr.outputline("if ("+oldmodel.getSafeSymbol()+"&&");
- cr.outputline("!"+oldmodel.getSafeSymbol() +"->"+sdrule.getJustSafeSymbol()+"_hash->contains("+setvar+"))");
+ cr.outputline("!SimpleHashcontainskey("+ oldmodel.getSafeSymbol() +"->"+sdrule.getJustSafeSymbol() +"_hash,"+setvar+"))");
cr.startblock();
}
cr.outputline(methodcall);
- cr.outputline("delete "+newmodel.getSafeSymbol()+";");
+ cr.outputline("free"+name+"("+newmodel.getSafeSymbol()+");");
cr.outputline("goto rebuild;");
cr.endblock();
}
}
}
+ cr.startblock();
String addeditem = (VarDescriptor.makeNew("addeditem")).getSafeSymbol();
- cr.outputline("int " + addeditem + " = 0;");
+ cr.addDeclaration("int", addeditem);
+ cr.outputline(addeditem + " = 0;");
if (sd.getType() instanceof StructureTypeDescriptor) {
cr.outputline("if (!maybe&&"+setvar+")");
} else
cr.outputline("if (!maybe)");
- cr.outputline(addeditem + " = " + sd.getSafeSymbol() + "_hash->add((int)" + setvar + ", (int)" + setvar + ");");
+ cr.outputline(addeditem + " = SimpleHashadd("+sd.getSafeSymbol()+"_hash, (int)" + setvar + ", (int)" + setvar + ");");
cr.startblock();
Vector dispatchrules = getrulelist(sd);
dispatchrules.removeAll(toremove);
if (dispatchrules.size() == 0) {
- cr.outputline("// nothing to dispatch");
+ cr.outputline("/* nothing to dispatch */");
+ cr.endblock();
cr.endblock();
return;
}
Rule rule = (Rule) dispatchrules.elementAt(i);
if (SetDescriptor.expand(rule.getGuardExpr().getRequiredDescriptors()).contains(sd)) {
/* Guard depends on this relation, so we recompute everything */
- cr.outputline(worklist.getSafeSymbol()+"->add("+rule.getNum()+",-1,0,0);");
+ cr.outputline("WorkListadd("+worklist.getSafeSymbol()+","+rule.getNum()+",-1,0,0);");
} else {
for (int j=0;j<rule.numQuantifiers();j++) {
Quantifier q=rule.getQuantifier(j);
if (SetDescriptor.expand(q.getRequiredDescriptors()).contains(sd)) {
/* Generate add */
- cr.outputline(worklist.getSafeSymbol()+"->add("+rule.getNum()+","+j+","+setvar+",0);");
+ cr.outputline("WorkListadd("+worklist.getSafeSymbol()+","+rule.getNum()+","+j+","+setvar+",0);");
}
}
}
}
cr.endblock();
cr.endblock();
+ cr.endblock();
}
}