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:
kr.angelov
2013-06-26 09:35:50 +00:00
parent fcd2a2b12a
commit d1410aba22
5 changed files with 38 additions and 41 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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

View File

@@ -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

View File

@@ -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;