From 696c3705a217931333e2c7b129a68480dbba1a33 Mon Sep 17 00:00:00 2001 From: Krasimir Angelov Date: Tue, 4 Aug 2026 15:41:57 +0200 Subject: [PATCH] release the phrasetable when the concrete syntax is released --- src/runtime/c/pgf/data.cxx | 1 + src/runtime/c/pgf/phrasetable.cxx | 17 +++++++++++++++++ src/runtime/c/pgf/phrasetable.h | 11 +++++++++++ 3 files changed, 29 insertions(+) diff --git a/src/runtime/c/pgf/data.cxx b/src/runtime/c/pgf/data.cxx index 0b15e9f8b..fda0f80b1 100644 --- a/src/runtime/c/pgf/data.cxx +++ b/src/runtime/c/pgf/data.cxx @@ -41,6 +41,7 @@ void PgfConcr::release(ref concr) namespace_release(concr->lins); namespace_release(concr->lincats); namespace_release(concr->printnames); + phrasetable_release(concr->phrasetable); PgfDB::free(concr, concr->name.size+1); } diff --git a/src/runtime/c/pgf/phrasetable.cxx b/src/runtime/c/pgf/phrasetable.cxx index a7d17152d..f1caa5833 100644 --- a/src/runtime/c/pgf/phrasetable.cxx +++ b/src/runtime/c/pgf/phrasetable.cxx @@ -394,6 +394,7 @@ int symbol_cmp(PgfSymbol sym1, PgfSymbol sym2) } } +PGF_INTERNAL void phrasetable_iter(PgfPhrasetable table, ref lincat, std::function arg,size_t,vector>)> &f) { if (table == 0) @@ -420,6 +421,7 @@ void phrasetable_iter(PgfPhrasetable table, ref lincat, std::fun } } +PGF_INTERNAL vector> phrasetable_lookup(PgfPhrasetable table, PgfSymbol sym, size_t *n_items) { while (table != 0) { @@ -438,6 +440,7 @@ vector> phrasetable_lookup(PgfPhrasetable table, PgfSymbol sym, siz return 0; } +PGF_INTERNAL vector> phrasetable_lookup(PgfPhrasetable phrasetable, ref 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>::release(table->value.items); + Node::release(table); +} diff --git a/src/runtime/c/pgf/phrasetable.h b/src/runtime/c/pgf/phrasetable.h index a238935a3..a952774ab 100644 --- a/src/runtime/c/pgf/phrasetable.h +++ b/src/runtime/c/pgf/phrasetable.h @@ -32,6 +32,14 @@ struct PGF_INTERNAL_DECL PgfItem { } } args; + static + void release(ref item) { + size_t ex_size = + sizeof(ref) * 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