~sircmpwn/ipcgen

92bb824bd91f47c5b90cff0cb2d5eaf53c1b9222 — Drew DeVault 3 months ago ceb25ea
gen server: implement variadic caps
2 files changed, 13 insertions(+), 6 deletions(-)

M gen/server.ha
M parse/interface.ha
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)?) {