~sircmpwn/ipcgen

7f85bdb39b913da98edcde17194bd4f82bb568c0 — Drew DeVault 3 months ago 92bb824
gen client: implement variadic caps
1 files changed, 23 insertions(+), 6 deletions(-)

M gen/client.ha
M gen/client.ha => gen/client.ha +23 -6
@@ 76,13 76,30 @@ fn c_meth(
	let caps_in_setup = strio::dynamic();
	defer io::close(&caps_in_setup)!;

	let ncap = strio::dynamic();
	defer io::close(&ncap)!;

	let variadic = false;
	for (let i = 0z; i < len(meth.caps_in); i += 1) {
		const cap = &meth.caps_in[i];
		assert(!cap.variadic); // TODO
		fmt::fprintf(&cparams, "\n\t{}: helios::cap,", cap.name)!;
		fmt::fprintf(&caps_in_setup,
			"rt::ipcbuf.caps[{}] = {};\n\t",
			i, cap.name)!;
		fmt::fprintf(&cparams,
			"\n\t{}: {}helios::cap,",
			cap.name, if (cap.variadic) "[]" else "")!;
		if (cap.variadic) {
			fmt::fprintf(&caps_in_setup,
				"rt::ipcbuf.caps[{}..len({1})] = {1};\n\t",
				i, cap.name)!;
			fmt::fprintf(&ncap, "({} + len({}): u64)",
				len(meth.caps_in) - 1, cap.name)!;
			variadic = true;
		} else {
			fmt::fprintf(&caps_in_setup,
				"rt::ipcbuf.caps[{}] = {};\n\t",
				i, cap.name)!;
		};
	};
	if (!variadic) {
		fmt::fprintf(&ncap, "{}", len(meth.caps_in))!;
	};

	let mparams = strio::dynamic();


@@ 113,7 130,7 @@ fn c_meth(
		("methodid", name),
		("result", strio::string(&result)),
		("nparam", len(meth.params)),
		("ncap", len(meth.caps_in)),
		("ncap", strio::string(&ncap)),
		("cparams", strio::string(&cparams)),
		("caps_in_setup", strio::string(&caps_in_setup)),
		("mparams", strio::string(&mparams)),