Open mikevoronov opened 4 years ago
instead of stack ops like dup, swap etc we are proposing the use of let: effectively a temporary local. This is part of the function reference types proposal https://github.com/WebAssembly/function-references/blob/master/proposals/function-references/Overview.md
Thanks! Will take a look, are there any plans to include let
to the WIT proposal in the nearest future?
I don't know what WIT folk are planning. But, they will likely follow what goes on in Interface Types on this kind of issue.
Maybe I am getting smth wrong, are WIT (Wasm Interface Types) and Interface Types the same thing? Or maybe you mean Typed Functions instead of Interface Types.
WIT is a sub-proposal which is part of WASI. Not really the same as Interface Types; although there is a somewhat close connection :)
Ohh, I thought it is called WITX (or module types/linking) :). Thank you.
So, are there any plans to include let
to the interface-types proposal in the nearest future? :) I am super interested in it, because our current sub-idea (Wasm RPC) is based on interface types (yes, we know that interface-types is very unstable, but the only alternative to us is to write something like that ourself).
this is still under discussion.
Hi! I am trying to use WIT for server-side modules and found that it is a bit tricky. Basically, because there are no "common" instructions to stack-based virtual machines like
dup
andswap
. In my setup I have several Wasm modules with separate incapsulated memories. Each module could have exports/imports with corresponding adapters.Let's imagine two modules: ipfs_node and ipfs_rpc. The first,
ipfs_node
has exports with corresponding adapters. The second,ipfs_rpc
also has exports and imports fromipfs_node
. Each adapter has following type@interface type (func (param string) (result string)))
. So let's follow a little bit a process of callingipfs_node
imports fromipfs_rpc
:Here I am using functions like
{get, set}_result_ptr
,{get, set}_result_size
, because Wasmer isn't support multi-value now. So the interesting part of this flow is following:ipfs_rpc
. It receives two i32 (ptr and size).ipfs_rpc
ipfs_node
export adapter is called and returnsstring
on the stack.ipfs_rpc
module. To do this we have to lower memory withstring.lower_memory
that consumes string object and pointer to module memory from the stack. In its turn, to obtain module memory pointer we need string size, so we have to callstring.size
that also consumes string object. So here we need some mechanism for duplicating and swapping values on stack. I solved it with following set of instructions (I extended WIT interpreter with these two instructions):I don't know is it possible to do this without very messy tricks like returning string object together with its size from callee module. It seems reasonable to add these possibilities in some form.