M gen/server.ha => gen/server.ha +5 -4
@@ 101,8 101,8 @@ fn s_method_fntype(
for (let i = 0z; i < len(meth.caps_in); i += 1) {
const cap = &meth.caps_in[i];
- assert(!cap.variadic); // TODO
- fmt::fprintf(&caps_in, ", {}: helios::cap", cap.name)!;
+ fmt::fprintf(&caps_in, ", {}: {}helios::cap",
+ cap.name, if (cap.variadic) "[]" else "")!;
};
let params = strio::dynamic();
@@ 250,9 250,10 @@ fn s_method_dispatch(
defer io::close(&caps_in)!;
for (let i = 0z; i < len(meth.caps_in); i += 1) {
- assert(!meth.caps_in[i].variadic); // TODO
+ const cap = &meth.caps_in[i];
fmt::fprint(&caps_in, "\n\t\t\t")!;
- fmt::fprintf(&caps_in, "rt::ipcbuf.caps[{}],", i)!;
+ fmt::fprintf(&caps_in, "rt::ipcbuf.caps[{}{}],",
+ i, if (cap.variadic) "..rt::ncap(tag)" else "")!;
};
let params = strio::dynamic();
M parse/interface.ha => parse/interface.ha +8 -2
@@ 107,17 107,23 @@ fn capabilities(lex: *lex::lexer, meth: *ast::method) (void | error) = {
const name = strings::dup(want(lex, ltok::WORD)?.1 as str);
let iface: ast::ident = [];
+ let variadic = false;
if (try(lex, ltok::COLON)? is lex::token) {
iface = ident(lex)?;
};
if (try(lex, ltok::ELLIPSIS) is lex::token) {
- abort(); // TODO: Variadic caps
+ variadic = true;
+ if (len(caps) > 0 && caps[len(caps) - 1].variadic) {
+ return mksyntaxerr(lex, [
+ ltok::COMMA, ltok::RBRACE,
+ ], (ltok::ELLIPSIS, void));
+ };
};
append(caps, ast::capability {
name = name,
iface = iface,
- variadic = false,
+ variadic = variadic,
});
const next = match (try(lex, ltok::COMMA, ltok::SEMICOLON)?) {