Current section
Files
Jump to
Current section
Files
src/gwr@execution@instance.erl
-module(gwr@execution@instance).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([create/1, call/3]).
-export_type([web_assembly_instance/0]).
-type web_assembly_instance() :: {web_assembly_instance,
gwr@binary:binary_(),
gwr@execution@machine:machine()}.
-spec create(bitstring()) -> {ok, web_assembly_instance()} | {error, binary()}.
create(Data) ->
gleam@result:'try'(
gwr@parser@binary_parser:parse_binary_module(
gwr@parser@binary_reader:create(Data)
),
fun(_use0) ->
{_, Binary} = _use0,
gleam@result:'try'(
gwr@execution@machine:initialize(erlang:element(4, Binary)),
fun(Machine) ->
{ok, {web_assembly_instance, Binary, Machine}}
end
)
end
).
-spec call(
web_assembly_instance(),
binary(),
list(gwr@execution@runtime:value())
) -> {ok, {web_assembly_instance(), list(gwr@execution@runtime:value())}} |
{error, binary()}.
call(Instance, Name, Arguments) ->
gleam@result:'try'(
case gleam@list:find(
erlang:element(11, erlang:element(4, erlang:element(2, Instance))),
fun(Export) ->
case {erlang:element(2, Export) =:= Name,
erlang:element(3, Export)} of
{true, {function_export, _}} ->
true;
{_, _} ->
false
end
end
) of
{ok, {export, _, {function_export, Index}}} ->
{ok, Index};
_ ->
{error,
<<<<"gwr/execution/instance.call: couldn't find an exported function with name \""/utf8,
Name/binary>>/binary,
"\" in the given module"/utf8>>}
end,
fun(Function_index) ->
gleam@result:'try'(
gwr@execution@machine:call(
erlang:element(3, erlang:element(3, Instance)),
Function_index,
Arguments
),
fun(_use0) ->
{New_state, Results} = _use0,
{ok,
{erlang:setelement(
3,
Instance,
erlang:setelement(
3,
erlang:element(3, Instance),
New_state
)
),
Results}}
end
)
end
).