first draft of the new allocator with transactions support

This commit is contained in:
Krasimir Angelov
2022-05-20 13:55:45 +02:00
parent 546dc01b5d
commit 5594679a83
24 changed files with 1582 additions and 2372 deletions

View File

@@ -2,31 +2,31 @@
void PgfFlag::release(ref<PgfFlag> flag)
{
pgf_literal_free(flag->value);
PgfDB::free(flag);
pgf_literal_release(flag->value);
PgfDB::free(flag, flag->name.size+1);
}
void PgfAbsFun::release(ref<PgfAbsFun> absfun)
{
pgf_type_free(absfun->type);
pgf_type_release(absfun->type);
if (absfun->bytecode != 0) {
PgfDB::free(absfun->bytecode);
}
PgfDB::free(absfun);
PgfDB::free(absfun, absfun->name.size+1);
}
void PgfAbsCat::release(ref<PgfAbsCat> abscat)
{
pgf_context_free(abscat->context);
PgfDB::free(abscat);
pgf_context_release(abscat->context);
PgfDB::free(abscat, abscat->name.size+1);
}
void PgfPGF::release(ref<PgfPGF> pgf)
{
namespace_release(pgf->gflags);
PgfDB::free(pgf->abstract.name);
text_db_release(pgf->abstract.name);
namespace_release(pgf->abstract.aflags);
namespace_release(pgf->abstract.funs);
namespace_release(pgf->abstract.cats);
@@ -41,112 +41,112 @@ void PgfConcr::release(ref<PgfConcr> concr)
namespace_release(concr->lincats);
phrasetable_release(concr->phrasetable);
namespace_release(concr->printnames);
PgfDB::free(concr);
PgfDB::free(concr, concr->name.size+1);
}
void PgfConcrLincat::release(ref<PgfConcrLincat> lincat)
{
for (size_t i = 0; i < lincat->fields->len; i++) {
PgfDB::free(*vector_elem(lincat->fields, i));
text_db_release(*vector_elem(lincat->fields, i));
}
Vector<ref<PgfText>>::release(lincat->fields);
PgfDB::free(lincat->fields);
for (size_t i = 0; i < lincat->args->len; i++) {
PgfDB::free(vector_elem(lincat->args, i)->param);
PgfLParam::release(vector_elem(lincat->args, i)->param);
}
PgfDB::free(lincat->args);
Vector<PgfPArg>::release(lincat->args);
for (size_t i = 0; i < lincat->res->len; i++) {
ref<PgfPResult> res = *vector_elem(lincat->res, i);
if (res->vars != 0)
PgfDB::free(res->vars);
PgfDB::free(res);
PgfPResult::release(*vector_elem(lincat->res, i));
}
PgfDB::free(lincat->res);
Vector<ref<PgfPResult>>::release(lincat->res);
for (size_t i = 0; i < lincat->seqs->len; i++) {
ref<PgfSequence> seq = *vector_elem(lincat->seqs, i);
if (!(--seq->ref_count)) {
PgfSequence::release(seq);
}
}
PgfDB::free(lincat->seqs);
Vector<ref<PgfSequence>>::release(lincat->seqs);
PgfDB::free(lincat);
PgfDB::free(lincat, lincat->name.size+1);
}
PGF_INTERNAL
void pgf_symbol_free(PgfSymbol sym)
void PgfLParam::release(ref<PgfLParam> param)
{
switch (ref<PgfSymbol>::get_tag(sym)) {
case PgfSymbolKP::tag: {
auto sym_kp = ref<PgfSymbolKP>::untagged(sym);
PgfSequence::release(sym_kp->default_form);
for (size_t i = 0; i < sym_kp->alts.len; i++) {
PgfSequence::release(sym_kp->alts.data[i].form);
for (size_t j = 0; j < sym_kp->alts.data[i].prefixes->len; j++) {
ref<PgfText> prefix = *vector_elem(sym_kp->alts.data[i].prefixes, j);
PgfDB::free(prefix);
}
}
PgfDB::free(sym_kp);
break;
}
case PgfSymbolBIND::tag:
case PgfSymbolSOFTBIND::tag:
case PgfSymbolNE::tag:
case PgfSymbolSOFTSPACE::tag:
case PgfSymbolCAPIT::tag:
case PgfSymbolALLCAPIT::tag:
break;
default:
PgfDB::free(ref<void>::untagged(sym));
}
PgfDB::free(param, param->n_terms*sizeof(param->terms[0]));
}
void PgfPResult::release(ref<PgfPResult> res)
{
if (res->vars != 0)
Vector<PgfVariableRange>::release(res->vars);
PgfDB::free(res, res->param.n_terms*sizeof(res->param.terms[0]));
}
void PgfSequence::release(ref<PgfSequence> seq)
{
for (size_t i = 0; i < seq->syms.len; i++) {
PgfSymbol sym = *vector_elem(&seq->syms, i);
pgf_symbol_free(sym);
}
PgfDB::free(seq);
}
void PgfSequenceBackrefs::release(ref<PgfSequenceBackrefs> backrefs)
{
PgfDB::free(backrefs);
switch (ref<PgfSymbol>::get_tag(sym)) {
case PgfSymbolCat::tag: {
auto sym_cat = ref<PgfSymbolCat>::untagged(sym);
PgfDB::free(sym_cat, sym_cat->r.n_terms*sizeof(sym_cat->r.terms[0]));
break;
}
case PgfSymbolLit::tag: {
auto sym_lit = ref<PgfSymbolLit>::untagged(sym);
PgfDB::free(sym_lit, sym_lit->r.n_terms*sizeof(sym_lit->r.terms[0]));
break;
}
case PgfSymbolVar::tag:
PgfDB::free(ref<PgfSymbolVar>::untagged(sym));
break;
case PgfSymbolKS::tag: {
auto sym_ks = ref<PgfSymbolKS>::untagged(sym);
PgfDB::free(sym_ks, sym_ks->token.size+1);
break;
}
case PgfSymbolKP::tag: {
auto sym_kp = ref<PgfSymbolKP>::untagged(sym);
PgfSequence::release(sym_kp->default_form);
for (size_t i = 0; i < sym_kp->alts.len; i++) {
PgfSequence::release(sym_kp->alts.data[i].form);
for (size_t j = 0; j < sym_kp->alts.data[i].prefixes->len; j++) {
text_db_release(*vector_elem(sym_kp->alts.data[i].prefixes, j));
}
}
PgfDB::free(sym_kp, sym_kp->alts.len*sizeof(PgfAlternative));
break;
}
case PgfSymbolBIND::tag:
case PgfSymbolSOFTBIND::tag:
case PgfSymbolNE::tag:
case PgfSymbolSOFTSPACE::tag:
case PgfSymbolCAPIT::tag:
case PgfSymbolALLCAPIT::tag:
break;
default:
throw pgf_error("Unknown symbol tag");
}
}
PgfDB::free(seq,seq->syms.len*sizeof(PgfSymbol));
}
void PgfConcrLin::release(ref<PgfConcrLin> lin)
{
for (size_t i = 0; i < lin->args->len; i++) {
PgfDB::free(vector_elem(lin->args, i)->param);
PgfLParam::release(vector_elem(lin->args, i)->param);
}
PgfDB::free(lin->args);
Vector<PgfPArg>::release(lin->args);
for (size_t i = 0; i < lin->res->len; i++) {
ref<PgfPResult> res = *vector_elem(lin->res, i);
if (res->vars != 0)
PgfDB::free(res->vars);
PgfDB::free(res);
PgfPResult::release(*vector_elem(lin->res, i));
}
PgfDB::free(lin->res);
Vector<ref<PgfPResult>>::release(lin->res);
for (size_t i = 0; i < lin->seqs->len; i++) {
ref<PgfSequence> seq = *vector_elem(lin->seqs, i);
if (!(--seq->ref_count)) {
PgfSequence::release(seq);
}
}
PgfDB::free(lin->seqs);
Vector<ref<PgfSequence>>::release(lin->seqs);
PgfDB::free(lin);
PgfDB::free(lin, lin->name.size+1);
}
void PgfConcrPrintname::release(ref<PgfConcrPrintname> printname)
{
PgfDB::free(printname->printname);
PgfDB::free(printname);
text_db_release(printname->printname);
PgfDB::free(printname, printname->name.size+1);
}