static boolean DOTYPECHECKS=false;
static boolean DONULL=false;
+
+ public DotExpr(Expr left, String field, Expr index) {
+ this.left = left;
+ this.field = field;
+ this.index = index;
+ }
+
public boolean isSafe() {
if (!left.isSafe())
return false;
if (d==fd)
s.add(this);
left.findmatch(d,s);
- if (index!=null)
- index.findmatch(d,s);
+ if (intindex!=null)
+ intindex.findmatch(d,s);
}
public Set freeVars() {
Set lset=left.freeVars();
Set iset=null;
- if (index!=null)
- iset=index.freeVars();
+ if (intindex!=null)
+ iset=intindex.freeVars();
if (lset==null)
return iset;
if (iset!=null)
return true;
}
-
- public DotExpr(Expr left, String field, Expr index) {
- this.left = left;
- this.field = field;
- this.index = index;
- }
public Set getRequiredDescriptors() {
Set v = left.getRequiredDescriptors();
- if (index != null) {
- v.addAll(index.getRequiredDescriptors());
+ if (intindex != null) {
+ v.addAll(intindex.getRequiredDescriptors());
}
return v;
}
writer.outputline("");
StructureTypeDescriptor struct = (StructureTypeDescriptor) left.getType();
- Expr intindex = index;
Expr offsetbits;
// #ATTN#: getOffsetExpr needs to be called with the fielddescriptor object that is in the vector list
{
/* finished typechecking...so we can fill the fields in */
- StructureTypeDescriptor struct = (StructureTypeDescriptor) left.getType();
+ StructureTypeDescriptor struct = (StructureTypeDescriptor) left.getType();
FieldDescriptor fd = struct.getField(field);
LabelDescriptor ld = struct.getLabel(field);
if (ld != null) { /* label */
generate_call();
generate_start();
generate_rules();
- if (!Compiler.REPAIR) {
+ if (!Compiler.REPAIR||Compiler.GENERATEDEBUGPRINT) {
generate_print();
}
generate_checks();
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);
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) {
}
-
+
cr.outputline("void *"+tmpptr.getSafeSymbol()+"=");
cr.outputline("(void *) "+repairtable.getSafeSymbol()+"->getrelation("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");");
cr.outputline("if ("+mdfyptr.getSafeSymbol()+")");
}
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);