wasm-micro-runtime/tests/unit/smart-tests/interpreter/wasm-apps/function_invocation_test.wat
Zhenwei Jin ae2fd0754b
add more unit test cases for interpreter (#4716)
Co-authored-by: ai-assistant
2025-12-18 07:42:50 +08:00

150 lines
3.8 KiB
Plaintext

(module
;; Import functions
(import "env" "test_import_add" (func $test_import_add (param i32 i32) (result i32)))
(import "env" "test_import_mul" (func $test_import_mul (param i32 i32) (result i32)))
(import "env" "malloc" (func $malloc (param i32) (result i32)))
(import "env" "free" (func $free (param i32)))
(import "env" "native_func" (func $native_func (param i32) (result i32)))
;; Type definitions
(type $void_to_void (func))
(type $i32_to_i32 (func (param i32) (result i32)))
(type $i32_i32_to_i32 (func (param i32 i32) (result i32)))
;; Memory and table
(memory 1)
(table 4 funcref)
;; Local functions for table
(func $add_func (type $i32_to_i32) (param $x i32) (result i32)
local.get $x
i32.const 10
i32.add)
(func $mul_func (type $i32_to_i32) (param $x i32) (result i32)
local.get $x
i32.const 2
i32.mul)
(func $identity_func (type $i32_to_i32) (param $x i32) (result i32)
local.get $x)
(func $void_func (type $void_to_void))
;; Initialize table
(elem (i32.const 0) $add_func $mul_func $identity_func $void_func)
;; Test functions matching the C++ test expectations
(func (export "test_call_indirect_valid") (param $idx i32) (param $val i32) (result i32)
local.get $val
local.get $idx
call_indirect (type $i32_to_i32))
(func (export "test_call_indirect_invalid_index") (param $val i32) (result i32)
local.get $val
i32.const 10
call_indirect (type $i32_to_i32))
(func (export "test_call_indirect_type_mismatch") (param $val i32) (result i32)
local.get $val
i32.const 3
call_indirect (type $i32_to_i32))
(func (export "test_import_function_call") (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
call $test_import_add)
(func (export "test_import_function_mul") (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
call $test_import_mul)
(func (export "test_native_function_call") (param $a i32) (result i32)
local.get $a
call $native_func)
(func (export "test_malloc_operation") (param $size i32) (result i32)
local.get $size
call $malloc)
(func (export "test_free_operation") (param $ptr i32)
local.get $ptr
call $free)
(func (export "test_malloc_free_cycle") (param $size i32) (result i32)
(local $ptr i32)
local.get $size
call $malloc
local.set $ptr
local.get $ptr
i32.const 42
i32.store
local.get $ptr
i32.load
local.get $ptr
call $free)
(func (export "test_stack_operations") (param $val1 i32) (param $val2 i32) (result i32)
local.get $val1
local.get $val2
call $test_import_add
i32.const 5
call $add_func
i32.add
local.get $val2
i32.const 3
call $test_import_mul
i32.add)
(func (export "test_complex_indirect_calls") (param $selector i32) (param $value i32) (result i32)
local.get $selector
i32.const 0
i32.eq
if (result i32)
local.get $value
i32.const 0
call_indirect (type $i32_to_i32)
else
local.get $selector
i32.const 1
i32.eq
if (result i32)
local.get $value
i32.const 1
call_indirect (type $i32_to_i32)
else
local.get $value
i32.const 2
call_indirect (type $i32_to_i32)
end
end)
(func (export "test_large_param_stack")
(param $p1 i32) (param $p2 i32) (param $p3 i32) (param $p4 i32)
(param $p5 i32) (param $p6 i32) (param $p7 i32) (param $p8 i32)
(result i32)
local.get $p1
local.get $p2
call $test_import_add
local.get $p3
local.get $p4
call $test_import_add
i32.add
local.get $p5
local.get $p6
call $test_import_add
i32.add
local.get $p7
local.get $p8
call $test_import_add
i32.add)
)