Skip to main content

lib/quickbeam/wasm/module.ex

defmodule QuickBEAM.WASM.Module do
  @moduledoc """
  A decoded WebAssembly module.

  Returned by `QuickBEAM.WASM.disasm/1`. Contains the module's type
  signatures, imports, exports, function bodies with decoded opcodes,
  memories, tables, globals, data segments, and custom sections.

  ## Functions

  Each function is a `%QuickBEAM.WASM.Function{}` struct with decoded
  opcodes in the same `{offset, name, ...operands}` tuple format used
  by `QuickBEAM.Bytecode`:

      %QuickBEAM.WASM.Function{
        index: 0,
        name: "add",
        type_idx: 0,
        params: [:i32, :i32],
        results: [:i32],
        locals: [],
        opcodes: [
          {0, :local_get, 0},
          {2, :local_get, 1},
          {4, :i32_add},
          {5, :end}
        ]
      }
  """

  defstruct [
    :version,
    :start,
    types: [],
    imports: [],
    exports: [],
    functions: [],
    memories: [],
    tables: [],
    globals: [],
    data: [],
    elements: [],
    tags: [],
    custom_sections: []
  ]

  @type import_desc :: map()

  @type export_desc :: map()

  @type t :: %__MODULE__{
          version: non_neg_integer(),
          start: non_neg_integer() | nil,
          types: [map()],
          imports: [import_desc()],
          exports: [export_desc()],
          functions: [QuickBEAM.WASM.Function.t()],
          memories: [map()],
          tables: [map()],
          globals: [map()],
          data: [map()],
          elements: [map()],
          tags: [map()],
          custom_sections: [map()]
        }
end