#include "data.h" void PgfFlag::release(ref flag) { pgf_literal_free(flag->value); } void PgfAbsFun::release(ref absfun) { pgf_type_free(absfun->type); if (absfun->bytecode != 0) { PgfDB::free(absfun->bytecode); } } void PgfAbsCat::release(ref abscat) { pgf_context_free(abscat->context); } void PgfPGF::release(ref pgf) { namespace_release(pgf->gflags); PgfDB::free(pgf->abstract.name); namespace_release(pgf->abstract.aflags); namespace_release(pgf->abstract.funs); namespace_release(pgf->abstract.cats); namespace_release(pgf->concretes); } void PgfConcr::release(ref concr) { namespace_release(concr->cflags); namespace_release(concr->lins); namespace_release(concr->lincats); namespace_release(concr->printnames); } void PgfConcrLincat::release(ref lincat) { for (size_t i = 0; i < lincat->fields->len; i++) { PgfDB::free(*vector_elem(lincat->fields, i)); } PgfDB::free(lincat->fields); } PGF_INTERNAL void pgf_symbol_free(PgfSymbol sym) { switch (ref::get_tag(sym)) { case PgfSymbolKP::tag: { auto sym_kp = ref::untagged(sym); pgf_symbols_free(sym_kp->default_form); for (size_t i = 0; i < sym_kp->alts.len; i++) { pgf_symbols_free(sym_kp->alts.data[i].form); for (size_t j = 0; j < sym_kp->alts.data[i].prefixes->len; j++) { ref prefix = *vector_elem(sym_kp->alts.data[i].prefixes, j); PgfDB::free(prefix); } } PgfDB::free(sym_kp); break; } default: PgfDB::free(ref::untagged(sym)); } } PGF_INTERNAL void pgf_symbols_free(ref> syms) { for (size_t i = 0; i < syms->len; i++) { PgfSymbol sym = *vector_elem(syms, i); pgf_symbol_free(sym); } PgfDB::free(syms); } void PgfConcrLin::release(ref lin) { for (size_t i = 0; i < lin->args->len; i++) { PgfDB::free(vector_elem(lin->args, i)->param); } PgfDB::free(lin->args); for (size_t i = 0; i < lin->res->len; i++) { PgfDB::free(*vector_elem(lin->res, i)); } PgfDB::free(lin->res); for (size_t i = 0; i < lin->seqs->len; i++) { ref> syms = *vector_elem(lin->seqs, i); for (size_t j = 0; j < syms->len; j++) { PgfSymbol sym = *vector_elem(syms, i); pgf_symbol_free(sym); } PgfDB::free(syms); } PgfDB::free(lin->seqs); } void PgfConcrPrintname::release(ref printname) { PgfDB::free(printname->printname); }