fix memory leaks

This commit is contained in:
Krasimir Angelov
2025-11-17 21:44:29 +01:00
parent a8ba57d822
commit 603bca8afd
+27 -13
View File
@@ -148,7 +148,7 @@ void PgfAbstractParser::symbol(Item *item, const PgfTextSpot &spot, bool bind, P
cont->state = state; cont->state = state;
} }
cont->suspended.push_back(item); cont->suspended.push_back(new_item);
if (cont->suspended.size() == 1) { if (cont->suspended.size() == 1) {
for (Production *prod : cont->ccat->prods) { for (Production *prod : cont->ccat->prods) {
@@ -174,6 +174,8 @@ void PgfAbstractParser::symbol(Item *item, const PgfTextSpot &spot, bool bind, P
} }
} }
} }
delete item;
} }
break; break;
} }
@@ -202,7 +204,7 @@ void PgfAbstractParser::symbol(Item *item, const PgfTextSpot &spot, bool bind, P
process(new_item, spot, bind); process(new_item, spot, bind);
} }
// delete item; delete item;
break; break;
} }
case PgfSymbolBIND::tag: { case PgfSymbolBIND::tag: {
@@ -212,10 +214,14 @@ void PgfAbstractParser::symbol(Item *item, const PgfTextSpot &spot, bool bind, P
case PgfSymbolSOFTBIND::tag: case PgfSymbolSOFTBIND::tag:
case PgfSymbolSOFTSPACE::tag: { case PgfSymbolSOFTSPACE::tag: {
item->dot++; item->dot++;
process(item, spot, true); process(new (item) Item, spot, true);
process(item, spot, false); process(new (item) Item, spot, false);
delete item;
break; break;
} }
case PgfSymbolNE::tag:
delete item;
break;
case PgfSymbolCAPIT::tag: case PgfSymbolCAPIT::tag:
case PgfSymbolALLCAPIT::tag: case PgfSymbolALLCAPIT::tag:
item->dot++; item->dot++;
@@ -340,9 +346,9 @@ void PgfAbstractParser::complete(Item *item, const PgfTextSpot &spot, bool bind)
if (ccat->prods.size() == 1) { if (ccat->prods.size() == 1) {
if (ccat->cont->ccat == NULL) if (ccat->cont->ccat == NULL)
bu_predict(concr->phrasetable, state, ccat); bu_predict(concr->phrasetable, state, ccat);
size_t n_items = item->cont->suspended.size(); size_t n_items = ccat->cont->suspended.size();
for (size_t i = 0; i < n_items; i++) { for (size_t i = 0; i < n_items; i++) {
Item *new_item = new (item->cont->suspended[i]) Item; Item *new_item = new (ccat->cont->suspended[i]) Item;
combine(state,new_item,ccat); combine(state,new_item,ccat);
}; };
} else { } else {
@@ -367,6 +373,8 @@ void PgfAbstractParser::complete(Item *item, const PgfTextSpot &spot, bool bind)
break; break;
} }
} }
delete item;
} }
bool PgfAbstractParser::Item::instantiate(ref<PgfLParam> lparam,size_t value) bool PgfAbstractParser::Item::instantiate(ref<PgfLParam> lparam,size_t value)
@@ -575,11 +583,11 @@ void PgfAbstractParser::combine(State *state, Item *item, CCat *ccat)
auto sym_cat = ref<PgfSymbolCat>::untagged(sym); auto sym_cat = ref<PgfSymbolCat>::untagged(sym);
if (!item->instantiate(item->rule->args[sym_cat->d],ccat->value)) { if (!item->instantiate(item->rule->args[sym_cat->d],ccat->value)) {
// delete item; delete item;
return; return;
} }
if (!item->instantiate(ref<PgfLParam>::from_ptr(&sym_cat->r),ccat->lin_idx)) { if (!item->instantiate(ref<PgfLParam>::from_ptr(&sym_cat->r),ccat->lin_idx)) {
// delete item; delete item;
return; return;
} }
item->dot++; item->dot++;
@@ -1220,19 +1228,19 @@ void PgfAbstractParser::td_predict(State *state, Cont *cont, Production *prod, s
item->rule = rule; item->rule = rule;
if (!item->instantiate(item->rule->res, cont->ccat->value)) { if (!item->instantiate(item->rule->res, cont->ccat->value)) {
// delete item; delete item;
continue; continue;
} }
if (!item->instantiate(item->rule->lin_idx, lin_idx)) { if (!item->instantiate(item->rule->lin_idx, lin_idx)) {
// delete item; delete item;
continue; continue;
} }
for (size_t i = 0; i < item->args.size(); i++) { for (size_t i = 0; i < item->args.size(); i++) {
if (prod->args[i] != NULL) { if (prod->args[i] != NULL) {
if (!item->instantiate(item->rule->args[i], prod->args[i]->value)) { if (!item->instantiate(item->rule->args[i], prod->args[i]->value)) {
// delete item; delete item;
goto next; goto next;
} }
} else { } else {
@@ -1272,10 +1280,14 @@ void PgfParser::suspend(State *state,ref<PgfConcrLincat> lincat,Item *item)
Item *new_item = new (item) Item; Item *new_item = new (item) Item;
PgfSymbol sym = new_item->rule->syms[new_item->dot]; PgfSymbol sym = new_item->rule->syms[new_item->dot];
auto sym_cat = ref<PgfSymbolCat>::untagged(sym); auto sym_cat = ref<PgfSymbolCat>::untagged(sym);
if (!new_item->instantiate(new_item->rule->args[sym_cat->d],symcf->value)) if (!new_item->instantiate(new_item->rule->args[sym_cat->d],symcf->value)) {
delete new_item;
return; return;
if (!new_item->instantiate(ref<PgfLParam>::from_ptr(&sym_cat->r),symcf->lin_idx)) }
if (!new_item->instantiate(ref<PgfLParam>::from_ptr(&sym_cat->r),symcf->lin_idx)) {
delete new_item;
return; return;
}
new_item->dot++; new_item->dot++;
new_item->args[sym_cat->d] = new_item->args[sym_cat->d] =
@@ -1398,6 +1410,7 @@ void PgfParseTableMaker::symbol_token(Item *item, const PgfTextSpot &spot, bool
auto pitem = clone_item(item); auto pitem = clone_item(item);
auto phrasetable = phrasetable_insert(concr->phrasetable,sym,pitem); auto phrasetable = phrasetable_insert(concr->phrasetable,sym,pitem);
concr->phrasetable = phrasetable; concr->phrasetable = phrasetable;
delete item;
} }
void PgfParseTableMaker::symbol_bind(Item *item, const PgfTextSpot &spot, PgfSymbol sym) void PgfParseTableMaker::symbol_bind(Item *item, const PgfTextSpot &spot, PgfSymbol sym)
@@ -1405,6 +1418,7 @@ void PgfParseTableMaker::symbol_bind(Item *item, const PgfTextSpot &spot, PgfSym
auto pitem = clone_item(item); auto pitem = clone_item(item);
auto phrasetable = phrasetable_insert(concr->phrasetable,sym,pitem); auto phrasetable = phrasetable_insert(concr->phrasetable,sym,pitem);
concr->phrasetable = phrasetable; concr->phrasetable = phrasetable;
delete item;
} }
void PgfParseTableMaker::suspend(State *state,ref<PgfConcrLincat> lincat,Item *item) void PgfParseTableMaker::suspend(State *state,ref<PgfConcrLincat> lincat,Item *item)