release the phrasetable when the concrete syntax is released

This commit is contained in:
Krasimir Angelov
2026-08-04 15:41:57 +02:00
parent 21c5280908
commit 696c3705a2
3 changed files with 29 additions and 0 deletions
+1
View File
@@ -41,6 +41,7 @@ void PgfConcr::release(ref<PgfConcr> concr)
namespace_release(concr->lins);
namespace_release(concr->lincats);
namespace_release(concr->printnames);
phrasetable_release(concr->phrasetable);
PgfDB::free(concr, concr->name.size+1);
}
+17
View File
@@ -394,6 +394,7 @@ int symbol_cmp(PgfSymbol sym1, PgfSymbol sym2)
}
}
PGF_INTERNAL
void phrasetable_iter(PgfPhrasetable table, ref<PgfConcrLincat> lincat, std::function<void(ref<PgfSymbolCCat> arg,size_t,vector<ref<PgfItem>>)> &f)
{
if (table == 0)
@@ -420,6 +421,7 @@ void phrasetable_iter(PgfPhrasetable table, ref<PgfConcrLincat> lincat, std::fun
}
}
PGF_INTERNAL
vector<ref<PgfItem>> phrasetable_lookup(PgfPhrasetable table, PgfSymbol sym, size_t *n_items)
{
while (table != 0) {
@@ -438,6 +440,7 @@ vector<ref<PgfItem>> phrasetable_lookup(PgfPhrasetable table, PgfSymbol sym, siz
return 0;
}
PGF_INTERNAL
vector<ref<PgfItem>> phrasetable_lookup(PgfPhrasetable phrasetable,
ref<PgfConcrLincat> lincat,
size_t *n_items)
@@ -826,3 +829,17 @@ PgfPhrasetable phrasetable_insert(PgfPhrasetable table,
return new_table;
}
}
PGF_INTERNAL
void phrasetable_release(PgfPhrasetable table)
{
if (table == 0)
return;
phrasetable_release(table->left);
phrasetable_release(table->right);
for (size_t i = 0; i < table->value.n_items; i++) {
PgfItem::release(table->value.items[i]);
}
vector<ref<PgfItem>>::release(table->value.items);
Node<PgfPhrasetableValue>::release(table);
}
+11
View File
@@ -32,6 +32,14 @@ struct PGF_INTERNAL_DECL PgfItem {
}
} args;
static
void release(ref<PgfItem> item) {
size_t ex_size =
sizeof(ref<PgfSymbolCCat>) * item->args.size() +
sizeof(size_t) * item->vars.size();
PgfDB::free(item, ex_size);
}
uint16_t pre_alt;
uint16_t pre_dot;
uint16_t dot;
@@ -91,4 +99,7 @@ void phrasetable_lookup_cohorts(PgfPhrasetable phrasetable,
bool case_sensitive,
PgfPhraseScanner *scanner, PgfExn* err);
PGF_INTERNAL_DECL
void phrasetable_release(PgfPhrasetable table);
#endif