summaryrefslogtreecommitdiff
path: root/src/runtime/c/pgf/linearizer.c
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2013-09-13 11:02:17 +0000
committerkr.angelov <kr.angelov@gmail.com>2013-09-13 11:02:17 +0000
commitc721c5548e2f85b01ec932bdeb6dac00cef7ef42 (patch)
treeb8b12020c7a97d36e90323f88fafb654b3194b39 /src/runtime/c/pgf/linearizer.c
parentdf91908e636f10caabce39504cfd5d9f962d6711 (diff)
minor optimization/refactoring in the grammar reader
Diffstat (limited to 'src/runtime/c/pgf/linearizer.c')
-rw-r--r--src/runtime/c/pgf/linearizer.c76
1 files changed, 25 insertions, 51 deletions
diff --git a/src/runtime/c/pgf/linearizer.c b/src/runtime/c/pgf/linearizer.c
index 93fbb452c..f73c650d8 100644
--- a/src/runtime/c/pgf/linearizer.c
+++ b/src/runtime/c/pgf/linearizer.c
@@ -35,60 +35,34 @@ pgf_lzr_add_overl_entry(PgfCncOverloadMap* overl_table,
gu_buf_push(entries, void*, entry);
}
-typedef struct {
- GuMapItor fn;
- PgfConcr* concr;
- GuPool* pool;
-} PgfLzrIndexFn;
-
-static void
-pgf_lzr_index_itor(GuMapItor* fn, const void* key, void* value, GuExn* err)
+void
+pgf_lzr_index(PgfConcr* concr,
+ PgfCCat* ccat, PgfProduction prod,
+ GuPool *pool)
{
- (void) (key && err);
-
- PgfLzrIndexFn* clo = (PgfLzrIndexFn*) fn;
- PgfCCat* ccat = *((PgfCCat**) value);
- PgfConcr *concr = clo->concr;
- GuPool *pool = clo->pool;
-
- if (gu_seq_is_null(ccat->prods))
- return;
-
- size_t n_prods = gu_seq_length(ccat->prods);
- for (size_t i = 0; i < n_prods; i++) {
- PgfProduction prod = gu_seq_get(ccat->prods, PgfProduction, i);
-
- void* data = gu_variant_data(prod);
- switch (gu_variant_tag(prod)) {
- case PGF_PRODUCTION_APPLY: {
- PgfProductionApply* papply = data;
- PgfCncOverloadMap* overl_table =
- gu_map_get(concr->fun_indices, &papply->fun->absfun->name,
- PgfCncOverloadMap*);
- if (!overl_table) {
- overl_table = gu_map_type_new(PgfCncOverloadMap, pool);
- gu_map_put(concr->fun_indices,
- &papply->fun->absfun->name, PgfCncOverloadMap*, overl_table);
- }
- pgf_lzr_add_overl_entry(overl_table, ccat, papply, pool);
- break;
- }
- case PGF_PRODUCTION_COERCE: {
- PgfProductionCoerce* pcoerce = data;
- pgf_lzr_add_overl_entry(concr->coerce_idx, ccat, pcoerce, pool);
- break;
- }
- default:
- gu_impossible();
+ void* data = gu_variant_data(prod);
+ switch (gu_variant_tag(prod)) {
+ case PGF_PRODUCTION_APPLY: {
+ PgfProductionApply* papply = data;
+ PgfCncOverloadMap* overl_table =
+ gu_map_get(concr->fun_indices, &papply->fun->absfun->name,
+ PgfCncOverloadMap*);
+ if (!overl_table) {
+ overl_table = gu_map_type_new(PgfCncOverloadMap, pool);
+ gu_map_put(concr->fun_indices,
+ &papply->fun->absfun->name, PgfCncOverloadMap*, overl_table);
}
+ pgf_lzr_add_overl_entry(overl_table, ccat, papply, pool);
+ break;
+ }
+ case PGF_PRODUCTION_COERCE: {
+ PgfProductionCoerce* pcoerce = data;
+ pgf_lzr_add_overl_entry(concr->coerce_idx, ccat, pcoerce, pool);
+ break;
+ }
+ default:
+ gu_impossible();
}
-}
-
-void
-pgf_lzr_index(PgfConcr* concr, GuPool *pool)
-{
- PgfLzrIndexFn clo = { { pgf_lzr_index_itor }, concr, pool };
- gu_map_iter(concr->ccats, &clo.fn, NULL);
}
typedef struct PgfLzn PgfLzn;