Packages
orb
0.0.51
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/block.ex
defmodule Orb.Block do
@moduledoc false
defstruct [:identifier, :push_type, :body]
defimpl Orb.ToWat do
alias Orb.ToWat.Helpers
def to_wat(
%Orb.Block{identifier: identifier, push_type: push_type, body: body},
indent
) do
[
[
indent,
"(block $",
to_string(identifier),
if(push_type, do: [" (result ", Helpers.do_type(push_type), ")"], else: []),
"\n"
],
Orb.ToWat.to_wat(body, " " <> indent),
[indent, ")"]
]
end
end
defimpl Orb.ToWasm do
import Orb.ToWasm.Helpers
def to_wasm(%Orb.Block{identifier: identifier, push_type: push_type, body: body}, context) do
context = Orb.ToWasm.Context.register_loop_identifier(context, to_string(identifier))
[
0x02,
if(push_type, do: to_block_type(push_type, context), else: 0x40),
Orb.ToWasm.to_wasm(body, context),
0x0B
]
end
end
defmodule Branch do
@moduledoc false
defstruct identifier: nil, if: nil, body: nil
defimpl Orb.ToWat do
def to_wat(
%Orb.Block.Branch{identifier: identifier, if: nil},
indent
) do
[
indent,
"(br $",
to_string(identifier),
")"
]
end
def to_wat(
%Orb.Block.Branch{identifier: identifier, if: condition},
indent
) do
[
Orb.ToWat.to_wat(condition, indent),
"\n",
indent,
"(br_if $",
to_string(identifier),
")"
]
end
end
defimpl Orb.ToWasm do
alias Orb.Leb
def to_wasm(
%Orb.Block.Branch{identifier: identifier, if: nil},
context
) do
index = Orb.ToWasm.Context.fetch_loop_identifier_index!(context, to_string(identifier))
[0x0C, Leb.leb128_u(index)]
end
def to_wasm(
%Orb.Block.Branch{identifier: identifier, if: condition},
context
) do
index = Orb.ToWasm.Context.fetch_loop_identifier_index!(context, to_string(identifier))
[
Orb.ToWasm.to_wasm(condition, context),
0x0D,
Leb.leb128_u(index)
]
end
end
end
end