From 8fe11196bd12d21262f06c693e0aae106fdf0494 Mon Sep 17 00:00:00 2001 From: Damien Lefortier Date: Tue, 9 Jun 2009 21:18:43 +0200 Subject: [PATCH] * src/eltlparse/eltlparse.yy: Fix a memory leak. * src/eltltest/nfa.cc: Adjust. * src/tgbaalgos/eltl2tgba_lacim.cc: Fix a memory leak. --- ChangeLog | 6 ++++++ src/eltlparse/eltlparse.yy | 33 ++++++++++++++++++-------------- src/eltltest/nfa.cc | 12 +++++++++--- src/tgbaalgos/eltl2tgba_lacim.cc | 12 ++++++------ 4 files changed, 40 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index 54fc42287..481dd701e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-06-09 Damien Lefortier + + * src/eltlparse/eltlparse.yy: Fix a memory leak. + * src/eltltest/nfa.cc: Adjust. + * src/tgbaalgos/eltl2tgba_lacim.cc: Fix a memory leak. + 2009-06-05 Guillaume Sadegh Remove generated files that git follows. diff --git a/src/eltlparse/eltlparse.yy b/src/eltlparse/eltlparse.yy index 206e92be3..9ec813185 100644 --- a/src/eltlparse/eltlparse.yy +++ b/src/eltlparse/eltlparse.yy @@ -400,20 +400,20 @@ nfa_arg: ARG subformula: ATOMIC_PROP { - $$ = parse_environment.require(*$1); - if (!$$) - { - std::string s = "unknown atomic proposition `"; - s += *$1; - s += "' in environment `"; - s += parse_environment.name(); - s += "'"; - PARSE_ERROR(@1, s); - delete $1; - YYERROR; - } - else - delete $1; + $$ = parse_environment.require(*$1); + if (!$$) + { + std::string s = "unknown atomic proposition `"; + s += *$1; + s += "' in environment `"; + s += parse_environment.name(); + s += "'"; + PARSE_ERROR(@1, s); + delete $1; + YYERROR; + } + else + delete $1; } | subformula ATOMIC_PROP subformula { @@ -425,6 +425,8 @@ subformula: ATOMIC_PROP v.push_back($1); v.push_back($3); $$ = instanciate(i->second, v); + spot::ltl::destroy($1); + spot::ltl::destroy($3); } else { @@ -445,6 +447,9 @@ subformula: ATOMIC_PROP { CHECK_ARITY(@1, $1, $3->size(), formula_tree::arity(i->second)); $$ = instanciate(i->second, *$3); + automatop::vec::iterator it = $3->begin(); + while (it != $3->end()) + spot::ltl::destroy(*it++); delete $3; } else diff --git a/src/eltltest/nfa.cc b/src/eltltest/nfa.cc index 977e87b3a..6722babee 100644 --- a/src/eltltest/nfa.cc +++ b/src/eltltest/nfa.cc @@ -22,6 +22,7 @@ #include #include #include +#include "ltlast/formula_tree.hh" #include "ltlast/nfa.hh" using namespace spot::ltl; @@ -37,7 +38,7 @@ dfs(nfa& a, const nfa::state* s, mset& m) for (nfa::iterator i = a.begin(s); i != a.end(s); ++i) { - std::cout << (*i)->label << std::endl; + std::cout << (*i)->lbl << std::endl; dfs(a, (*i)->dst, m); } } @@ -47,8 +48,13 @@ main() { nfa a; - a.add_transition(0, 1, 1); - a.add_transition(1, 2, 2); + formula_tree::node_atomic* n1 = new formula_tree::node_atomic; + formula_tree::node_atomic* n2 = new formula_tree::node_atomic; + n1->i = 1; + n2->i = 2; + + a.add_transition(0, 1, formula_tree::node_ptr(n1)); + a.add_transition(1, 2, formula_tree::node_ptr(n2)); std::cout << "init: " << a.format_state(a.get_init_state()) << std::endl; diff --git a/src/tgbaalgos/eltl2tgba_lacim.cc b/src/tgbaalgos/eltl2tgba_lacim.cc index 2f0bcf19e..19a580af8 100644 --- a/src/tgbaalgos/eltl2tgba_lacim.cc +++ b/src/tgbaalgos/eltl2tgba_lacim.cc @@ -92,11 +92,9 @@ namespace spot { // Ensure finish_[node->child()] has been computed if // node->child() is an automaton operator. - bdd f = recurse(node->child()); + res_ = recurse(node->child()); finish_map_::const_iterator it = finish_.find(node->child()); - if (it == finish_.end()) - res_ = f; - else + if (it != finish_.end()) res_ = finish_[node->child()]; return; } @@ -240,7 +238,9 @@ namespace spot bdd tmpacc = bddfalse; for (nfa::iterator i = nfa->begin(s); i != nfa->end(s); ++i) { - bdd f = recurse(formula_tree::instanciate((*i)->lbl, v)); + const formula* lbl = formula_tree::instanciate((*i)->lbl, v); + bdd f = recurse(lbl); + destroy(lbl); if (nfa->is_final((*i)->dst)) { tmp1 |= f; @@ -290,7 +290,7 @@ namespace spot // Traverse the formula and draft the automaton in a factory. tgba_bdd_concrete_factory fact(dict); eltl_trad_visitor v(fact, true); - f2->accept(v); + f->accept(v); ltl::destroy(f2); fact.finish();