2023-04-09 07:55:02 +03:00
|
|
|
import wasm
|
|
|
|
import os
|
|
|
|
|
|
|
|
const exe = os.find_abs_path_of_executable('wasm-validate') or { exit(0) }
|
|
|
|
|
|
|
|
fn validate(mod []u8) ! {
|
|
|
|
mut proc := os.new_process(exe)
|
|
|
|
proc.set_args(['-'])
|
|
|
|
proc.set_redirect_stdio()
|
|
|
|
proc.run()
|
|
|
|
{
|
|
|
|
os.fd_write(proc.stdio_fd[0], mod.bytestr())
|
|
|
|
os.fd_close(proc.stdio_fd[0])
|
|
|
|
}
|
|
|
|
proc.wait()
|
|
|
|
if proc.status != .exited {
|
|
|
|
return error('wasm-validate exited abormally')
|
|
|
|
}
|
|
|
|
if proc.code != 0 {
|
|
|
|
return error('wasm-validate exited with a non zero exit code')
|
|
|
|
}
|
|
|
|
proc.close()
|
|
|
|
}
|
|
|
|
|
2023-04-13 20:39:55 +03:00
|
|
|
fn test_call() {
|
2023-04-09 07:55:02 +03:00
|
|
|
mut m := wasm.Module{}
|
|
|
|
mut a1 := m.new_function('const-i32', [], [.i32_t])
|
|
|
|
{
|
|
|
|
a1.i32_const(0x132)
|
|
|
|
}
|
|
|
|
m.commit(a1, false)
|
|
|
|
mut a2 := m.new_function('const-i64', [], [.i64_t])
|
|
|
|
{
|
|
|
|
a2.i64_const(0x164)
|
|
|
|
}
|
|
|
|
m.commit(a2, false)
|
|
|
|
mut a3 := m.new_function('const-f32', [], [.f32_t])
|
|
|
|
{
|
|
|
|
a3.f32_const(0.2)
|
|
|
|
}
|
|
|
|
m.commit(a3, false)
|
|
|
|
mut a4 := m.new_function('const-f64', [], [.f64_t])
|
|
|
|
{
|
|
|
|
a4.f64_const(0.4)
|
|
|
|
}
|
|
|
|
m.commit(a4, false)
|
|
|
|
mut a5 := m.new_function('const-i32-i64', [], [.i32_t, .i64_t])
|
|
|
|
{
|
|
|
|
a5.i32_const(0x132)
|
|
|
|
a5.i64_const(0x164)
|
|
|
|
}
|
|
|
|
m.commit(a5, false)
|
|
|
|
|
|
|
|
mut b1 := m.new_function('type-i32', [], [.i32_t])
|
|
|
|
{
|
|
|
|
b1.call('const-i32')
|
|
|
|
}
|
|
|
|
m.commit(b1, true)
|
|
|
|
mut b2 := m.new_function('type-i64', [], [.i64_t])
|
|
|
|
{
|
|
|
|
b2.call('const-i64')
|
|
|
|
}
|
|
|
|
m.commit(b2, true)
|
|
|
|
mut b3 := m.new_function('type-f32', [], [.f32_t])
|
|
|
|
{
|
|
|
|
b3.call('const-f32')
|
|
|
|
}
|
|
|
|
m.commit(b3, true)
|
|
|
|
mut b4 := m.new_function('type-f64', [], [.f64_t])
|
|
|
|
{
|
|
|
|
b4.call('const-f64')
|
|
|
|
}
|
|
|
|
m.commit(b4, true)
|
|
|
|
mut b5 := m.new_function('type-i32-i64', [], [.i32_t, .i64_t])
|
|
|
|
{
|
|
|
|
b5.call('const-i32-i64')
|
|
|
|
}
|
|
|
|
m.commit(b5, true)
|
|
|
|
|
|
|
|
mut fac := m.new_function('fac', [.i64_t], [.i64_t])
|
|
|
|
{
|
|
|
|
fac.local_get(0)
|
|
|
|
fac.eqz(.i64_t)
|
|
|
|
fac.c_if([], [.i64_t])
|
|
|
|
{
|
|
|
|
fac.i64_const(1)
|
|
|
|
}
|
|
|
|
fac.c_else()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
fac.local_get(0)
|
|
|
|
}
|
|
|
|
{
|
|
|
|
fac.local_get(0)
|
|
|
|
fac.i64_const(1)
|
|
|
|
fac.sub(.i64_t)
|
|
|
|
fac.call('fac')
|
|
|
|
}
|
|
|
|
fac.mul(.i64_t)
|
|
|
|
}
|
|
|
|
fac.c_end_if()
|
|
|
|
}
|
|
|
|
m.commit(fac, true)
|
|
|
|
|
|
|
|
validate(m.compile()) or { panic(err) }
|
|
|
|
}
|