Skip to content

Conversation

@sunfishcode
Copy link
Member

wit-bindgen already knows to special-case passing strings by reference and pass them as &str instead of naively passing them as &String and requiring callers to have owned Strings. Implement this behavior for type aliases of strings as well, so that in code like this:

type my-string = string;
foo: func(x: my-string);

the argument is &str instead of &MyString which is effectively &String. And similar for lists.

This comes up in several functions in wasi-http; for example, in the bindings for the Fields::append function, it enables this change:

@@ -5075,8 +5075,8 @@ pub mod wasi {
                 /// `field-value` are syntactically invalid.
                 pub fn append(
                     &self,
-                    name: &FieldName,
-                    value: &FieldValue,
+                    name: &str,
+                    value: &[u8],
                 ) -> Result<(), HeaderError> {
                     unsafe {
                         #[repr(align(1))]

where FieldName and FieldValue are defined as:

            pub type FieldKey = _rt::String;
            pub type FieldName = FieldKey;
            pub type FieldValue = _rt::Vec<u8>;

wit-bindgen already knows to special-case passing strings by reference
and pass them as `&str` instead of naively passing them as `&String` and
requiring callers to have owned `Strings`. Implement this behavior for
type aliases of strings as well, so that in code like this:
```wit
type my-string = string;
foo: func(x: my-string);
```
the argument is `&str` instead of `&MyString` which is effectively
`&String`. And similar for lists.

This comes up in several functions in wasi-http; for example, in the
bindings for the `Fields::append` function, it enables this change:

```diff
@@ -5075,8 +5075,8 @@ pub mod wasi {
                 /// `field-value` are syntactically invalid.
                 pub fn append(
                     &self,
-                    name: &FieldName,
-                    value: &FieldValue,
+                    name: &str,
+                    value: &[u8],
                 ) -> Result<(), HeaderError> {
                     unsafe {
                         #[repr(align(1))]
```

where `FieldName` and `FieldValue` are defined as:
```wit
            pub type FieldKey = _rt::String;
            pub type FieldName = FieldKey;
            pub type FieldValue = _rt::Vec<u8>;
```
@alexcrichton alexcrichton added this pull request to the merge queue Dec 6, 2024
Merged via the queue into bytecodealliance:main with commit f3a3ac0 Dec 6, 2024
25 checks passed
sunfishcode added a commit to bytecodealliance/wasi-rs that referenced this pull request Jan 10, 2025
This uses `--async none` so there aren't many user-visible changes,
however one notable user-visible change is that with
bytecodealliance/wit-bindgen#1102, some functions such as `Fields::get`
have arguments that change from `&String` to `&str`.
sunfishcode added a commit to bytecodealliance/wasi-rs that referenced this pull request Jan 10, 2025
This uses `--async none` so there aren't many user-visible changes,
however one notable user-visible change is that with
bytecodealliance/wit-bindgen#1102, some functions such as `Fields::get`
have arguments that change from `&String` to `&str`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants