Following a proposal by a co-worker I have been investigating into a modified ABI which is symmetric between caller and callee, while maintaining an unchanged API to the guest languages. This facilitates using WIT for compile-to-native plugins, because the same binding rules work for both sides of the call (no guest vs host distinction).
The rules are quite simple to define: Apply the same ABI for imported and exported interfaces.
For strings you can either select method(&str) -> &'post str
(with 'post
defined as until calling cabi_post
on the result), method(&str) -> String
or method(String) -> String
. I selected the first one because it is the only option which removes all allocations from the call. Similar for vectors.
For resources I selected the import ABI for both sides, with the recent modification to make handles usize. This way a resource table becomes optional because you can pass rep directly to the other side.
You can find a link to the source code and more information in this thread
If you combine this with a caller provided buffer API (and/or async from 0.3) it becomes even more attractive for shared everything, as initial feed-back from SIG embedded suggests.
I post here as I would like to get a wider opinion on the acceptability as an alternative ABI configuration for shared everything.
Last updated: Nov 22 2024 at 17:03 UTC