commit 601ed99a183d50aa7c9db1f9a04c6d1b808e947d
parent 51905aa80860957ba19a9253699aaf581d919e69
Author: Sebastian <sebastian@sebsite.pw>
Date: Mon, 16 Sep 2024 18:08:16 -0400
hare::parse: redefine vaarg() as vaarg(object-selector, type)
Signed-off-by: Sebastian <sebastian@sebsite.pw>
Diffstat:
5 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/hare/ast/expr.ha b/hare/ast/expr.ha
@@ -421,8 +421,11 @@ export type vastart_expr = void;
// A vaarg expression.
//
-// vaarg(ap)
-export type vaarg_expr = *expr;
+// vaarg(ap, int)
+export type vaarg_expr = struct {
+ ap: *expr,
+ _type: *_type,
+};
// A vaend expression.
//
@@ -671,8 +674,10 @@ case let e: *expr =>
match (v) {
case vastart_expr => void;
case let v: vaarg_expr =>
- expr_finish(v);
- free(v);
+ expr_finish(v.ap);
+ free(v.ap);
+ type_finish(v._type);
+ free(v._type);
case let v: vaend_expr =>
expr_finish(v);
free(v);
diff --git a/hare/parse/+test/expr_test.ha b/hare/parse/+test/expr_test.ha
@@ -79,7 +79,7 @@
offset(foo.bar);
size(u32);
vastart();
- vaarg(va);
+ vaarg(va, int);
vaend(va);
};
`);
diff --git a/hare/parse/+test/loc.ha b/hare/parse/+test/loc.ha
@@ -68,7 +68,7 @@ fn expr_testloc(srcs: str...) void = for (let i = 0z; i < len(srcs); i += 1) {
expr_testloc("switch (foo) { case => bar; }");
expr_testloc("foo[bar..baz]");
expr_testloc("&foo");
- expr_testloc("vastart()", "vaarg(ap)", "vaend(ap)");
+ expr_testloc("vastart()", "vaarg(ap, int)", "vaend(ap)");
expr_testloc("yield", "yield foo", "yield :foo, bar");
// We want to check the location of nested expressions, so this can't
diff --git a/hare/parse/expr.ha b/hare/parse/expr.ha
@@ -412,12 +412,17 @@ fn builtin(lexer: *lex::lexer) (ast::expr | error) = {
case ltok::VAARG =>
want(lexer, ltok::VAARG)?;
want(lexer, ltok::LPAREN)?;
- const expr = alloc(objsel(lexer)?);
+ const ap = alloc(objsel(lexer)?);
+ want(lexer, ltok::COMMA)?;
+ const _type = alloc(_type(lexer)?);
want(lexer, ltok::RPAREN)?;
return ast::expr {
start = tok.2,
end = lex::prevloc(lexer),
- expr = expr: ast::vaarg_expr: ast::variadic_expr,
+ expr = ast::vaarg_expr {
+ ap = ap,
+ _type = _type,
+ },
};
case ltok::VAEND =>
want(lexer, ltok::VAEND)?;
diff --git a/hare/unparse/expr.ha b/hare/unparse/expr.ha
@@ -446,7 +446,10 @@ fn _expr(ctx: *context, syn: *synfunc, e: *ast::expr) (size | io::error) = {
case let e: ast::vaarg_expr =>
let z = syn(ctx, "vaarg", synkind::KEYWORD)?;
z += syn(ctx, "(", synkind::PUNCTUATION)?;
- z += _expr(ctx, syn, e)?;
+ z += _expr(ctx, syn, e.ap)?;
+ z += syn(ctx, ",", synkind::PUNCTUATION)?;
+ z += space(ctx)?;
+ z += __type(ctx, syn, e._type)?;
z += syn(ctx, ")", synkind::PUNCTUATION)?;
return z;
case let e: ast::vaend_expr =>