array_fill.wast 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. ;; Bulk instructions
  2. ;; invalid uses
  3. (assert_invalid
  4. (module
  5. (type $a (array i8))
  6. (func (export "array.fill-immutable") (param $1 (ref $a)) (param $2 i32)
  7. (array.fill $a (local.get $1) (i32.const 0) (local.get $2) (i32.const 0))
  8. )
  9. )
  10. "array is immutable"
  11. )
  12. (assert_invalid
  13. (module
  14. (type $a (array (mut i8)))
  15. (func (export "array.fill-invalid-1") (param $1 (ref $a)) (param $2 funcref)
  16. (array.fill $a (local.get $1) (i32.const 0) (local.get $2) (i32.const 0))
  17. )
  18. )
  19. "type mismatch"
  20. )
  21. (assert_invalid
  22. (module
  23. (type $b (array (mut funcref)))
  24. (func (export "array.fill-invalid-1") (param $1 (ref $b)) (param $2 i32)
  25. (array.fill $b (local.get $1) (i32.const 0) (local.get $2) (i32.const 0))
  26. )
  27. )
  28. "type mismatch"
  29. )
  30. (module
  31. (type $arr8 (array i8))
  32. (type $arr8_mut (array (mut i8)))
  33. (global $g_arr8 (ref $arr8) (array.new $arr8 (i32.const 10) (i32.const 12)))
  34. (global $g_arr8_mut (mut (ref $arr8_mut)) (array.new_default $arr8_mut (i32.const 12)))
  35. (func (export "array_get_nth") (param $1 i32) (result i32)
  36. (array.get_u $arr8_mut (global.get $g_arr8_mut) (local.get $1))
  37. )
  38. (func (export "array_fill-null")
  39. (array.fill $arr8_mut (ref.null $arr8_mut) (i32.const 0) (i32.const 0) (i32.const 0))
  40. )
  41. (func (export "array_fill") (param $1 i32) (param $2 i32) (param $3 i32)
  42. (array.fill $arr8_mut (global.get $g_arr8_mut) (local.get $1) (local.get $2) (local.get $3))
  43. )
  44. )
  45. ;; null array argument traps
  46. (assert_trap (invoke "array_fill-null") "null array reference")
  47. ;; OOB initial index traps
  48. (assert_trap (invoke "array_fill" (i32.const 13) (i32.const 0) (i32.const 0)) "out of bounds array access")
  49. ;; OOB length traps
  50. (assert_trap (invoke "array_fill" (i32.const 0) (i32.const 0) (i32.const 13)) "out of bounds array access")
  51. ;; start index = array size, len = 0 doesn't trap
  52. (assert_return (invoke "array_fill" (i32.const 12) (i32.const 0) (i32.const 0)))
  53. ;; check arrays were not modified
  54. (assert_return (invoke "array_get_nth" (i32.const 0)) (i32.const 0))
  55. (assert_return (invoke "array_get_nth" (i32.const 5)) (i32.const 0))
  56. (assert_return (invoke "array_get_nth" (i32.const 11)) (i32.const 0))
  57. (assert_trap (invoke "array_get_nth" (i32.const 12)) "out of bounds array access")
  58. ;; normal case
  59. (assert_return (invoke "array_fill" (i32.const 2) (i32.const 11) (i32.const 2)))
  60. (assert_return (invoke "array_get_nth" (i32.const 1)) (i32.const 0))
  61. (assert_return (invoke "array_get_nth" (i32.const 2)) (i32.const 11))
  62. (assert_return (invoke "array_get_nth" (i32.const 3)) (i32.const 11))
  63. (assert_return (invoke "array_get_nth" (i32.const 4)) (i32.const 0))