From: bdemsky Date: Wed, 12 Oct 2005 17:49:01 +0000 (+0000) Subject: 2 bug fixes to getRequiredConstraints X-Git-Url: http://plrg.eecs.uci.edu/git/?p=repair.git;a=commitdiff_plain;h=87862c69c1cb47c83a858f0b6e52d9c0bc25913f 2 bug fixes to getRequiredConstraints added option to reject updates that change the layout of objects. --- diff --git a/Repair/RepairCompiler/MCC/IR/DotExpr.java b/Repair/RepairCompiler/MCC/IR/DotExpr.java index 2e5021e..5413302 100755 --- a/Repair/RepairCompiler/MCC/IR/DotExpr.java +++ b/Repair/RepairCompiler/MCC/IR/DotExpr.java @@ -158,6 +158,7 @@ public class DotExpr extends Expr { if (intindex != null) { v.addAll(intindex.getRequiredDescriptors()); } + v.add(fd); return v; } diff --git a/Repair/RepairCompiler/MCC/IR/GraphAnalysis.java b/Repair/RepairCompiler/MCC/IR/GraphAnalysis.java index 6b690a8..3fdbe6e 100755 --- a/Repair/RepairCompiler/MCC/IR/GraphAnalysis.java +++ b/Repair/RepairCompiler/MCC/IR/GraphAnalysis.java @@ -723,8 +723,9 @@ public class GraphAnalysis { foundrepair=true; } } - if (!foundrepair) + if (!foundrepair) { return ERR_NOREPAIR; + } } diff --git a/Repair/RepairCompiler/MCC/IR/SemanticChecker.java b/Repair/RepairCompiler/MCC/IR/SemanticChecker.java index f450bb7..62c12be 100755 --- a/Repair/RepairCompiler/MCC/IR/SemanticChecker.java +++ b/Repair/RepairCompiler/MCC/IR/SemanticChecker.java @@ -3,6 +3,7 @@ package MCC.IR; import java.util.*; import java.math.BigInteger; import MCC.State; +import MCC.Compiler; public class SemanticChecker { @@ -995,6 +996,10 @@ public class SemanticChecker { public IRErrorReporter getErrorReporter() { return er; } public SymbolTable getSymbolTable() { return stGlobals; } }); + if (Compiler.REJECTLENGTH) { + analyze_length(indexbound); + } + if (indextype == null) { ok = false; @@ -1035,6 +1040,20 @@ public class SemanticChecker { return ok; } + private void analyze_length(Expr indexbound) { + Set descriptors=indexbound.getRequiredDescriptors(); + for(Iterator it=descriptors.iterator();it.hasNext();) { + Descriptor d=(Descriptor)it.next(); + if (d instanceof FieldDescriptor) { + state.noupdate.add(d); + } else if (d instanceof ArrayDescriptor) { + state.noupdate.add(d); + } else if (d instanceof VarDescriptor) { + state.noupdate.add(d); + } + } + } + private boolean parse_global(ParseNode pn) { if (!precheck(pn, "global")) { return false; diff --git a/Repair/RepairCompiler/MCC/IR/Termination.java b/Repair/RepairCompiler/MCC/IR/Termination.java index 0d074f6..8585655 100755 --- a/Repair/RepairCompiler/MCC/IR/Termination.java +++ b/Repair/RepairCompiler/MCC/IR/Termination.java @@ -627,7 +627,7 @@ public class Termination { continue; } } - if (!un.checkupdates()) /* Make sure we have a good update */ + if (!un.checkupdates(state)) /* Make sure we have a good update */ continue; mun.addUpdate(un); @@ -734,7 +734,7 @@ public class Termination { goodflag=false;break; } } - if (!un.checkupdates()) { + if (!un.checkupdates(state)) { goodflag=false; break; } @@ -855,7 +855,7 @@ public class Termination { goodflag=false; } - if (!un.checkupdates()) { + if (!un.checkupdates(state)) { goodflag=false; break; } @@ -914,7 +914,6 @@ public class Termination { continue endloop; e=ce.getExpr(); } - if (!(e instanceof VarExpr)) { if (e.isValue(si.getSet().getType())) { Updates up=new Updates(e,0,si.getSet().getType()); @@ -1043,7 +1042,7 @@ public class Termination { debugmsg("Finished processing quantifiers")&& processconjunction(un,ruleconj,setmapping)&& debugmsg("Finished processing conjunction")&& - un.checkupdates()&& + un.checkupdates(state)&& debugmsg("Updates checked")) { mun.addUpdate(un); GraphNode.Edge e=new GraphNode.Edge("abstract5"+addtocount,gn2); diff --git a/Repair/RepairCompiler/MCC/IR/UpdateNode.java b/Repair/RepairCompiler/MCC/IR/UpdateNode.java index ee6bdac..89ffed9 100755 --- a/Repair/RepairCompiler/MCC/IR/UpdateNode.java +++ b/Repair/RepairCompiler/MCC/IR/UpdateNode.java @@ -44,14 +44,29 @@ class UpdateNode { } } - public boolean checkupdates() { + public boolean checkupdates(State state) { if (!checkconflicts()) /* Do we have conflicting concrete updates */ return false; + if (!checknoupdates(state)) + return false; if (computeordering()) /* Ordering exists */ return true; return false; } + private boolean checknoupdates(State state) { + Set noupdate=state.noupdate; + for(int i=0;i