fixed 3 leaks in creating pattern values

This commit is contained in:
Vern Paxson 2018-06-26 10:43:06 -07:00
parent 610d1ae407
commit 2fa1ea77e4
4 changed files with 49 additions and 5 deletions

View file

@ -12,6 +12,7 @@ NFA_State::NFA_State(int arg_sym, EquivClass* ec)
sym = arg_sym;
ccl = 0;
accept = NO_ACCEPT;
first_trans_is_back_ref = false;
mark = 0;
epsclosure = 0;
id = ++nfa_state_id;
@ -33,6 +34,7 @@ NFA_State::NFA_State(CCL* arg_ccl)
sym = SYM_CCL;
ccl = arg_ccl;
accept = NO_ACCEPT;
first_trans_is_back_ref = false;
mark = 0;
id = ++nfa_state_id;
epsclosure = 0;
@ -41,7 +43,8 @@ NFA_State::NFA_State(CCL* arg_ccl)
NFA_State::~NFA_State()
{
for ( int i = 0; i < xtions.length(); ++i )
Unref(xtions[i]);
if ( i > 0 || ! first_trans_is_back_ref )
Unref(xtions[i]);
delete epsclosure;
}
@ -247,7 +250,10 @@ void NFA_Machine::MakePositiveClosure()
{
AppendEpsilon();
final_state->AddXtion(first_state);
Ref(first_state);
// Don't Ref the state the final epsilon points to, otherwise we'll
// have reference cycles that lead to leaks.
final_state->SetFirstTransIsBackRef();
}
void NFA_Machine::MakeRepl(int lower, int upper)
@ -307,6 +313,13 @@ NFA_Machine* make_alternate(NFA_Machine* m1, NFA_Machine* m2)
m2->AppendState(last);
Ref(last);
// Keep these around.
Ref(m1->FirstState());
Ref(m2->FirstState());
Unref(m1);
Unref(m2);
return new NFA_Machine(first, last);
}