mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-08-19 10:46:22 -06:00
release the phrasetable when the concrete syntax is released
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user