an unsafe API for adding functions to the grammar. breaks referential transparency

This commit is contained in:
krangelov
2021-09-04 07:10:04 +02:00
parent 55d30d70f5
commit 9a2d2b345d
4 changed files with 44 additions and 0 deletions

View File

@@ -362,3 +362,29 @@ PgfType pgf_read_type(PgfText *input, PgfUnmarshaller *u)
}
return res;
}
PGF_API
void pgf_create_function(PgfPGF *pgf, PgfText *name,
PgfType ty, prob_t prob,
PgfMarshaller *m)
{
DB_scope scope(pgf, WRITER_SCOPE);
PgfDBUnmarshaller u(m);
ref<PgfPGFRoot> root = pgf->get_root<PgfPGFRoot>();
ref<PgfAbsFun> absfun = DB::malloc<PgfAbsFun>(sizeof(PgfAbsFun)+name->size+1);
absfun->type = m->match_type(&u, ty);
absfun->arity = 0;
absfun->defns = 0;
absfun->ep.prob = prob;
ref<PgfExprFun> efun =
ref<PgfExprFun>::from_ptr((PgfExprFun*) &absfun->name);
absfun->ep.expr = ref<PgfExprFun>::tagged(efun);
memcpy(&absfun->name, name, sizeof(PgfText)+name->size+1);
Namespace<PgfAbsFun> nmsp =
namespace_insert(root->abstract.funs, absfun);
namespace_release(root->abstract.funs);
root->abstract.funs = nmsp;
}

View File

@@ -290,4 +290,9 @@ PgfText *pgf_print_type(PgfType ty,
PGF_API_DECL
PgfType pgf_read_type(PgfText *input, PgfUnmarshaller *u);
PGF_API_DECL
void pgf_create_function(PgfPGF *pgf, PgfText *name,
PgfType ty, prob_t prob,
PgfMarshaller *m);
#endif // PGF_H_