Packages
orb
0.0.20
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/defw_dsl.ex
defmodule Orb.DefwDSL do
defmacro wasm_mode(mode) do
mode = Macro.expand_literals(mode, __CALLER__)
Module.put_attribute(__CALLER__.module, :wasm_mode, mode)
end
defmacro defw(call, do: block) do
define(call, :public, nil, [], block, __CALLER__)
end
defmacro defw(call, locals, do: block) when is_list(locals) do
define(call, :public, nil, locals, block, __CALLER__)
end
defmacro defw(call, result, do: block) do
define(call, :public, result, [], block, __CALLER__)
end
defmacro defw(call, result, locals, do: block) when is_list(locals) do
define(call, :public, result, locals, block, __CALLER__)
end
defmacro defwi(call, do: block) do
define(call, :internal, nil, [], block, __CALLER__)
end
defmacro defwi(call, locals, do: block) when is_list(locals) do
define(call, :internal, nil, locals, block, __CALLER__)
end
defmacro defwi(call, result, do: block) do
define(call, :internal, result, [], block, __CALLER__)
end
defmacro defwi(call, result, locals, do: block) when is_list(locals) do
define(call, :internal, result, locals, block, __CALLER__)
end
defmacro defwp(call, do: block) do
define(call, :private, nil, [], block, __CALLER__)
end
defmacro defwp(call, locals, do: block) when is_list(locals) do
define(call, :private, nil, locals, block, __CALLER__)
end
defmacro defwp(call, result, do: block) do
define(call, :private, result, [], block, __CALLER__)
end
defmacro defwp(call, result, locals, do: block) when is_list(locals) do
define(call, :private, result, locals, block, __CALLER__)
end
defp define(call, visibility, result, locals, block, env) do
func_visibility = case visibility do
:internal -> :private
other -> other
end
def_kind = case visibility do
:public -> :def
:internal -> :def
:private -> :defp
end
wasm = Orb.DSL.__define_func(call, func_visibility, [result: result, locals: locals], block, env)
ex_def = define_elixir_def(call, def_kind, result, env)
quote do
unquote(ex_def)
Orb.wasm do
unquote(wasm)
end
end
end
defp define_elixir_def(call, def_kind, result, %Macro.Env{file: file}) do
{name, func_args} = Macro.decompose_call(call)
{_, meta, _} = call
# arity = length(args)
def_args = case func_args do
[] -> []
[keywords] -> (for {keyword, _type} <- keywords do
Macro.var(keyword, nil)
end)
multiple when is_list(multiple) ->
raise CompileError, line: meta[:line], file: file, description: "Cannot define function with multiple arguments, use keyword list instead."
end
def_call = {name, meta, def_args}
quote do
unquote(def_kind)(unquote(def_call)) do
Orb.Instruction.typed_call(unquote(result), unquote(name), unquote(def_args))
end
end
end
end