From 50c504d43b7eb7262334f2e63a9bf269208ee2bd Mon Sep 17 00:00:00 2001 From: bdemsky Date: Tue, 20 Jul 2004 02:05:07 +0000 Subject: [PATCH] This checkin eliminates cases in which the repair algorithm generates unnecessary data structure updates to add an object to a set it is already in. --- .../RepairCompiler/MCC/IR/AbstractRepair.java | 107 +++++++++++++++++- .../RepairCompiler/MCC/IR/ExprPredicate.java | 2 - Repair/RepairCompiler/MCC/IR/Termination.java | 76 ++++++++++--- 3 files changed, 166 insertions(+), 19 deletions(-) diff --git a/Repair/RepairCompiler/MCC/IR/AbstractRepair.java b/Repair/RepairCompiler/MCC/IR/AbstractRepair.java index 01cba23..033d838 100755 --- a/Repair/RepairCompiler/MCC/IR/AbstractRepair.java +++ b/Repair/RepairCompiler/MCC/IR/AbstractRepair.java @@ -10,6 +10,7 @@ class AbstractRepair { DNFPredicate torepair; int type; Descriptor descriptor; + Sources sources; public String type() { switch(type) { @@ -28,6 +29,109 @@ class AbstractRepair { } } + public SetDescriptor getDomainSet() { + if (torepair==null) + return null; + Predicate predicate=torepair.getPredicate(); + if (!(predicate.getDescriptor() instanceof RelationDescriptor)) + return null; + + /* Have relation descriptor now */ + if (predicate instanceof InclusionPredicate) { + InclusionPredicate ip=(InclusionPredicate)predicate; + if (ip.inverted()) + return ip.expr.getSet(); + else if (ip.setexpr instanceof ImageSetExpr) { + ImageSetExpr ise=(ImageSetExpr)ip.setexpr; + if (ise.isimageset) + return ise.getImageSetExpr().getSet(); + else + return ise.getVar().getSet(); + } + } else if (predicate instanceof ExprPredicate) { + ExprPredicate ep=(ExprPredicate)predicate; + + if (ep.inverted()&&ep.getType()==ExprPredicate.SIZE) + return sources.relgetSourceSet((RelationDescriptor)predicate.getDescriptor(),true); + else if (ep.inverted()&&ep.getType()==ExprPredicate.COMPARISON) + return ((OpExpr)ep.expr).right.getSet(); + else if (!ep.inverted()) { + switch(ep.getType()) { + case ExprPredicate.SIZE: + { + SizeofExpr soe=((SizeofExpr)((OpExpr)ep.expr).left); + ImageSetExpr ise=(ImageSetExpr)soe.setexpr; + if (ise.isimageset) + return ise.getImageSetExpr().getSet(); + else + return ise.getVar().getSet(); + } + case ExprPredicate.COMPARISON: + { + RelationExpr re=((RelationExpr)((OpExpr)ep.expr).left); + return ep.expr.getSet(); + } + default: + throw new Error(""); + } + } + } else throw new Error("Unrecognized predicate"); + return null; + } + + public SetDescriptor getRangeSet() { + if (torepair==null) + return null; + Predicate predicate=torepair.getPredicate(); + if (!(predicate.getDescriptor() instanceof RelationDescriptor)) + return null; + + /* Have relation descriptor now */ + if (predicate instanceof InclusionPredicate) { + InclusionPredicate ip=(InclusionPredicate)predicate; + if (!ip.inverted()) + return ip.expr.getSet(); + else if (ip.setexpr instanceof ImageSetExpr) { + ImageSetExpr ise=(ImageSetExpr)ip.setexpr; + if (ise.isimageset) + return ise.getImageSetExpr().getSet(); + else + return ise.getVar().getSet(); + } + } else if (predicate instanceof ExprPredicate) { + ExprPredicate ep=(ExprPredicate)predicate; + + if (!ep.inverted()&&ep.getType()==ExprPredicate.SIZE) + return sources.relgetSourceSet((RelationDescriptor)predicate.getDescriptor(),false); + else if (!ep.inverted()&&ep.getType()==ExprPredicate.COMPARISON) + return ((OpExpr)ep.expr).right.getSet(); + else if (ep.inverted()) { + switch(ep.getType()) { + case ExprPredicate.SIZE: + { + SizeofExpr soe=((SizeofExpr)((OpExpr)ep.expr).left); + ImageSetExpr ise=(ImageSetExpr)soe.setexpr; + if (ise.isimageset) + return ise.getImageSetExpr().getSet(); + else + return ise.getVar().getSet(); + } + case ExprPredicate.COMPARISON: + { + RelationExpr re=((RelationExpr)((OpExpr)ep.expr).left); + return ep.expr.getSet(); + } + default: + throw new Error(""); + } + } + } else throw new Error("Unrecognized predicate"); + return null; + } + + + + public int getType() { return type; } @@ -40,9 +144,10 @@ class AbstractRepair { return descriptor; } - public AbstractRepair(DNFPredicate dp,int typ, Descriptor d) { + public AbstractRepair(DNFPredicate dp,int typ, Descriptor d, Sources s) { torepair=dp; type=typ; descriptor=d; + sources=s; } } diff --git a/Repair/RepairCompiler/MCC/IR/ExprPredicate.java b/Repair/RepairCompiler/MCC/IR/ExprPredicate.java index a282045..64d4ec5 100755 --- a/Repair/RepairCompiler/MCC/IR/ExprPredicate.java +++ b/Repair/RepairCompiler/MCC/IR/ExprPredicate.java @@ -3,10 +3,8 @@ package MCC.IR; import java.util.*; public class ExprPredicate extends Predicate { - Expr expr; - public static final int SIZE=1; public static final int COMPARISON=2; diff --git a/Repair/RepairCompiler/MCC/IR/Termination.java b/Repair/RepairCompiler/MCC/IR/Termination.java index f5c8dac..57cf6c9 100755 --- a/Repair/RepairCompiler/MCC/IR/Termination.java +++ b/Repair/RepairCompiler/MCC/IR/Termination.java @@ -385,7 +385,7 @@ public class Termination { int[] array=dp.getPredicate().getRepairs(dp.isNegated(),this); Descriptor d=dp.getPredicate().getDescriptor(); for(int j=0;j