diff --git a/src/runtime/c/pgf/reader.cxx b/src/runtime/c/pgf/reader.cxx index 325d8377b..891346324 100644 --- a/src/runtime/c/pgf/reader.cxx +++ b/src/runtime/c/pgf/reader.cxx @@ -306,7 +306,7 @@ ref PgfReader::read_type() return tp; } -ref PgfReader::read_absfun() +ref PgfReader::read_absfun_only() { ref absfun = read_name(&PgfAbsFun::name); @@ -330,6 +330,13 @@ ref PgfReader::read_absfun() } absfun->prob = read_prob(&absfun->name); + return absfun; +} + +ref PgfReader::read_absfun() +{ + ref absfun = read_absfun_only(); + PgfProbspace funs_by_cat = probspace_insert(abstract->funs_by_cat, absfun); abstract->funs_by_cat = funs_by_cat; @@ -337,6 +344,17 @@ ref PgfReader::read_absfun() return absfun; } +ref PgfReader::merge_absfun() +{ + ref absfun = read_absfun_only(); + + if (namespace_lookup(abstract->funs, &absfun->name) == 0) { + throw pgf_error("The set of abstract functions is merged PGFs must be the same"); + } + + return absfun; +} + ref PgfReader::read_abscat() { ref abscat = read_name(&PgfAbsCat::name); @@ -460,7 +478,7 @@ void PgfReader::merge_abstract(ref abstract) throw pgf_error("The abstract syntax names doesn't match"); merge_namespace(&PgfReader::read_flag); - merge_namespace(&PgfReader::read_absfun); + merge_namespace(&PgfReader::merge_absfun); merge_namespace(&PgfReader::read_abscat); } diff --git a/src/runtime/c/pgf/reader.h b/src/runtime/c/pgf/reader.h index cf2c67e16..2099a6b7c 100644 --- a/src/runtime/c/pgf/reader.h +++ b/src/runtime/c/pgf/reader.h @@ -64,6 +64,8 @@ public: ref read_flag(); ref read_absfun(); + ref merge_absfun(); + ref read_absfun_only(); ref read_abscat(); void read_abstract(ref abstract); void merge_abstract(ref abstract);