mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-23 19:42:50 -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;
|
prob_t meta_token_prob;
|
||||||
PgfMetaChildMap* meta_child_probs;
|
PgfMetaChildMap* meta_child_probs;
|
||||||
|
|
||||||
GuBuf* functions; // -->PgfAbsFun
|
|
||||||
void* predicate;
|
void* predicate;
|
||||||
} PgfAbsCat;
|
} PgfAbsCat;
|
||||||
|
|
||||||
|
|||||||
@@ -86,8 +86,8 @@ pgf_jit_make_space(PgfJitState* state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pgf_jit_predicate(PgfJitState* state,
|
pgf_jit_predicate(PgfJitState* state, PgfCIdMap* abscats,
|
||||||
PgfCIdMap* abscats, PgfAbsCat* abscat)
|
PgfAbsCat* abscat, GuBuf* functions)
|
||||||
{
|
{
|
||||||
#ifdef PGF_JIT_DEBUG
|
#ifdef PGF_JIT_DEBUG
|
||||||
GuPool* tmp_pool = gu_new_pool();
|
GuPool* tmp_pool = gu_new_pool();
|
||||||
@@ -101,7 +101,7 @@ pgf_jit_predicate(PgfJitState* state,
|
|||||||
int label = 0;
|
int label = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
size_t n_funs = gu_buf_length(abscat->functions);
|
size_t n_funs = gu_buf_length(functions);
|
||||||
|
|
||||||
pgf_jit_make_space(state);
|
pgf_jit_make_space(state);
|
||||||
|
|
||||||
@@ -111,7 +111,7 @@ pgf_jit_predicate(PgfJitState* state,
|
|||||||
|
|
||||||
if (n_funs > 0) {
|
if (n_funs > 0) {
|
||||||
PgfAbsFun* absfun =
|
PgfAbsFun* absfun =
|
||||||
gu_buf_get(abscat->functions, PgfAbsFun*, 0);
|
gu_buf_get(functions, PgfAbsFun*, 0);
|
||||||
|
|
||||||
#ifdef PGF_JIT_DEBUG
|
#ifdef PGF_JIT_DEBUG
|
||||||
gu_puts(" TRY_FIRST ", wtr, err);
|
gu_puts(" TRY_FIRST ", wtr, err);
|
||||||
@@ -142,7 +142,7 @@ pgf_jit_predicate(PgfJitState* state,
|
|||||||
#ifdef PGF_JIT_DEBUG
|
#ifdef PGF_JIT_DEBUG
|
||||||
if (n_funs > 0) {
|
if (n_funs > 0) {
|
||||||
PgfAbsFun* absfun =
|
PgfAbsFun* absfun =
|
||||||
gu_buf_get(abscat->functions, PgfAbsFun*, 0);
|
gu_buf_get(functions, PgfAbsFun*, 0);
|
||||||
|
|
||||||
gu_string_write(absfun->name, wtr, err);
|
gu_string_write(absfun->name, wtr, err);
|
||||||
gu_puts(":\n", 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++) {
|
for (size_t i = 0; i < n_funs; i++) {
|
||||||
PgfAbsFun* absfun =
|
PgfAbsFun* absfun =
|
||||||
gu_buf_get(abscat->functions, PgfAbsFun*, i);
|
gu_buf_get(functions, PgfAbsFun*, i);
|
||||||
|
|
||||||
pgf_jit_make_space(state);
|
pgf_jit_make_space(state);
|
||||||
|
|
||||||
@@ -168,7 +168,7 @@ pgf_jit_predicate(PgfJitState* state,
|
|||||||
if (n_hypos > 0) {
|
if (n_hypos > 0) {
|
||||||
if (i+1 < n_funs) {
|
if (i+1 < n_funs) {
|
||||||
PgfAbsFun* absfun =
|
PgfAbsFun* absfun =
|
||||||
gu_buf_get(abscat->functions, PgfAbsFun*, i+1);
|
gu_buf_get(functions, PgfAbsFun*, i+1);
|
||||||
|
|
||||||
#ifdef PGF_JIT_DEBUG
|
#ifdef PGF_JIT_DEBUG
|
||||||
gu_puts(" TRY_ELSE ", wtr, err);
|
gu_puts(" TRY_ELSE ", wtr, err);
|
||||||
@@ -246,7 +246,7 @@ pgf_jit_predicate(PgfJitState* state,
|
|||||||
} else {
|
} else {
|
||||||
if (i+1 < n_funs) {
|
if (i+1 < n_funs) {
|
||||||
PgfAbsFun* absfun =
|
PgfAbsFun* absfun =
|
||||||
gu_buf_get(abscat->functions, PgfAbsFun*, i+1);
|
gu_buf_get(functions, PgfAbsFun*, i+1);
|
||||||
|
|
||||||
#ifdef PGF_JIT_DEBUG
|
#ifdef PGF_JIT_DEBUG
|
||||||
gu_puts(" TRY_CONSTANT ", wtr, err);
|
gu_puts(" TRY_CONSTANT ", wtr, err);
|
||||||
@@ -284,7 +284,7 @@ pgf_jit_predicate(PgfJitState* state,
|
|||||||
#ifdef PGF_JIT_DEBUG
|
#ifdef PGF_JIT_DEBUG
|
||||||
if (i+1 < n_funs) {
|
if (i+1 < n_funs) {
|
||||||
PgfAbsFun* absfun =
|
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_string_write(absfun->name, wtr, err);
|
||||||
gu_puts(":\n", wtr, err);
|
gu_puts(":\n", wtr, err);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ void
|
|||||||
pgf_jit_done(PgfJitState* state, PgfAbstr* abstr);
|
pgf_jit_done(PgfJitState* state, PgfAbstr* abstr);
|
||||||
|
|
||||||
void
|
void
|
||||||
pgf_jit_predicate(PgfJitState* state,
|
pgf_jit_predicate(PgfJitState* state, PgfCIdMap* abscats,
|
||||||
PgfCIdMap* abscats, PgfAbsCat* abscat);
|
PgfAbsCat* abscat, GuBuf* functions);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -151,35 +151,31 @@ pgf_iter_functions(PgfPGF* pgf, GuMapItor* fn, GuExn* err)
|
|||||||
gu_map_iter(pgf->abstract.funs, fn, 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
|
void
|
||||||
pgf_iter_functions_by_cat(PgfPGF* pgf, PgfCId catname,
|
pgf_iter_functions_by_cat(PgfPGF* pgf, PgfCId catname,
|
||||||
GuMapItor* fn, GuExn* err)
|
GuMapItor* fn, GuExn* err)
|
||||||
{
|
{
|
||||||
PgfAbsCat* abscat =
|
PgfFunByCatIter clo = { { pgf_filter_by_cat }, catname, fn };
|
||||||
gu_map_get(pgf->abstract.cats, &catname, PgfAbsCat*);
|
gu_map_iter(pgf->abstract.funs, &clo.fn, err);
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GuString
|
GuString
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ struct PgfReader {
|
|||||||
GuIn* in;
|
GuIn* in;
|
||||||
GuExn* err;
|
GuExn* err;
|
||||||
GuPool* opool;
|
GuPool* opool;
|
||||||
|
GuPool* tmp_pool;
|
||||||
GuSymTable* symtab;
|
GuSymTable* symtab;
|
||||||
PgfJitState* jit_state;
|
PgfJitState* jit_state;
|
||||||
};
|
};
|
||||||
@@ -517,7 +518,7 @@ pgf_read_abscat(PgfReader* rdr, PgfAbstr* abstr, PgfCIdMap* abscats)
|
|||||||
abscat->meta_token_prob = INFINITY;
|
abscat->meta_token_prob = INFINITY;
|
||||||
abscat->meta_child_probs = NULL;
|
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);
|
size_t n_functions = pgf_read_len(rdr);
|
||||||
gu_return_on_exn(rdr->err, NULL);
|
gu_return_on_exn(rdr->err, NULL);
|
||||||
@@ -531,10 +532,10 @@ pgf_read_abscat(PgfReader* rdr, PgfAbstr* abstr, PgfCIdMap* abscats)
|
|||||||
|
|
||||||
PgfAbsFun* absfun =
|
PgfAbsFun* absfun =
|
||||||
gu_map_get(abstr->funs, &name, PgfAbsFun*);
|
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;
|
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);
|
PgfReader* rdr = gu_new(PgfReader, tmp_pool);
|
||||||
rdr->opool = opool;
|
rdr->opool = opool;
|
||||||
|
rdr->tmp_pool = tmp_pool;
|
||||||
rdr->symtab = gu_new_symtable(opool, tmp_pool);
|
rdr->symtab = gu_new_symtable(opool, tmp_pool);
|
||||||
rdr->err = err;
|
rdr->err = err;
|
||||||
rdr->in = in;
|
rdr->in = in;
|
||||||
|
|||||||
Reference in New Issue
Block a user