table_set.wast 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. (module
  2. (table $t2 1 externref)
  3. (table $t3 2 funcref)
  4. (elem (table $t3) (i32.const 1) func $dummy)
  5. (func $dummy)
  6. (func (export "get-externref") (param $i i32) (result externref)
  7. (table.get $t2 (local.get $i))
  8. )
  9. (func $f3 (export "get-funcref") (param $i i32) (result funcref)
  10. (table.get $t3 (local.get $i))
  11. )
  12. (func (export "set-externref") (param $i i32) (param $r externref)
  13. (table.set (local.get $i) (local.get $r))
  14. )
  15. (func (export "set-funcref") (param $i i32) (param $r funcref)
  16. (table.set $t3 (local.get $i) (local.get $r))
  17. )
  18. (func (export "set-funcref-from") (param $i i32) (param $j i32)
  19. (table.set $t3 (local.get $i) (table.get $t3 (local.get $j)))
  20. )
  21. (func (export "is_null-funcref") (param $i i32) (result i32)
  22. (ref.is_null (call $f3 (local.get $i)))
  23. )
  24. )
  25. (assert_return (invoke "get-externref" (i32.const 0)) (ref.null extern))
  26. (assert_return (invoke "set-externref" (i32.const 0) (ref.extern 1)))
  27. (assert_return (invoke "get-externref" (i32.const 0)) (ref.extern 1))
  28. (assert_return (invoke "set-externref" (i32.const 0) (ref.null extern)))
  29. (assert_return (invoke "get-externref" (i32.const 0)) (ref.null extern))
  30. (assert_return (invoke "get-funcref" (i32.const 0)) (ref.null func))
  31. (assert_return (invoke "set-funcref-from" (i32.const 0) (i32.const 1)))
  32. (assert_return (invoke "is_null-funcref" (i32.const 0)) (i32.const 0))
  33. (assert_return (invoke "set-funcref" (i32.const 0) (ref.null func)))
  34. (assert_return (invoke "get-funcref" (i32.const 0)) (ref.null func))
  35. (assert_trap (invoke "set-externref" (i32.const 2) (ref.null extern)) "out of bounds table access")
  36. (assert_trap (invoke "set-funcref" (i32.const 3) (ref.null func)) "out of bounds table access")
  37. (assert_trap (invoke "set-externref" (i32.const -1) (ref.null extern)) "out of bounds table access")
  38. (assert_trap (invoke "set-funcref" (i32.const -1) (ref.null func)) "out of bounds table access")
  39. (assert_trap (invoke "set-externref" (i32.const 2) (ref.extern 0)) "out of bounds table access")
  40. (assert_trap (invoke "set-funcref-from" (i32.const 3) (i32.const 1)) "out of bounds table access")
  41. (assert_trap (invoke "set-externref" (i32.const -1) (ref.extern 0)) "out of bounds table access")
  42. (assert_trap (invoke "set-funcref-from" (i32.const -1) (i32.const 1)) "out of bounds table access")
  43. ;; Type errors
  44. (assert_invalid
  45. (module
  46. (table $t 10 externref)
  47. (func $type-index-value-empty-vs-i32-externref
  48. (table.set $t)
  49. )
  50. )
  51. "type mismatch"
  52. )
  53. (assert_invalid
  54. (module
  55. (table $t 10 externref)
  56. (func $type-index-empty-vs-i32
  57. (table.set $t (ref.null extern))
  58. )
  59. )
  60. "type mismatch"
  61. )
  62. (assert_invalid
  63. (module
  64. (table $t 10 externref)
  65. (func $type-value-empty-vs-externref
  66. (table.set $t (i32.const 1))
  67. )
  68. )
  69. "type mismatch"
  70. )
  71. (assert_invalid
  72. (module
  73. (table $t 10 externref)
  74. (func $type-size-f32-vs-i32
  75. (table.set $t (f32.const 1) (ref.null extern))
  76. )
  77. )
  78. "type mismatch"
  79. )
  80. (assert_invalid
  81. (module
  82. (table $t 10 funcref)
  83. (func $type-value-externref-vs-funcref (param $r externref)
  84. (table.set $t (i32.const 1) (local.get $r))
  85. )
  86. )
  87. "type mismatch"
  88. )
  89. (assert_invalid
  90. (module
  91. (table $t1 1 externref)
  92. (table $t2 1 funcref)
  93. (func $type-value-externref-vs-funcref-multi (param $r externref)
  94. (table.set $t2 (i32.const 0) (local.get $r))
  95. )
  96. )
  97. "type mismatch"
  98. )
  99. (assert_invalid
  100. (module
  101. (table $t 10 externref)
  102. (func $type-result-empty-vs-num (result i32)
  103. (table.set $t (i32.const 0) (ref.null extern))
  104. )
  105. )
  106. "type mismatch"
  107. )