summaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2013-06-26 09:35:50 +0000
committerkr.angelov <kr.angelov@gmail.com>2013-06-26 09:35:50 +0000
commitd1410aba223edf235b83a70be0890b48fd07e585 (patch)
treee9b18e29bab7b84b1ec95c08e05e4e428327e4c7 /src/runtime
parentfcd2a2b12a00bb5e3427162e3f6c07b4b58a2d3d (diff)
we no longer maintain an explicit list of functions per category since now it is implicitly kept in the JIT compiled code
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/c/pgf/data.h1
-rw-r--r--src/runtime/c/pgf/jit.c18
-rw-r--r--src/runtime/c/pgf/jit.h4
-rw-r--r--src/runtime/c/pgf/pgf.c46
-rw-r--r--src/runtime/c/pgf/reader.c10
5 files changed, 38 insertions, 41 deletions
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;