generate_call();
generate_start();
generate_rules();
- generate_print();
+ if (!Compiler.REPAIR||Compiler.GENERATEDEBUGPRINT) {
+ generate_print();
+ }
generate_checks();
generate_teardown();
CodeWriter crhead = new StandardCodeWriter(this.outputhead);
CodeWriter craux = new StandardCodeWriter(this.outputaux);
crhead.outputline("};");
craux.outputline("}");
+
+ if (Compiler.GENERATEDEBUGHOOKS) {
+ crhead.outputline("void debughook();");
+ craux.outputline("void debughook() {}");
+ }
generatetypechecks(false);
generate_computesizes();
generatetypechecks(true);
int count=0;
CodeWriter crhead = new StandardCodeWriter(outputhead);
CodeWriter craux = new StandardCodeWriter(outputaux);
+ RelationDescriptor.prefix = "model->";
+ SetDescriptor.prefix = "model->";
/* Rewrite globals */
methodcall+=", int "+fq.getVar().getSafeSymbol();
}
}
- methodcall+=", "+stleft+", "+stright+", "+stnew;
+ methodcall+=", int "+stleft+", int "+stright+", int "+stnew;
methodcall+=")";
crhead.outputline(methodcall+";");
craux.outputline(methodcall);
};
cr.outputline("void "+name+"_state::computesizes(int *sizearray,int **numele) {");
+ cr.outputline("int 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("}");
}
public SymbolTable getSymbolTable() { return st; }
};
cr.outputline("void "+name+"_state::recomputesizes() {");
+ cr.outputline("int 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.outputline("else if (!" + constraintboolean.getSafeSymbol() + ")");
cr.startblock();
- if (!Compiler.REPAIR)
+ if (!Compiler.REPAIR||Compiler.GENERATEDEBUGHOOKS)
cr.outputline("printf(\"fail " + escape(constraint.toString()) + ". \\n\");");
- else {
+
+ 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();");
-
+ if (Compiler.GENERATEDEBUGHOOKS)
+ cr.outputline("debughook();");
/* Compute cost of each repair */
VarDescriptor mincost=VarDescriptor.makeNew("mincost");
VarDescriptor mincostindex=VarDescriptor.makeNew("mincostindex");
VarDescriptor rightside=VarDescriptor.makeNew("rightside");
VarDescriptor newvalue=VarDescriptor.makeNew("newvalue");
if (!inverted) {
- expr.getLeftExpr().generate(cr,leftside);
+ ((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()+");");
} else {
- expr.getLeftExpr().generate(cr,rightside);
+ ((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("+leftside.getSafeSymbol()+","+leftside.getSafeSymbol()+");");
+ cr.outputline(rd.getSafeSymbol()+"_hashinv->get("+rightside.getSafeSymbol()+","+leftside.getSafeSymbol()+");");
}
if (negated)
if (opcode==Opcode.GT) {
SetDescriptor sd=termination.sources.relgetSourceSet(rd,!ep.inverted());
VarDescriptor iterator=VarDescriptor.makeNew("iterator");
cr.outputline(sd.getType().getGenerateType().getSafeSymbol() +" "+newobject.getSafeSymbol()+";");
- cr.outputline("for("+iterator.getSafeSymbol()+"="+sd.getSafeSymbol()+"_hash->iterator();"+iterator.getSafeSymbol()+".hasNext();)");
+ cr.outputline("SimpleIterator "+iterator.getSafeSymbol()+";");
+ cr.outputline("for("+sd.getSafeSymbol()+"_hash->iterator("+ iterator.getSafeSymbol() +");"+iterator.getSafeSymbol()+".hasNext();)");
cr.startblock();
if (ep.inverted()) {
- cr.outputline("if !"+rd.getSafeSymbol()+"_hashinv->contains("+iterator.getSafeSymbol()+"->key(),"+otherside.getSafeSymbol()+")");
+ cr.outputline("if (!"+rd.getSafeSymbol()+"_hashinv->contains("+iterator.getSafeSymbol()+".key(),"+otherside.getSafeSymbol()+"))");
} else {
- cr.outputline("if !"+rd.getSafeSymbol()+"_hash->contains("+otherside.getSafeSymbol()+","+iterator.getSafeSymbol()+"->key())");
+ cr.outputline("if (!"+rd.getSafeSymbol()+"_hash->contains("+otherside.getSafeSymbol()+","+iterator.getSafeSymbol()+".key()))");
}
cr.outputline(newobject.getSafeSymbol()+"="+iterator.getSafeSymbol()+".key();");
- cr.outputline(iterator.getSafeSymbol()+"->next();");
+ cr.outputline(iterator.getSafeSymbol()+".next();");
cr.endblock();
} else if (termination.sources.relallocSource(rd,!ep.inverted())) {
/* Allocation Source*/
SetDescriptor sourcesd=termination.sources.getSourceSet(sd);
VarDescriptor iterator=VarDescriptor.makeNew("iterator");
cr.outputline(sourcesd.getType().getGenerateType().getSafeSymbol() +" "+newobject.getSafeSymbol()+";");
- cr.outputline("for("+iterator.getSafeSymbol()+"="+sourcesd.getSafeSymbol()+"_hash->iterator();"+iterator.getSafeSymbol()+".hasNext();)");
+ cr.outputline("SimpleIterator "+iterator.getSafeSymbol()+";");
+ cr.outputline("for("+sourcesd.getSafeSymbol()+"_hash->iterator("+iterator.getSafeSymbol()+");"+iterator.getSafeSymbol()+".hasNext();)");
cr.startblock();
- cr.outputline("if !"+sd.getSafeSymbol()+"_hash->contains("+iterator.getSafeSymbol()+"->key())");
+ cr.outputline("if (!"+sd.getSafeSymbol()+"_hash->contains("+iterator.getSafeSymbol()+".key()))");
cr.outputline(newobject.getSafeSymbol()+"="+iterator.getSafeSymbol()+".key();");
- cr.outputline(iterator.getSafeSymbol()+"->next();");
+ cr.outputline(iterator.getSafeSymbol()+".next();");
cr.endblock();
} else if (termination.sources.allocSource(sd)) {
/* Allocation Source*/
}
-
+
cr.outputline("void *"+tmpptr.getSafeSymbol()+"=");
cr.outputline("(void *) "+repairtable.getSafeSymbol()+"->getrelation("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
cr.outputline("if ("+mdfyptr.getSafeSymbol()+")");
{
cr.startblock();
- 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.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.endblock();
}
cr.outputline("else ");
{
cr.startblock();
- cr.outputline("void (*"+funptr.getSafeSymbol()+") ("+name+"_state *,"+name+"*,RepairHash *"+parttype+")="+"(void (*) ("+name+"_state *,"+name+"*,RepairHash *"+parttype+")) "+tmpptr.getSafeSymbol());
+ cr.outputline("void (*"+funptr.getSafeSymbol()+") ("+name+"_state *,"+name+"*,RepairHash *"+parttype+")="+"(void (*) ("+name+"_state *,"+name+"*,RepairHash *"+parttype+")) "+tmpptr.getSafeSymbol()+";");
cr.outputline(methodcall+");");
cr.endblock();
}
}
String addeditem = (VarDescriptor.makeNew("addeditem")).getSafeSymbol();
- cr.outputline("int " + addeditem + ";");
+ cr.outputline("int " + addeditem + "=0;");
+
+ String ifstring="if (!maybe&&";
+ boolean dogenerate=false;
+ if (rd.getDomain().getType() instanceof StructureTypeDescriptor) {
+ dogenerate=true;
+ ifstring+=leftvar;
+ }
+
+ if (rd.getRange().getType() instanceof StructureTypeDescriptor) {
+ if (dogenerate)
+ ifstring+="&&"+rightvar;
+ else
+ ifstring+=rightvar;
+ dogenerate=true;
+ }
+
+ ifstring+=")";
+
if (rd.testUsage(RelationDescriptor.IMAGE)) {
+ cr.outputline(ifstring);
cr.outputline(addeditem + " = " + rd.getSafeSymbol() + "_hash->add((int)" + leftvar + ", (int)" + rightvar+ ");");
}
if (rd.testUsage(RelationDescriptor.INVIMAGE)) {
+ cr.outputline(ifstring);
cr.outputline(addeditem + " = " + rd.getSafeSymbol() + "_hashinv->add((int)" + rightvar + ", (int)" + leftvar + ");");
}
-
Vector dispatchrules = getrulelist(rd);
Set toremove=new HashSet();
}
String addeditem = (VarDescriptor.makeNew("addeditem")).getSafeSymbol();
- cr.outputline("int " + addeditem + " = 1;");
+ cr.outputline("int " + 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.startblock();
Vector dispatchrules = getrulelist(sd);