@@ 191,7 191,7 @@ const s_iface_dispatch_method_src: str = ` case $iface_label::$methodid =>
${rval_store}object._iface.$method(
object,${caps_in}$params
);
- match (helios::reply(0${rval_param})) {
+ match (helios::reply((0 << 16) | (${caps_out} << 8) | ${params_out}${rval_param})) {
case void =>
yield;
case errors::invalid_cslot =>
@@ 299,11 299,15 @@ fn s_method_dispatch(
defer io::close(&rval_store)!;
let rval_param = strio::dynamic();
defer io::close(&rval_param)!;
+ let params_out = 0z;
if (!(meth.result is ptype) || meth.result as ptype != ptype::VOID) {
fmt::fprintf(&rval_store, "const rval = ")!;
fmt::fprintf(&rval_param, ", rval")!;
+ params_out += 1;
};
+ // XXX: capabilities out can leak if the caller wants to destroy them
+ // after transfer
tmpl::execute(&st_iface_dispatch_method, out,
("iface", iface.name),
("method", meth.name),
@@ 312,5 316,7 @@ fn s_method_dispatch(
("params", strio::string(¶ms)),
("rval_store", strio::string(&rval_store)),
("rval_param", strio::string(&rval_param)),
+ ("caps_out", len(meth.caps_out)),
+ ("params_out", params_out),
)?;
};