From 0e90d1ba1fd5c20bf526cda4459eedf12cd1f3ef Mon Sep 17 00:00:00 2001 From: "kr.angelov" Date: Mon, 5 Mar 2012 12:59:31 +0000 Subject: libpgf: now all concrete functions and categories are explicitly linked to their abstract counter parts --- src/runtime/c/pgf/reader.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'src/runtime/c/pgf/reader.c') diff --git a/src/runtime/c/pgf/reader.c b/src/runtime/c/pgf/reader.c index cfb3c8b7e..f7b6b02be 100644 --- a/src/runtime/c/pgf/reader.c +++ b/src/runtime/c/pgf/reader.c @@ -48,6 +48,7 @@ struct PgfReader { GuPool* opool; GuPool* tmp_pool; GuSymTable* symtab; + PgfAbstr* curr_abstr; PgfConcr* curr_concr; GuMap* curr_lindefs; PgfContsMap* curr_conts_map; // used temporary for building the bu index for the parser @@ -619,6 +620,13 @@ pgf_read_to_PgfFunId(GuType* type, PgfReader* rdr, void* to) *(PgfFunId*) to = gu_list_elems(rdr->curr_concr->cncfuns)[id]; } +static void +pgf_read_to_PgfAbstr(GuType* type, PgfReader* rdr, void* to) +{ + rdr->curr_abstr = to; + pgf_read_to_struct(type, rdr, to); +} + static GU_DEFINE_TYPE(PgfLinDefs, GuIntMap, gu_ptr_type(PgfFunIds), &gu_null_struct); typedef PgfCCat PgfCCatData; @@ -755,6 +763,8 @@ pgf_read_new_PgfConcr(GuType* type, PgfReader* rdr, GuPool* pool, for (int funid = 0; funid < n_funs; funid++) { PgfCncFun* cncfun = gu_list_index(concr->cncfuns, funid); cncfun->funid = funid; + cncfun->absfun = + gu_map_get(rdr->curr_abstr->funs, &cncfun->name, PgfFunDecl*); } return concr; @@ -764,8 +774,7 @@ static void* pgf_read_new_PgfCncCat(GuType* type, PgfReader* rdr, GuPool* pool, size_t* size_out) { - PgfCId cid = *(PgfCId*) rdr->curr_key; - gu_enter("-> cid"); + gu_enter("->"); (void) (type && size_out); int first = pgf_read_int(rdr); @@ -774,7 +783,10 @@ pgf_read_new_PgfCncCat(GuType* type, PgfReader* rdr, GuPool* pool, PgfCncCat* cnccat = gu_malloc(pool, sizeof(PgfCncCat)+n_lins*sizeof(GuString)); - cnccat->cid = cid; + + cnccat->abscat = + gu_map_get(rdr->curr_abstr->cats, rdr->curr_key, PgfCat*); + gu_assert(cnccat->abscat != NULL); int len = last + 1 - first; cnccat->cats = gu_new_list(PgfCCatIds, pool, len); @@ -834,6 +846,7 @@ pgf_read_to_table = GU_TYPETABLE( PGF_READ_TO(PgfCCat), PGF_READ_TO(PgfSeqId), PGF_READ_TO(PgfFunId), + PGF_READ_TO(PgfAbstr), PGF_READ_TO(alias)); #define PGF_READ_NEW_FN(k_, fn_) \ @@ -863,6 +876,7 @@ pgf_new_reader(GuIn* in, GuPool* opool, GuPool* tmp_pool, GuExn* err) rdr->symtab = gu_new_symtable(opool, tmp_pool); rdr->err = err; rdr->in = in; + rdr->curr_abstr = NULL; rdr->curr_concr = NULL; rdr->curr_lindefs = NULL; rdr->curr_conts_map = NULL; -- cgit v1.2.3