@@ 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)),