array.wast 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. ;; Type syntax
  2. (module
  3. (type (array i8))
  4. (type (array i16))
  5. (type (array i32))
  6. (type (array i64))
  7. (type (array f32))
  8. (type (array f64))
  9. (type (array anyref))
  10. (type (array (ref struct)))
  11. (type (array (ref 0)))
  12. (type (array (ref null 1)))
  13. (type (array (mut i8)))
  14. (type (array (mut i16)))
  15. (type (array (mut i32)))
  16. (type (array (mut i64)))
  17. (type (array (mut i32)))
  18. (type (array (mut i64)))
  19. (type (array (mut anyref)))
  20. (type (array (mut (ref struct))))
  21. (type (array (mut (ref 0))))
  22. (type (array (mut (ref null i31))))
  23. )
  24. (assert_invalid
  25. (module
  26. (type (array (mut (ref null 10))))
  27. )
  28. "unknown type"
  29. )
  30. ;; Binding structure
  31. (module
  32. (rec
  33. (type $s0 (array (ref $s1)))
  34. (type $s1 (array (ref $s0)))
  35. )
  36. (func (param (ref $forward)))
  37. (type $forward (array i32))
  38. )
  39. (assert_invalid
  40. (module (type (array (ref 1))))
  41. "unknown type"
  42. )
  43. (assert_invalid
  44. (module (type (array (mut (ref 1)))))
  45. "unknown type"
  46. )
  47. ;; Basic instructions
  48. (module
  49. (type $vec (array f32))
  50. (type $mvec (array (mut f32)))
  51. (global (ref $vec) (array.new $vec (f32.const 1) (i32.const 3)))
  52. (global (ref $vec) (array.new_default $vec (i32.const 3)))
  53. (func $new (export "new") (result (ref $vec))
  54. (array.new_default $vec (i32.const 3))
  55. )
  56. (func $get (param $i i32) (param $v (ref $vec)) (result f32)
  57. (array.get $vec (local.get $v) (local.get $i))
  58. )
  59. (func (export "get") (param $i i32) (result f32)
  60. (call $get (local.get $i) (call $new))
  61. )
  62. (func $set_get (param $i i32) (param $v (ref $mvec)) (param $y f32) (result f32)
  63. (array.set $mvec (local.get $v) (local.get $i) (local.get $y))
  64. (array.get $mvec (local.get $v) (local.get $i))
  65. )
  66. (func (export "set_get") (param $i i32) (param $y f32) (result f32)
  67. (call $set_get (local.get $i)
  68. (array.new_default $mvec (i32.const 3))
  69. (local.get $y)
  70. )
  71. )
  72. (func $len (param $v (ref array)) (result i32)
  73. (array.len (local.get $v))
  74. )
  75. (func (export "len") (result i32)
  76. (call $len (call $new))
  77. )
  78. )
  79. (assert_return (invoke "new") (ref.array))
  80. ;; (assert_return (invoke "new") (ref.eq))
  81. (assert_return (invoke "get" (i32.const 0)) (f32.const 0))
  82. (assert_return (invoke "set_get" (i32.const 1) (f32.const 7)) (f32.const 7))
  83. (assert_return (invoke "len") (i32.const 3))
  84. (assert_trap (invoke "get" (i32.const 10)) "out of bounds array access")
  85. (assert_trap (invoke "set_get" (i32.const 10) (f32.const 7)) "out of bounds array access")
  86. (module
  87. (type $vec (array f32))
  88. (type $mvec (array (mut f32)))
  89. (global (ref $vec) (array.new_fixed $vec 2 (f32.const 1) (f32.const 2)))
  90. (func $new (export "new") (result (ref $vec))
  91. (array.new_fixed $vec 2 (f32.const 1) (f32.const 2))
  92. )
  93. (func $get (param $i i32) (param $v (ref $vec)) (result f32)
  94. (array.get $vec (local.get $v) (local.get $i))
  95. )
  96. (func (export "get") (param $i i32) (result f32)
  97. (call $get (local.get $i) (call $new))
  98. )
  99. (func $set_get (param $i i32) (param $v (ref $mvec)) (param $y f32) (result f32)
  100. (array.set $mvec (local.get $v) (local.get $i) (local.get $y))
  101. (array.get $mvec (local.get $v) (local.get $i))
  102. )
  103. (func (export "set_get") (param $i i32) (param $y f32) (result f32)
  104. (call $set_get (local.get $i)
  105. (array.new_fixed $mvec 3 (f32.const 1) (f32.const 2) (f32.const 3))
  106. (local.get $y)
  107. )
  108. )
  109. (func $len (param $v (ref array)) (result i32)
  110. (array.len (local.get $v))
  111. )
  112. (func (export "len") (result i32)
  113. (call $len (call $new))
  114. )
  115. )
  116. (assert_return (invoke "new") (ref.array))
  117. ;; (assert_return (invoke "new") (ref.eq))
  118. (assert_return (invoke "get" (i32.const 0)) (f32.const 1))
  119. (assert_return (invoke "set_get" (i32.const 1) (f32.const 7)) (f32.const 7))
  120. (assert_return (invoke "len") (i32.const 2))
  121. (assert_trap (invoke "get" (i32.const 10)) "out of bounds array access")
  122. (assert_trap (invoke "set_get" (i32.const 10) (f32.const 7)) "out of bounds array access")
  123. (module
  124. (type $vec (array i8))
  125. (type $mvec (array (mut i8)))
  126. (data $d "\00\01\02\03\04")
  127. (func $new (export "new") (result (ref $vec))
  128. (array.new_data $vec $d (i32.const 1) (i32.const 3))
  129. )
  130. (func $get (param $i i32) (param $v (ref $vec)) (result i32)
  131. (array.get_u $vec (local.get $v) (local.get $i))
  132. )
  133. (func (export "get") (param $i i32) (result i32)
  134. (call $get (local.get $i) (call $new))
  135. )
  136. (func $set_get (param $i i32) (param $v (ref $mvec)) (param $y i32) (result i32)
  137. (array.set $mvec (local.get $v) (local.get $i) (local.get $y))
  138. (array.get_u $mvec (local.get $v) (local.get $i))
  139. )
  140. (func (export "set_get") (param $i i32) (param $y i32) (result i32)
  141. (call $set_get (local.get $i)
  142. (array.new_data $mvec $d (i32.const 1) (i32.const 3))
  143. (local.get $y)
  144. )
  145. )
  146. (func $len (param $v (ref array)) (result i32)
  147. (array.len (local.get $v))
  148. )
  149. (func (export "len") (result i32)
  150. (call $len (call $new))
  151. )
  152. )
  153. (assert_return (invoke "new") (ref.array))
  154. ;; (assert_return (invoke "new") (ref.eq))
  155. (assert_return (invoke "get" (i32.const 0)) (i32.const 1))
  156. (assert_return (invoke "set_get" (i32.const 1) (i32.const 7)) (i32.const 7))
  157. (assert_return (invoke "len") (i32.const 3))
  158. (assert_trap (invoke "get" (i32.const 10)) "out of bounds array access")
  159. (assert_trap (invoke "set_get" (i32.const 10) (i32.const 7)) "out of bounds array access")
  160. (; array.new_elem not supported
  161. (module
  162. (type $bvec (array i8))
  163. (type $vec (array (ref $bvec)))
  164. (type $mvec (array (mut (ref $bvec))))
  165. (type $nvec (array (ref null $bvec)))
  166. (type $avec (array (mut anyref)))
  167. (elem $e (ref $bvec)
  168. (array.new $bvec (i32.const 7) (i32.const 3))
  169. (array.new_fixed $bvec 2 (i32.const 1) (i32.const 2))
  170. )
  171. (func $new (export "new") (result (ref $vec))
  172. (array.new_elem $vec $e (i32.const 0) (i32.const 2))
  173. )
  174. (func $sub1 (result (ref $nvec))
  175. (array.new_elem $nvec $e (i32.const 0) (i32.const 2))
  176. )
  177. (func $sub2 (result (ref $avec))
  178. (array.new_elem $avec $e (i32.const 0) (i32.const 2))
  179. )
  180. (func $get (param $i i32) (param $j i32) (param $v (ref $vec)) (result i32)
  181. (array.get_u $bvec (array.get $vec (local.get $v) (local.get $i)) (local.get $j))
  182. )
  183. (func (export "get") (param $i i32) (param $j i32) (result i32)
  184. (call $get (local.get $i) (local.get $j) (call $new))
  185. )
  186. (func $set_get (param $i i32) (param $j i32) (param $v (ref $mvec)) (param $y i32) (result i32)
  187. (array.set $mvec (local.get $v) (local.get $i) (array.get $mvec (local.get $v) (local.get $y)))
  188. (array.get_u $bvec (array.get $mvec (local.get $v) (local.get $i)) (local.get $j))
  189. )
  190. (func (export "set_get") (param $i i32) (param $j i32) (param $y i32) (result i32)
  191. (call $set_get (local.get $i) (local.get $j)
  192. (array.new_elem $mvec $e (i32.const 0) (i32.const 2))
  193. (local.get $y)
  194. )
  195. )
  196. (func $len (param $v (ref array)) (result i32)
  197. (array.len (local.get $v))
  198. )
  199. (func (export "len") (result i32)
  200. (call $len (call $new))
  201. )
  202. )
  203. (assert_return (invoke "new") (ref.array))
  204. (assert_return (invoke "new") (ref.eq))
  205. (assert_return (invoke "get" (i32.const 0) (i32.const 0)) (i32.const 7))
  206. (assert_return (invoke "get" (i32.const 1) (i32.const 0)) (i32.const 1))
  207. (assert_return (invoke "set_get" (i32.const 0) (i32.const 1) (i32.const 1)) (i32.const 2))
  208. (assert_return (invoke "len") (i32.const 2))
  209. (assert_trap (invoke "get" (i32.const 10) (i32.const 0)) "out of bounds array access")
  210. (assert_trap (invoke "set_get" (i32.const 10) (i32.const 0) (i32.const 0)) "out of bounds array access")
  211. ;)
  212. (assert_invalid
  213. (module
  214. (type $a (array i64))
  215. (func (export "array.set-immutable") (param $a (ref $a))
  216. (array.set $a (local.get $a) (i32.const 0) (i64.const 1))
  217. )
  218. )
  219. "array is immutable"
  220. )
  221. (assert_invalid
  222. (module
  223. (type $bvec (array i8))
  224. (data $d "\00\01\02\03\04")
  225. (global (ref $bvec)
  226. (array.new_data $bvec $d (i32.const 1) (i32.const 3))
  227. )
  228. )
  229. "constant expression required"
  230. )
  231. (assert_invalid
  232. (module
  233. (type $bvec (array i8))
  234. (type $vvec (array (ref $bvec)))
  235. (elem $e (ref $bvec) (ref.null $bvec))
  236. (global (ref $vvec)
  237. (array.new_elem $vvec $e (i32.const 0) (i32.const 1))
  238. )
  239. )
  240. "constant expression required"
  241. )
  242. ;; Null dereference
  243. (module
  244. (type $t (array (mut i32)))
  245. (func (export "array.get-null")
  246. (local (ref null $t)) (drop (array.get $t (local.get 0) (i32.const 0)))
  247. )
  248. (func (export "array.set-null")
  249. (local (ref null $t)) (array.set $t (local.get 0) (i32.const 0) (i32.const 0))
  250. )
  251. )
  252. (assert_trap (invoke "array.get-null") "null array")
  253. (assert_trap (invoke "array.set-null") "null array")