| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- (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)
- )
|