diff --git a/src/runtime/c/pgf/data.h b/src/runtime/c/pgf/data.h index 1be7a3fcf..b7a13d07d 100644 --- a/src/runtime/c/pgf/data.h +++ b/src/runtime/c/pgf/data.h @@ -92,7 +92,6 @@ typedef struct { prob_t meta_token_prob; PgfMetaChildMap* meta_child_probs; - GuBuf* functions; // -->PgfAbsFun void* predicate; } PgfAbsCat; diff --git a/src/runtime/c/pgf/jit.c b/src/runtime/c/pgf/jit.c index 7a512e8f3..9a38d2f4e 100644 --- a/src/runtime/c/pgf/jit.c +++ b/src/runtime/c/pgf/jit.c @@ -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); diff --git a/src/runtime/c/pgf/jit.h b/src/runtime/c/pgf/jit.h index eb9d7005e..04265547a 100644 --- a/src/runtime/c/pgf/jit.h +++ b/src/runtime/c/pgf/jit.h @@ -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 diff --git a/src/runtime/c/pgf/pgf.c b/src/runtime/c/pgf/pgf.c index 95b2132f5..13066927c 100644 --- a/src/runtime/c/pgf/pgf.c +++ b/src/runtime/c/pgf/pgf.c @@ -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 diff --git a/src/runtime/c/pgf/reader.c b/src/runtime/c/pgf/reader.c index 550cfa5d6..1eccc25e0 100644 --- a/src/runtime/c/pgf/reader.c +++ b/src/runtime/c/pgf/reader.c @@ -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;