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->lins);
namespace_release(concr->lincats); namespace_release(concr->lincats);
namespace_release(concr->printnames); namespace_release(concr->printnames);
phrasetable_release(concr->phrasetable);
PgfDB::free(concr, concr->name.size+1); 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) void phrasetable_iter(PgfPhrasetable table, ref<PgfConcrLincat> lincat, std::function<void(ref<PgfSymbolCCat> arg,size_t,vector<ref<PgfItem>>)> &f)
{ {
if (table == 0) 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) vector<ref<PgfItem>> phrasetable_lookup(PgfPhrasetable table, PgfSymbol sym, size_t *n_items)
{ {
while (table != 0) { while (table != 0) {
@@ -438,6 +440,7 @@ vector<ref<PgfItem>> phrasetable_lookup(PgfPhrasetable table, PgfSymbol sym, siz
return 0; return 0;
} }
PGF_INTERNAL
vector<ref<PgfItem>> phrasetable_lookup(PgfPhrasetable phrasetable, vector<ref<PgfItem>> phrasetable_lookup(PgfPhrasetable phrasetable,
ref<PgfConcrLincat> lincat, ref<PgfConcrLincat> lincat,
size_t *n_items) size_t *n_items)
@@ -826,3 +829,17 @@ PgfPhrasetable phrasetable_insert(PgfPhrasetable table,
return new_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; } 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_alt;
uint16_t pre_dot; uint16_t pre_dot;
uint16_t dot; uint16_t dot;
@@ -91,4 +99,7 @@ void phrasetable_lookup_cohorts(PgfPhrasetable phrasetable,
bool case_sensitive, bool case_sensitive,
PgfPhraseScanner *scanner, PgfExn* err); PgfPhraseScanner *scanner, PgfExn* err);
PGF_INTERNAL_DECL
void phrasetable_release(PgfPhrasetable table);
#endif #endif