function_invocation_test.wat 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. (module
  2. ;; Import functions
  3. (import "env" "test_import_add" (func $test_import_add (param i32 i32) (result i32)))
  4. (import "env" "test_import_mul" (func $test_import_mul (param i32 i32) (result i32)))
  5. (import "env" "malloc" (func $malloc (param i32) (result i32)))
  6. (import "env" "free" (func $free (param i32)))
  7. (import "env" "native_func" (func $native_func (param i32) (result i32)))
  8. ;; Type definitions
  9. (type $void_to_void (func))
  10. (type $i32_to_i32 (func (param i32) (result i32)))
  11. (type $i32_i32_to_i32 (func (param i32 i32) (result i32)))
  12. ;; Memory and table
  13. (memory 1)
  14. (table 4 funcref)
  15. ;; Local functions for table
  16. (func $add_func (type $i32_to_i32) (param $x i32) (result i32)
  17. local.get $x
  18. i32.const 10
  19. i32.add)
  20. (func $mul_func (type $i32_to_i32) (param $x i32) (result i32)
  21. local.get $x
  22. i32.const 2
  23. i32.mul)
  24. (func $identity_func (type $i32_to_i32) (param $x i32) (result i32)
  25. local.get $x)
  26. (func $void_func (type $void_to_void))
  27. ;; Initialize table
  28. (elem (i32.const 0) $add_func $mul_func $identity_func $void_func)
  29. ;; Test functions matching the C++ test expectations
  30. (func (export "test_call_indirect_valid") (param $idx i32) (param $val i32) (result i32)
  31. local.get $val
  32. local.get $idx
  33. call_indirect (type $i32_to_i32))
  34. (func (export "test_call_indirect_invalid_index") (param $val i32) (result i32)
  35. local.get $val
  36. i32.const 10
  37. call_indirect (type $i32_to_i32))
  38. (func (export "test_call_indirect_type_mismatch") (param $val i32) (result i32)
  39. local.get $val
  40. i32.const 3
  41. call_indirect (type $i32_to_i32))
  42. (func (export "test_import_function_call") (param $a i32) (param $b i32) (result i32)
  43. local.get $a
  44. local.get $b
  45. call $test_import_add)
  46. (func (export "test_import_function_mul") (param $a i32) (param $b i32) (result i32)
  47. local.get $a
  48. local.get $b
  49. call $test_import_mul)
  50. (func (export "test_native_function_call") (param $a i32) (result i32)
  51. local.get $a
  52. call $native_func)
  53. (func (export "test_malloc_operation") (param $size i32) (result i32)
  54. local.get $size
  55. call $malloc)
  56. (func (export "test_free_operation") (param $ptr i32)
  57. local.get $ptr
  58. call $free)
  59. (func (export "test_malloc_free_cycle") (param $size i32) (result i32)
  60. (local $ptr i32)
  61. local.get $size
  62. call $malloc
  63. local.set $ptr
  64. local.get $ptr
  65. i32.const 42
  66. i32.store
  67. local.get $ptr
  68. i32.load
  69. local.get $ptr
  70. call $free)
  71. (func (export "test_stack_operations") (param $val1 i32) (param $val2 i32) (result i32)
  72. local.get $val1
  73. local.get $val2
  74. call $test_import_add
  75. i32.const 5
  76. call $add_func
  77. i32.add
  78. local.get $val2
  79. i32.const 3
  80. call $test_import_mul
  81. i32.add)
  82. (func (export "test_complex_indirect_calls") (param $selector i32) (param $value i32) (result i32)
  83. local.get $selector
  84. i32.const 0
  85. i32.eq
  86. if (result i32)
  87. local.get $value
  88. i32.const 0
  89. call_indirect (type $i32_to_i32)
  90. else
  91. local.get $selector
  92. i32.const 1
  93. i32.eq
  94. if (result i32)
  95. local.get $value
  96. i32.const 1
  97. call_indirect (type $i32_to_i32)
  98. else
  99. local.get $value
  100. i32.const 2
  101. call_indirect (type $i32_to_i32)
  102. end
  103. end)
  104. (func (export "test_large_param_stack")
  105. (param $p1 i32) (param $p2 i32) (param $p3 i32) (param $p4 i32)
  106. (param $p5 i32) (param $p6 i32) (param $p7 i32) (param $p8 i32)
  107. (result i32)
  108. local.get $p1
  109. local.get $p2
  110. call $test_import_add
  111. local.get $p3
  112. local.get $p4
  113. call $test_import_add
  114. i32.add
  115. local.get $p5
  116. local.get $p6
  117. call $test_import_add
  118. i32.add
  119. local.get $p7
  120. local.get $p8
  121. call $test_import_add
  122. i32.add)
  123. )