~sircmpwn/ipcgen

b2b18e759e3382b875e8463a21d6c15f464b465e — Drew DeVault 2 months ago 47f7cc2
gen/server: implement caps out
1 files changed, 24 insertions(+), 2 deletions(-)

M gen/server.ha
M gen/server.ha => gen/server.ha +24 -2
@@ 94,8 94,6 @@ fn s_method_fntype(
	iface: *ast::interface,
	meth: *ast::method,
) (void | io::error) = {
	assert(len(meth.caps_out) == 0); // TODO

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



@@ 119,6 117,24 @@ fn s_method_fntype(
			fmt::fprint(&params, ", ")!;
		};
	};
	if (len(meth.caps_out) != 0) {
		fmt::fprint(&params, ", ")!;
	};
	for (let i = 0z; i < len(meth.caps_out); i += 1) {
		const cap = &meth.caps_out[i];
		assert(!cap.variadic); // TODO
		if (cap.name != "") {
			fmt::fprintf(&params, "{}: *helios::cap", cap.name)!;
		} else if (len(meth.caps_out) == 1) {
			fmt::fprintf(&params, "out: *helios::cap")!;
		} else {
			fmt::fprintf(&params, "out{}: *helios::cap", i)!;
		};

		if (i + 1 < len(meth.caps_out)) {
			fmt::fprint(&params, ", ")!;
		};
	};

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


@@ 271,6 287,12 @@ fn s_method_dispatch(
		ipc_type(&params, &param.param_type)!;
		fmt::fprint(&params, ",")!;
	};
	for (let i = 0z; i < len(meth.caps_out); i += 1) {
		const cap = &meth.caps_out[i];
		assert(!cap.variadic); // TODO
		fmt::fprint(&params, "\n\t\t\t")!;
		fmt::fprintf(&params, "&rt::ipcbuf.params[{}],", i)!;
	};

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