aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib/Solver
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Solver')
-rw-r--r--lib/Solver/IndependentSolver.cpp18
1 files changed, 12 insertions, 6 deletions
diff --git a/lib/Solver/IndependentSolver.cpp b/lib/Solver/IndependentSolver.cpp
index 6b5a5586..78126ede 100644
--- a/lib/Solver/IndependentSolver.cpp
+++ b/lib/Solver/IndependentSolver.cpp
@@ -258,9 +258,11 @@ inline llvm::raw_ostream &operator<<(llvm::raw_ostream &os,
// Breaks down a constraint into all of it's individual pieces, returning a
// list of IndependentElementSets or the independent factors.
-static void
-getAllIndependentConstraintsSets(const Query &query,
- std::list<IndependentElementSet> *&factors) {
+//
+// Caller takes ownership of returned std::list.
+static std::list<IndependentElementSet>*
+getAllIndependentConstraintsSets(const Query &query) {
+ std::list<IndependentElementSet> *factors = new std::list<IndependentElementSet>();
ConstantExpr *CE = dyn_cast<ConstantExpr>(query.expr);
if (CE) {
assert(CE && CE->isFalse() && "the expr should always be false and "
@@ -314,6 +316,8 @@ getAllIndependentConstraintsSets(const Query &query,
delete factors;
factors = done;
} while (!doneLoop);
+
+ return factors;
}
static
@@ -459,14 +463,14 @@ bool IndependentSolver::computeInitialValues(const Query& query,
const std::vector<const Array*> &objects,
std::vector< std::vector<unsigned char> > &values,
bool &hasSolution){
- std::list<IndependentElementSet> * factors = new std::list<IndependentElementSet>;
-
// We assume the query has a solution except proven differently
// This is important in case we don't have any constraints but
// we need initial values for requested array objects.
hasSolution = true;
+ // FIXME: When we switch to C++11 this should be a std::unique_ptr so we don't need
+ // to remember to manually call delete
+ std::list<IndependentElementSet> *factors = getAllIndependentConstraintsSets(query);
- getAllIndependentConstraintsSets(query, factors);
//Used to rearrange all of the answers into the correct order
std::map<const Array*, std::vector<unsigned char> > retMap;
for (std::list<IndependentElementSet>::iterator it = factors->begin();
@@ -483,9 +487,11 @@ bool IndependentSolver::computeInitialValues(const Query& query,
if (!solver->impl->computeInitialValues(Query(tmp, ConstantExpr::alloc(0, Expr::Bool)),
arraysInFactor, tempValues, hasSolution)){
values.clear();
+ delete factors;
return false;
} else if (!hasSolution){
values.clear();
+ delete factors;
return true;
} else {
assert(tempValues.size() == arraysInFactor.size() &&