Skip to content

Borrow function arguments and use one byte type #1987

Open

Description

@ludfjig

Function calls copy byte and string arguments more often than they need to.

Problem

  • call and call_host take arguments by value. A caller that holds a &str or &[u8] must clone it first, even though the call only reads it.
  • A function can receive bytes as Vec<u8> or Vec<Bytes>. In the guest, Vec<u8> joins the transport buffers into a new vector and Vec<Bytes> does not. The cost is hidden in the receiver's signature.

Proposal

Callers pass borrowed values. Functions take and return bytes only as Vec<Bytes>.

Arguments Parameters and return types
Scalars i32, u32, i64, u64, f32, f64, bool same, plus () as a return type
Strings &str String
Bytes &[u8], &[u8; N], &[Bytes] Vec<Bytes>

Arguments are what callers pass to call, call_host and #[host_function] stubs. Parameters and return types are what #[guest_function] and host functions declare.

Breaking changes

  • Owned String, Vec<u8>, Bytes and Vec<Bytes> are no longer accepted as arguments. Pass s.as_str(), &v or &chunks.
  • Vec<u8> is no longer a parameter or return type. Use Vec<Bytes>. concat() joins the chunks when a function needs one contiguous buffer.

These are hard breaks, but each fix is a one-line change at a call site or a function signature, and the compile error names it.

Effect

Copies per byte argument, host to guest:

Caller holds Guest parameter (today) Today After
Vec<u8> Vec<u8> 2 1
&[u8] Vec<u8> 3 1
&[u8] Vec<Bytes> 2 1
Vec<Bytes> Vec<Bytes> 1 1

After the change, every byte argument takes one copy: the host writes it into the guest's transport buffers, and the guest reads it from them in place. Guest-to-host calls save the caller's clone. The host still copies guest data once before reading it, for safety.

Activity

  1. added this to the v1.0.0 milestone on Oct 27, 2026
  2. changed the title [-]Allow host to pass reference types (&[u8] and &str) to guest funcs[/-] [+]Borrow function arguments and use one byte type[/+] on Oct 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/APIRelated to the API or public interfacelifecycle/needs-reviewThe issue has not yet been reviewed.

    Type

    No type

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions