diff --git a/src/msph/sphophi.c b/src/msph/sphophi.c index 59eacdb..0a629b5 100644 --- a/src/msph/sphophi.c +++ b/src/msph/sphophi.c @@ -456,8 +456,8 @@ msph_tree_sphophi_prebind(struct spho_scope *sc, return (-1); } - if ((ret = spho_scope_prebind_tp_op(sc, NOM(name), op)) - == -1) { + if ((ret = spho_scope_prebind_tp_op(sc, + NOM(tpdef->name), op)) == -1) { return (-1); } } else { diff --git a/src/msph/tree.c b/src/msph/tree.c index b50f0f7..87d99d7 100644 --- a/src/msph/tree.c +++ b/src/msph/tree.c @@ -30,7 +30,7 @@ static void tree_parse_init(struct tree_parse *, struct msph_token_stream *, int); static int tree_parse_next_token(struct tree_parse *); -static ssize_t tree_ind_fprint(FILE *, int, struct msph_tree *); +static int tree_ind_fprint(FILE *, int, struct msph_tree *); static void free_the_tree(struct msph_tree *); @@ -302,16 +302,21 @@ tree_parse_body(struct tree_parse *p, struct msph_tree *parent) dir = tree_parse_assert(p, TREE(body)); break; default: - break; + goto ret; } if (dir == NULL) - break; + goto err; STAILQ_INSERT_TAIL(&body->head, dir, entries); } +ret: return (body); +err: + free_the_tree(TREE(body)); + + return (NULL); } @@ -346,11 +351,10 @@ tree_parse_tpdef(struct tree_parse *p, struct msph_tree *parent) if (name == NULL) goto err; STAILQ_INSERT_TAIL(&def->params, name, entries); - - EXPECT_READ_NEXT(res, p, MSPH_TREE_TPDEF, goto err); } while (CURR_TOKEN(p)->type == TOK_COMMA); EXPECT_CURR_TOKEN(p, TOK_RBRAK, MSPH_TREE_TPDEF, goto err); + EXPECT_READ_NEXT(res, p, MSPH_TREE_TPDEF, goto err); } EXPECT_CURR_TOKEN(p, TOK_EQUALS, MSPH_TREE_TPDEF, goto err); @@ -418,7 +422,7 @@ tree_parse_ident_extsize(struct tree_parse *p, struct msph_tree *parent, TEXT(id)->pos = CURR_TOKEN(p)->pos; DECOR_INIT(id); - if (SPHO_STRLCPY(id->str, CURR_TOKEN(p)->data.str, sizeof(id->str)) + if (strlcpy(id->str, CURR_TOKEN(p)->data.str, sizeof(id->str)) >= sizeof(id->str)) { MSPH_ERR(CTX(p), MSPH_ERR_TREE_TOOLONG); goto err; @@ -988,7 +992,6 @@ tree_parse_tpexpr_atom(struct tree_parse *p, struct msph_tree *parent) tp = NULL; } - SPHO_DEBUG_PRINT("returning tp type=%x\n", TREE(tp)->type); return (tp); } struct msph_tree_tpexpr * @@ -1252,12 +1255,15 @@ tree_parse_trait(struct tree_parse *p, struct msph_tree *parent) DECOR_INIT(trait); trait->body = NULL; + EXPECT_READ_NEXT(res, p, MSPH_TREE_TRAIT, goto err); + if ((trait->body = tree_parse_body(p, TREE(trait))) == NULL) goto err; - EXPECT_READ_NEXT(res, p, MSPH_TREE_TRAIT, goto err); EXPECT_CURR_TOKEN(p, TOK_RBRACE, MSPH_TREE_TRAIT, goto err); + tree_parse_next_token(p); + return ((struct msph_tree_tpexpr *)trait); err: free_the_tree(TREE(trait)); @@ -1322,7 +1328,6 @@ tree_parse_membdecl(struct tree_parse *p, struct msph_tree *parent) if ((membd->name = tree_parse_namedecl(p, TREE(membd))) == NULL) goto err; - EXPECT_READ_NEXT(res, p, MSPH_TREE_MEMBDECL, goto err); EXPECT_CURR_TOKEN(p, TOK_COLON, MSPH_TREE_MEMBDECL, goto err); EXPECT_READ_NEXT(res, p, MSPH_TREE_MEMBDECL, goto err); @@ -1377,11 +1382,10 @@ free_the_tree(struct msph_tree *tree) #define MSPH_TREE_INDENT " " __attribute__((format(printf, 3, 4))) -static ssize_t +static int indent_fprintf(FILE *f, int indent, const char *fmt, ...) { - int res; - ssize_t ret; + int res, ret; int i; va_list ap; @@ -1391,25 +1395,25 @@ indent_fprintf(FILE *f, int indent, const char *fmt, ...) for (i = 0; i < indent; i++) { res = fprintf(f, "%s", MSPH_TREE_INDENT); if (res < 0) { - return ((ssize_t)res); + return (res); } - ret += (ssize_t)res; + ret += res; } res = vfprintf(f, fmt, ap); if (res < 0) { - return ((ssize_t)res); + return (res); } - ret += (ssize_t)res; + ret += res; va_end(ap); return (ret); } -static ssize_t +static int tree_ind_fprint(FILE *f, int indent, struct msph_tree *tree) { - ssize_t ret, res; + int ret, res; struct msph_tree_root *root; struct msph_tree_unit *unit; struct msph_tree_body *body; @@ -1431,6 +1435,7 @@ tree_ind_fprint(FILE *f, int indent, struct msph_tree *tree) struct msph_tree_paren *paren; struct msph_tree_ident *ident; struct msph_tree_tpexpr *tp; + struct msph_tree_namedecl *named; const char *ident_kind; ret = 0; @@ -1519,6 +1524,13 @@ tree_ind_fprint(FILE *f, int indent, struct msph_tree *tree) return (res); } ret += res; + STAILQ_FOREACH(named, &tpdef->params, entries) { + if ((res = tree_ind_fprint(f, indent+1, TREE(named))) + < 0) { + return (res); + } + ret += res; + } if ((res = tree_ind_fprint(f, indent+1, TREE(tpdef->tp))) < 0) return (res); ret += res; diff --git a/src/spho/scope.c b/src/spho/scope.c index 40a41a5..9f1b15c 100644 --- a/src/spho/scope.c +++ b/src/spho/scope.c @@ -128,6 +128,7 @@ spho_scope_nom_add(struct spho_scope *sc, const char *nomstr, size_t sz) SPHO_SC_ERR(sc, SPHO_ERR_TOOBIG); goto err; } + nom->id = sc->ctx->nom_cnt++; SLIST_INSERT_HEAD(&sc->noms, nom, entries); sc->nom_cnt++;