mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-09 04:59:31 -06:00
we no longer maintain an explicit list of functions per category since now it is implicitly kept in the JIT compiled code
This commit is contained in:
@@ -92,7 +92,6 @@ typedef struct {
|
||||
prob_t meta_token_prob;
|
||||
PgfMetaChildMap* meta_child_probs;
|
||||
|
||||
GuBuf* functions; // -->PgfAbsFun
|
||||
void* predicate;
|
||||
} PgfAbsCat;
|
||||
|
||||
|
||||
@@ -86,8 +86,8 @@ pgf_jit_make_space(PgfJitState* state)
|
||||
}
|
||||
|
||||
void
|
||||
pgf_jit_predicate(PgfJitState* state,
|
||||
PgfCIdMap* abscats, PgfAbsCat* abscat)
|
||||
pgf_jit_predicate(PgfJitState* state, PgfCIdMap* abscats,
|
||||
PgfAbsCat* abscat, GuBuf* functions)
|
||||
{
|
||||
#ifdef PGF_JIT_DEBUG
|
||||
GuPool* tmp_pool = gu_new_pool();
|
||||
@@ -101,7 +101,7 @@ pgf_jit_predicate(PgfJitState* state,
|
||||
int label = 0;
|
||||
#endif
|
||||
|
||||
size_t n_funs = gu_buf_length(abscat->functions);
|
||||
size_t n_funs = gu_buf_length(functions);
|
||||
|
||||
pgf_jit_make_space(state);
|
||||
|
||||
@@ -111,7 +111,7 @@ pgf_jit_predicate(PgfJitState* state,
|
||||
|
||||
if (n_funs > 0) {
|
||||
PgfAbsFun* absfun =
|
||||
gu_buf_get(abscat->functions, PgfAbsFun*, 0);
|
||||
gu_buf_get(functions, PgfAbsFun*, 0);
|
||||
|
||||
#ifdef PGF_JIT_DEBUG
|
||||
gu_puts(" TRY_FIRST ", wtr, err);
|
||||
@@ -142,7 +142,7 @@ pgf_jit_predicate(PgfJitState* state,
|
||||
#ifdef PGF_JIT_DEBUG
|
||||
if (n_funs > 0) {
|
||||
PgfAbsFun* absfun =
|
||||
gu_buf_get(abscat->functions, PgfAbsFun*, 0);
|
||||
gu_buf_get(functions, PgfAbsFun*, 0);
|
||||
|
||||
gu_string_write(absfun->name, wtr, err);
|
||||
gu_puts(":\n", wtr, err);
|
||||
@@ -151,7 +151,7 @@ pgf_jit_predicate(PgfJitState* state,
|
||||
|
||||
for (size_t i = 0; i < n_funs; i++) {
|
||||
PgfAbsFun* absfun =
|
||||
gu_buf_get(abscat->functions, PgfAbsFun*, i);
|
||||
gu_buf_get(functions, PgfAbsFun*, i);
|
||||
|
||||
pgf_jit_make_space(state);
|
||||
|
||||
@@ -168,7 +168,7 @@ pgf_jit_predicate(PgfJitState* state,
|
||||
if (n_hypos > 0) {
|
||||
if (i+1 < n_funs) {
|
||||
PgfAbsFun* absfun =
|
||||
gu_buf_get(abscat->functions, PgfAbsFun*, i+1);
|
||||
gu_buf_get(functions, PgfAbsFun*, i+1);
|
||||
|
||||
#ifdef PGF_JIT_DEBUG
|
||||
gu_puts(" TRY_ELSE ", wtr, err);
|
||||
@@ -246,7 +246,7 @@ pgf_jit_predicate(PgfJitState* state,
|
||||
} else {
|
||||
if (i+1 < n_funs) {
|
||||
PgfAbsFun* absfun =
|
||||
gu_buf_get(abscat->functions, PgfAbsFun*, i+1);
|
||||
gu_buf_get(functions, PgfAbsFun*, i+1);
|
||||
|
||||
#ifdef PGF_JIT_DEBUG
|
||||
gu_puts(" TRY_CONSTANT ", wtr, err);
|
||||
@@ -284,7 +284,7 @@ pgf_jit_predicate(PgfJitState* state,
|
||||
#ifdef PGF_JIT_DEBUG
|
||||
if (i+1 < n_funs) {
|
||||
PgfAbsFun* absfun =
|
||||
gu_buf_get(abscat->functions, PgfAbsFun*, i+1);
|
||||
gu_buf_get(functions, PgfAbsFun*, i+1);
|
||||
|
||||
gu_string_write(absfun->name, wtr, err);
|
||||
gu_puts(":\n", wtr, err);
|
||||
|
||||
@@ -10,7 +10,7 @@ void
|
||||
pgf_jit_done(PgfJitState* state, PgfAbstr* abstr);
|
||||
|
||||
void
|
||||
pgf_jit_predicate(PgfJitState* state,
|
||||
PgfCIdMap* abscats, PgfAbsCat* abscat);
|
||||
pgf_jit_predicate(PgfJitState* state, PgfCIdMap* abscats,
|
||||
PgfAbsCat* abscat, GuBuf* functions);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -151,35 +151,31 @@ pgf_iter_functions(PgfPGF* pgf, GuMapItor* fn, GuExn* err)
|
||||
gu_map_iter(pgf->abstract.funs, fn, err);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
GuMapItor fn;
|
||||
PgfCId catname;
|
||||
GuMapItor* client_fn;
|
||||
} PgfFunByCatIter;
|
||||
|
||||
static void
|
||||
pgf_filter_by_cat(GuMapItor* fn, const void* key, void* value, GuExn* err)
|
||||
{
|
||||
(void) (key && err);
|
||||
|
||||
PgfFunByCatIter* clo = (PgfFunByCatIter*) fn;
|
||||
PgfAbsFun* absfun = *((PgfAbsFun**) value);
|
||||
|
||||
if (gu_string_eq(absfun->type->cid, clo->catname)) {
|
||||
clo->client_fn->fn(clo->client_fn, &absfun->name, NULL, err);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
pgf_iter_functions_by_cat(PgfPGF* pgf, PgfCId catname,
|
||||
GuMapItor* fn, GuExn* err)
|
||||
{
|
||||
PgfAbsCat* abscat =
|
||||
gu_map_get(pgf->abstract.cats, &catname, PgfAbsCat*);
|
||||
if (abscat == NULL) {
|
||||
gu_raise(err, PgfExn);
|
||||
return;
|
||||
}
|
||||
|
||||
size_t n_functions = gu_buf_length(abscat->functions);
|
||||
for (size_t i = 0; i < n_functions; i++) {
|
||||
PgfAbsFun* fun =
|
||||
gu_buf_get(abscat->functions, PgfAbsFun*, i);
|
||||
|
||||
GuVariantInfo i = gu_variant_open(fun->ep.expr);
|
||||
switch (i.tag) {
|
||||
case PGF_EXPR_FUN: {
|
||||
PgfExprFun* efun = i.data;
|
||||
fn->fn(fn, &efun->fun, NULL, err);
|
||||
if (!gu_ok(err))
|
||||
return;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
gu_impossible();
|
||||
}
|
||||
}
|
||||
PgfFunByCatIter clo = { { pgf_filter_by_cat }, catname, fn };
|
||||
gu_map_iter(pgf->abstract.funs, &clo.fn, err);
|
||||
}
|
||||
|
||||
GuString
|
||||
|
||||
@@ -23,6 +23,7 @@ struct PgfReader {
|
||||
GuIn* in;
|
||||
GuExn* err;
|
||||
GuPool* opool;
|
||||
GuPool* tmp_pool;
|
||||
GuSymTable* symtab;
|
||||
PgfJitState* jit_state;
|
||||
};
|
||||
@@ -517,7 +518,7 @@ pgf_read_abscat(PgfReader* rdr, PgfAbstr* abstr, PgfCIdMap* abscats)
|
||||
abscat->meta_token_prob = INFINITY;
|
||||
abscat->meta_child_probs = NULL;
|
||||
|
||||
abscat->functions = gu_new_buf(PgfAbsFun*, rdr->opool);
|
||||
GuBuf* functions = gu_new_buf(PgfAbsFun*, rdr->tmp_pool);
|
||||
|
||||
size_t n_functions = pgf_read_len(rdr);
|
||||
gu_return_on_exn(rdr->err, NULL);
|
||||
@@ -531,10 +532,10 @@ pgf_read_abscat(PgfReader* rdr, PgfAbstr* abstr, PgfCIdMap* abscats)
|
||||
|
||||
PgfAbsFun* absfun =
|
||||
gu_map_get(abstr->funs, &name, PgfAbsFun*);
|
||||
gu_buf_push(abscat->functions, PgfAbsFun*, absfun);
|
||||
gu_buf_push(functions, PgfAbsFun*, absfun);
|
||||
}
|
||||
|
||||
pgf_jit_predicate(rdr->jit_state, abscats, abscat);
|
||||
|
||||
pgf_jit_predicate(rdr->jit_state, abscats, abscat, functions);
|
||||
|
||||
return abscat;
|
||||
}
|
||||
@@ -1188,6 +1189,7 @@ pgf_new_reader(GuIn* in, GuPool* opool, GuPool* tmp_pool, GuExn* err)
|
||||
{
|
||||
PgfReader* rdr = gu_new(PgfReader, tmp_pool);
|
||||
rdr->opool = opool;
|
||||
rdr->tmp_pool = tmp_pool;
|
||||
rdr->symtab = gu_new_symtable(opool, tmp_pool);
|
||||
rdr->err = err;
|
||||
rdr->in = in;
|
||||
|
||||
Reference in New Issue
Block a user