Packages
orb
0.2.2
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/i32/unsafe_pointer.ex
defmodule Orb.I32.UnsafePointer do
@moduledoc """
Custom `Orb.CustomType` for pointer to a 32-bit integer in memory.
It is aligned to 4 bytes or 32-bits, so you can only load/store at memory offsets divisible by 4.
"""
with @behaviour Orb.CustomType do
@impl Orb.CustomType
def wasm_type, do: :i32
end
def memory_alignment, do: 4
with @behaviour Access do
alias Orb.{Memory, I32, VariableReference}
@impl Access
def fetch(%VariableReference{} = var_ref, at!: offset) do
address =
offset
|> then(&Orb.Numeric.Multiply.optimized(I32, &1, 4))
|> then(&Orb.Numeric.Add.optimized(I32, &1, var_ref))
ast = Memory.load!(I32, address)
{:ok, ast}
end
@impl Access
def get_and_update(_data, _key, _function) do
raise UndefinedFunctionError, module: __MODULE__, function: :get_and_update, arity: 3
end
@impl Access
def pop(_data, _key) do
raise UndefinedFunctionError, module: __MODULE__, function: :pop, arity: 2
end
end
end