diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2013-09-13 11:02:17 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2013-09-13 11:02:17 +0000 |
| commit | c721c5548e2f85b01ec932bdeb6dac00cef7ef42 (patch) | |
| tree | b8b12020c7a97d36e90323f88fafb654b3194b39 /src/runtime/c/pgf/linearizer.c | |
| parent | df91908e636f10caabce39504cfd5d9f962d6711 (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.c | 76 |
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; |
