Packages
orb
0.0.3
0.2.2
0.2.1
0.2.0
0.1.1
0.1.0
0.0.51
0.0.49
0.0.48
0.0.47
0.0.46
0.0.45
0.0.44
0.0.43
0.0.42
0.0.41
0.0.40
0.0.39
0.0.38
0.0.37
0.0.36
0.0.35
0.0.34
0.0.33
0.0.32
0.0.31
0.0.30
0.0.28
0.0.27
0.0.26
0.0.25
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
retired
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
DSL for WebAssembly
Current section
Files
Jump to
Current section
Files
lib/orb/func.ex
defmodule Orb.Func do
@moduledoc false
defstruct [:name, :params, :result, :local_types, :body, :exported?, :source_module]
defimpl Orb.ToWat do
alias Orb.ToWat.Instructions
def to_wat(
%Orb.Func{
name: name,
params: params,
result: result,
local_types: local_types,
body: body,
exported?: exported?
},
indent
) do
[
[
indent,
case exported? do
false -> ~s[(func $#{name}]
true -> ~s[(func $#{name} (export "#{name}")]
end,
Enum.map(
for(param <- params, do: Instructions.do_wat(param)) ++
if(result, do: [Instructions.do_wat(result)], else: []),
fn s -> [" ", s] end
),
"\n"
],
for {id, type} <- local_types do
[
" ",
indent,
"(local $",
to_string(id),
" ",
Instructions.do_type(type),
")\n"
]
end,
Instructions.do_wat(body, " " <> indent),
"\n",
[indent, ")"]
]
end
end
defmodule Param do
@moduledoc false
defstruct [:name, :type]
defimpl Orb.ToWat do
alias Orb.ToWat.Instructions
def to_wat(%Param{name: nil, type: type}, indent) do
[
indent,
"(param ",
Instructions.do_type(type),
?)
]
end
def to_wat(%Param{name: name, type: type}, indent) do
[
indent,
"(param $",
to_string(name),
" ",
Instructions.do_type(type),
?)
]
end
end
end
defmodule Type do
@moduledoc false
defstruct [:name, :param_types, :result_type]
# TODO: should this be its own struct type?
def imported_func(name, params, result_type) do
# param_types = [:i32]
%__MODULE__{
name: name,
param_types: params,
result_type: result_type
}
end
defimpl Orb.ToWat do
alias Orb.ToWat.Instructions
def to_wat(%Type{name: name, param_types: param_types, result_type: result_type}, indent) do
[
indent,
"(func $",
to_string(name),
case param_types do
nil ->
[]
param_types ->
[
" ",
Orb.ToWat.to_wat(%Param{name: nil, type: param_types}, "")
]
end,
case result_type do
nil ->
[]
result_type ->
[
" ",
Instructions.do_wat({:result, result_type})
]
end,
?)
]
end
end
end
end