array_copy.wast 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. ;; Bulk instructions
  2. ;; invalid uses
  3. (assert_invalid
  4. (module
  5. (type $a (array i8))
  6. (type $b (array (mut i8)))
  7. (func (export "array.copy-immutable") (param $1 (ref $a)) (param $2 (ref $b))
  8. (array.copy $a $b (local.get $1) (i32.const 0) (local.get $2) (i32.const 0) (i32.const 0))
  9. )
  10. )
  11. "array is immutable"
  12. )
  13. (assert_invalid
  14. (module
  15. (type $a (array (mut i8)))
  16. (type $b (array i16))
  17. (func (export "array.copy-packed-invalid") (param $1 (ref $a)) (param $2 (ref $b))
  18. (array.copy $a $b (local.get $1) (i32.const 0) (local.get $2) (i32.const 0) (i32.const 0))
  19. )
  20. )
  21. "array types do not match"
  22. )
  23. (assert_invalid
  24. (module
  25. (type $a (array (mut i8)))
  26. (type $b (array (mut (ref $a))))
  27. (func (export "array.copy-ref-invalid-1") (param $1 (ref $a)) (param $2 (ref $b))
  28. (array.copy $a $b (local.get $1) (i32.const 0) (local.get $2) (i32.const 0) (i32.const 0))
  29. )
  30. )
  31. "array types do not match"
  32. )
  33. (assert_invalid
  34. (module
  35. (type $a (array (mut i8)))
  36. (type $b (array (mut (ref $a))))
  37. (type $c (array (mut (ref $b))))
  38. (func (export "array.copy-ref-invalid-1") (param $1 (ref $b)) (param $2 (ref $c))
  39. (array.copy $b $c (local.get $1) (i32.const 0) (local.get $2) (i32.const 0) (i32.const 0))
  40. )
  41. )
  42. "array types do not match"
  43. )
  44. (module
  45. (type $arr8 (array i8))
  46. (type $arr8_mut (array (mut i8)))
  47. (global $g_arr8 (ref $arr8) (array.new $arr8 (i32.const 10) (i32.const 12)))
  48. (global $g_arr8_mut (mut (ref $arr8_mut)) (array.new_default $arr8_mut (i32.const 12)))
  49. (data $d1 "abcdefghijkl")
  50. (func (export "array_get_nth") (param $1 i32) (result i32)
  51. (array.get_u $arr8_mut (global.get $g_arr8_mut) (local.get $1))
  52. )
  53. (func (export "array_copy-null-left")
  54. (array.copy $arr8_mut $arr8 (ref.null $arr8_mut) (i32.const 0) (global.get $g_arr8) (i32.const 0) (i32.const 0))
  55. )
  56. (func (export "array_copy-null-right")
  57. (array.copy $arr8_mut $arr8 (global.get $g_arr8_mut) (i32.const 0) (ref.null $arr8) (i32.const 0) (i32.const 0))
  58. )
  59. (func (export "array_copy") (param $1 i32) (param $2 i32) (param $3 i32)
  60. (array.copy $arr8_mut $arr8 (global.get $g_arr8_mut) (local.get $1) (global.get $g_arr8) (local.get $2) (local.get $3))
  61. )
  62. (func (export "array_copy_overlap_test-1")
  63. (local $1 (ref $arr8_mut))
  64. (array.new_data $arr8_mut $d1 (i32.const 0) (i32.const 12))
  65. (local.set $1)
  66. (array.copy $arr8_mut $arr8_mut (local.get $1) (i32.const 1) (local.get $1) (i32.const 0) (i32.const 11))
  67. (global.set $g_arr8_mut (local.get $1))
  68. )
  69. (func (export "array_copy_overlap_test-2")
  70. (local $1 (ref $arr8_mut))
  71. (array.new_data $arr8_mut $d1 (i32.const 0) (i32.const 12))
  72. (local.set $1)
  73. (array.copy $arr8_mut $arr8_mut (local.get $1) (i32.const 0) (local.get $1) (i32.const 1) (i32.const 11))
  74. (global.set $g_arr8_mut (local.get $1))
  75. )
  76. )
  77. ;; null array argument traps
  78. (assert_trap (invoke "array_copy-null-left") "null array reference")
  79. (assert_trap (invoke "array_copy-null-right") "null array reference")
  80. ;; OOB initial index traps
  81. (assert_trap (invoke "array_copy" (i32.const 13) (i32.const 0) (i32.const 0)) "out of bounds array access")
  82. (assert_trap (invoke "array_copy" (i32.const 0) (i32.const 13) (i32.const 0)) "out of bounds array access")
  83. ;; OOB length traps
  84. (assert_trap (invoke "array_copy" (i32.const 0) (i32.const 0) (i32.const 13)) "out of bounds array access")
  85. (assert_trap (invoke "array_copy" (i32.const 0) (i32.const 0) (i32.const 13)) "out of bounds array access")
  86. ;; start index = array size, len = 0 doesn't trap
  87. (assert_return (invoke "array_copy" (i32.const 12) (i32.const 0) (i32.const 0)))
  88. (assert_return (invoke "array_copy" (i32.const 0) (i32.const 12) (i32.const 0)))
  89. ;; check arrays were not modified
  90. (assert_return (invoke "array_get_nth" (i32.const 0)) (i32.const 0))
  91. (assert_return (invoke "array_get_nth" (i32.const 5)) (i32.const 0))
  92. (assert_return (invoke "array_get_nth" (i32.const 11)) (i32.const 0))
  93. (assert_trap (invoke "array_get_nth" (i32.const 12)) "out of bounds array access")
  94. ;; normal case
  95. (assert_return (invoke "array_copy" (i32.const 0) (i32.const 0) (i32.const 2)))
  96. (assert_return (invoke "array_get_nth" (i32.const 0)) (i32.const 10))
  97. (assert_return (invoke "array_get_nth" (i32.const 1)) (i32.const 10))
  98. (assert_return (invoke "array_get_nth" (i32.const 2)) (i32.const 0))
  99. ;; test that overlapping array.copy works as if intermediate copy taken
  100. (assert_return (invoke "array_copy_overlap_test-1"))
  101. (assert_return (invoke "array_get_nth" (i32.const 0)) (i32.const 97))
  102. (assert_return (invoke "array_get_nth" (i32.const 1)) (i32.const 97))
  103. (assert_return (invoke "array_get_nth" (i32.const 2)) (i32.const 98))
  104. (assert_return (invoke "array_get_nth" (i32.const 5)) (i32.const 101))
  105. (assert_return (invoke "array_get_nth" (i32.const 10)) (i32.const 106))
  106. (assert_return (invoke "array_get_nth" (i32.const 11)) (i32.const 107))
  107. (assert_return (invoke "array_copy_overlap_test-2"))
  108. (assert_return (invoke "array_get_nth" (i32.const 0)) (i32.const 98))
  109. (assert_return (invoke "array_get_nth" (i32.const 1)) (i32.const 99))
  110. (assert_return (invoke "array_get_nth" (i32.const 5)) (i32.const 103))
  111. (assert_return (invoke "array_get_nth" (i32.const 9)) (i32.const 107))
  112. (assert_return (invoke "array_get_nth" (i32.const 10)) (i32.const 108))
  113. (assert_return (invoke "array_get_nth" (i32.const 11)) (i32.const 108))