mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-09-14 22:36:01 -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->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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user