fix typdef param shit
This commit is contained in:
parent
33f38c03d6
commit
ad1d5776f8
3 changed files with 33 additions and 20 deletions
|
@ -456,8 +456,8 @@ msph_tree_sphophi_prebind(struct spho_scope *sc,
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret = spho_scope_prebind_tp_op(sc, NOM(name), op))
|
if ((ret = spho_scope_prebind_tp_op(sc,
|
||||||
== -1) {
|
NOM(tpdef->name), op)) == -1) {
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -30,7 +30,7 @@ static void tree_parse_init(struct tree_parse *,
|
||||||
struct msph_token_stream *, int);
|
struct msph_token_stream *, int);
|
||||||
static int tree_parse_next_token(struct tree_parse *);
|
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 *);
|
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));
|
dir = tree_parse_assert(p, TREE(body));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
goto ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dir == NULL)
|
if (dir == NULL)
|
||||||
break;
|
goto err;
|
||||||
|
|
||||||
STAILQ_INSERT_TAIL(&body->head, dir, entries);
|
STAILQ_INSERT_TAIL(&body->head, dir, entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret:
|
||||||
return (body);
|
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)
|
if (name == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
STAILQ_INSERT_TAIL(&def->params, name, entries);
|
STAILQ_INSERT_TAIL(&def->params, name, entries);
|
||||||
|
|
||||||
EXPECT_READ_NEXT(res, p, MSPH_TREE_TPDEF, goto err);
|
|
||||||
} while (CURR_TOKEN(p)->type == TOK_COMMA);
|
} while (CURR_TOKEN(p)->type == TOK_COMMA);
|
||||||
|
|
||||||
EXPECT_CURR_TOKEN(p, TOK_RBRAK, MSPH_TREE_TPDEF, goto err);
|
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);
|
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;
|
TEXT(id)->pos = CURR_TOKEN(p)->pos;
|
||||||
DECOR_INIT(id);
|
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)) {
|
>= sizeof(id->str)) {
|
||||||
MSPH_ERR(CTX(p), MSPH_ERR_TREE_TOOLONG);
|
MSPH_ERR(CTX(p), MSPH_ERR_TREE_TOOLONG);
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -988,7 +992,6 @@ tree_parse_tpexpr_atom(struct tree_parse *p, struct msph_tree *parent)
|
||||||
tp = NULL;
|
tp = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SPHO_DEBUG_PRINT("returning tp type=%x\n", TREE(tp)->type);
|
|
||||||
return (tp);
|
return (tp);
|
||||||
}
|
}
|
||||||
struct msph_tree_tpexpr *
|
struct msph_tree_tpexpr *
|
||||||
|
@ -1252,12 +1255,15 @@ tree_parse_trait(struct tree_parse *p, struct msph_tree *parent)
|
||||||
DECOR_INIT(trait);
|
DECOR_INIT(trait);
|
||||||
trait->body = NULL;
|
trait->body = NULL;
|
||||||
|
|
||||||
|
EXPECT_READ_NEXT(res, p, MSPH_TREE_TRAIT, goto err);
|
||||||
|
|
||||||
if ((trait->body = tree_parse_body(p, TREE(trait))) == NULL)
|
if ((trait->body = tree_parse_body(p, TREE(trait))) == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
EXPECT_READ_NEXT(res, p, MSPH_TREE_TRAIT, goto err);
|
|
||||||
EXPECT_CURR_TOKEN(p, TOK_RBRACE, 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);
|
return ((struct msph_tree_tpexpr *)trait);
|
||||||
err:
|
err:
|
||||||
free_the_tree(TREE(trait));
|
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)
|
if ((membd->name = tree_parse_namedecl(p, TREE(membd))) == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
EXPECT_READ_NEXT(res, p, MSPH_TREE_MEMBDECL, goto err);
|
|
||||||
EXPECT_CURR_TOKEN(p, TOK_COLON, MSPH_TREE_MEMBDECL,
|
EXPECT_CURR_TOKEN(p, TOK_COLON, MSPH_TREE_MEMBDECL,
|
||||||
goto err);
|
goto err);
|
||||||
EXPECT_READ_NEXT(res, p, 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 " "
|
#define MSPH_TREE_INDENT " "
|
||||||
|
|
||||||
__attribute__((format(printf, 3, 4)))
|
__attribute__((format(printf, 3, 4)))
|
||||||
static ssize_t
|
static int
|
||||||
indent_fprintf(FILE *f, int indent, const char *fmt, ...)
|
indent_fprintf(FILE *f, int indent, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
int res;
|
int res, ret;
|
||||||
ssize_t ret;
|
|
||||||
int i;
|
int i;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
|
@ -1391,25 +1395,25 @@ indent_fprintf(FILE *f, int indent, const char *fmt, ...)
|
||||||
for (i = 0; i < indent; i++) {
|
for (i = 0; i < indent; i++) {
|
||||||
res = fprintf(f, "%s", MSPH_TREE_INDENT);
|
res = fprintf(f, "%s", MSPH_TREE_INDENT);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
return ((ssize_t)res);
|
return (res);
|
||||||
}
|
}
|
||||||
ret += (ssize_t)res;
|
ret += res;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = vfprintf(f, fmt, ap);
|
res = vfprintf(f, fmt, ap);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
return ((ssize_t)res);
|
return (res);
|
||||||
}
|
}
|
||||||
ret += (ssize_t)res;
|
ret += res;
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t
|
static int
|
||||||
tree_ind_fprint(FILE *f, int indent, struct msph_tree *tree)
|
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_root *root;
|
||||||
struct msph_tree_unit *unit;
|
struct msph_tree_unit *unit;
|
||||||
struct msph_tree_body *body;
|
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_paren *paren;
|
||||||
struct msph_tree_ident *ident;
|
struct msph_tree_ident *ident;
|
||||||
struct msph_tree_tpexpr *tp;
|
struct msph_tree_tpexpr *tp;
|
||||||
|
struct msph_tree_namedecl *named;
|
||||||
const char *ident_kind;
|
const char *ident_kind;
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@ -1519,6 +1524,13 @@ tree_ind_fprint(FILE *f, int indent, struct msph_tree *tree)
|
||||||
return (res);
|
return (res);
|
||||||
}
|
}
|
||||||
ret += 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)
|
if ((res = tree_ind_fprint(f, indent+1, TREE(tpdef->tp))) < 0)
|
||||||
return (res);
|
return (res);
|
||||||
ret += res;
|
ret += res;
|
||||||
|
|
|
@ -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);
|
SPHO_SC_ERR(sc, SPHO_ERR_TOOBIG);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
nom->id = sc->ctx->nom_cnt++;
|
||||||
|
|
||||||
SLIST_INSERT_HEAD(&sc->noms, nom, entries);
|
SLIST_INSERT_HEAD(&sc->noms, nom, entries);
|
||||||
sc->nom_cnt++;
|
sc->nom_cnt++;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue