1
0
forked from GitHub/gf-core

another memory leak patch

This commit is contained in:
Krasimir Angelov
2024-01-10 11:13:17 +01:00
parent 0078be88c7
commit bbbdb7093c
2 changed files with 12 additions and 8 deletions

View File

@@ -1381,7 +1381,7 @@ PgfParser::PgfParser(ref<PgfConcr> concr, ref<PgfConcrLincat> start, PgfText *se
this->before->nodes.push_back(node); this->before->nodes.push_back(node);
} }
void PgfParser::shift(StackNode *parent, ref<PgfConcrLincat> lincat, size_t r, Production *prod, bool PgfParser::shift(StackNode *parent, ref<PgfConcrLincat> lincat, size_t r, Production *prod,
Stage *before, Stage *after) Stage *before, Stage *after)
{ {
ref<Vector<PgfLRShift>> shifts = vector_elem(concr->lrtable,parent->state_id)->shifts; ref<Vector<PgfLRShift>> shifts = vector_elem(concr->lrtable,parent->state_id)->shifts;
@@ -1402,11 +1402,13 @@ void PgfParser::shift(StackNode *parent, ref<PgfConcrLincat> lincat, size_t r, P
after->nodes.push_back(node); after->nodes.push_back(node);
} }
bool added = false;
if (std::find(node->choice->prods.begin(), node->choice->prods.end(), prod) == node->choice->prods.end()) { if (std::find(node->choice->prods.begin(), node->choice->prods.end(), prod) == node->choice->prods.end()) {
node->choice->prods.push_back(prod); node->choice->prods.push_back(prod);
#ifdef DEBUG_PARSER #ifdef DEBUG_PARSER
print_prod(node->choice, prod); print_prod(node->choice, prod);
#endif #endif
added = true;
} }
if (std::find(node->parents.begin(), node->parents.end(), parent) == node->parents.end()) { if (std::find(node->parents.begin(), node->parents.end(), parent) == node->parents.end()) {
@@ -1416,9 +1418,11 @@ void PgfParser::shift(StackNode *parent, ref<PgfConcrLincat> lincat, size_t r, P
#endif #endif
} }
break; return added;
} }
} }
return false;
} }
void PgfParser::shift(StackNode *parent, Stage *before) void PgfParser::shift(StackNode *parent, Stage *before)
@@ -1695,10 +1699,11 @@ void PgfParser::match(ref<PgfConcrLin> lin, size_t seq_index, PgfExn* err)
size_t index = seq_index / lin->lincat->fields->len; size_t index = seq_index / lin->lincat->fields->len;
size_t r = seq_index % lin->lincat->fields->len; size_t r = seq_index % lin->lincat->fields->len;
Production *prod = new(lin,index) Production();
for (StackNode *parent : before->nodes) { for (StackNode *parent : before->nodes) {
shift(parent, lin->lincat, r, prod, before, after); Production *prod = new(lin,index) Production();
if (!shift(parent, lin->lincat, r, prod, before, after)) {
delete prod;
}
} }
} }
@@ -1897,7 +1902,6 @@ PgfParser::~PgfParser()
u->free_ref(expr); u->free_ref(expr);
} }
std::priority_queue<ExprState*, std::vector<ExprState*>, CompareExprState> queue;
while (!queue.empty()) { while (!queue.empty()) {
ExprState *state = queue.top(); queue.pop(); ExprState *state = queue.top(); queue.pop();
delete state; delete state;

View File

@@ -127,7 +127,7 @@ class PGF_INTERNAL_DECL PgfParser : public PgfPhraseScanner, public PgfExprEnum
Choice *top_choice; Choice *top_choice;
size_t top_choice_index; size_t top_choice_index;
void shift(StackNode *parent, ref<PgfConcrLincat> lincat, size_t r, Production *prod, bool shift(StackNode *parent, ref<PgfConcrLincat> lincat, size_t r, Production *prod,
Stage *before, Stage *after); Stage *before, Stage *after);
void shift(StackNode *parent, Stage *before); void shift(StackNode *parent, Stage *before);
void shift(StackNode *parent, Stage *before, Stage *after); void shift(StackNode *parent, Stage *before, Stage *after);
@@ -156,7 +156,7 @@ class PGF_INTERNAL_DECL PgfParser : public PgfPhraseScanner, public PgfExprEnum
public: public:
PgfParser(ref<PgfConcr> concr, ref<PgfConcrLincat> start, PgfText *sentence, bool case_sensitive, PgfMarshaller *m, PgfUnmarshaller *u); PgfParser(ref<PgfConcr> concr, ref<PgfConcrLincat> start, PgfText *sentence, bool case_sensitive, PgfMarshaller *m, PgfUnmarshaller *u);
~PgfParser(); virtual ~PgfParser();
virtual void space(PgfTextSpot *start, PgfTextSpot *end, PgfExn* err); virtual void space(PgfTextSpot *start, PgfTextSpot *end, PgfExn* err);
virtual void start_matches(PgfTextSpot *end, PgfExn* err); virtual void start_matches(PgfTextSpot *end, PgfExn* err);