Current section

Files

Jump to
wasp_vm lib decoding element_section_parser.ex
Raw

lib/decoding/element_section_parser.ex

defmodule WaspVM.Decoder.ElementSectionParser do
alias WaspVM.LEB128
alias WaspVM.Decoder.Util
require IEx
@moduledoc false
def parse(section) do
{count, entries} = LEB128.decode_unsigned(section)
entries = if count > 0, do: parse_entries(entries), else: []
{:elements, entries}
end
defp parse_entries(entries), do: parse_entries([], entries)
defp parse_entries(parsed, <<>>), do: parsed
defp parse_entries(parsed, entries) do
{index, entries} = LEB128.decode_unsigned(entries)
{offset, entries} = Util.evaluate_init_expr(entries)
{count, entries} = LEB128.decode_unsigned(entries)
{indices, entries} = if count > 0, do: parse_indices(entries, count), else: []
entry = %{table_idx: index, offset: offset, indices: indices}
parse_entries([entry | parsed], entries)
end
defp parse_indices(bin, count), do: parse_indices([], bin, count)
defp parse_indices(parsed, bin, 0), do: {parsed, bin}
defp parse_indices(parsed, bin, count) do
{idx, rest} = LEB128.decode_unsigned(bin)
parse_indices([idx | parsed], rest, count - 1)
end
end