1;;! gc = true
2
3(module
4  (type $arr (array (mut i8)))
5
6  (data $d "abcd")
7
8  (func (export "array-new-data") (param i32 i32) (result (ref $arr))
9    (array.new_data $arr $d (local.get 0) (local.get 1))
10  )
11)
12
13;; In-bounds data segment accesses.
14(assert_return (invoke "array-new-data" (i32.const 0) (i32.const 0)) (ref.array))
15(assert_return (invoke "array-new-data" (i32.const 0) (i32.const 4)) (ref.array))
16(assert_return (invoke "array-new-data" (i32.const 1) (i32.const 2)) (ref.array))
17(assert_return (invoke "array-new-data" (i32.const 4) (i32.const 0)) (ref.array))
18
19;; Out-of-bounds data segment accesses.
20(assert_trap (invoke "array-new-data" (i32.const 0) (i32.const 5)) "out of bounds memory access")
21(assert_trap (invoke "array-new-data" (i32.const 5) (i32.const 0)) "out of bounds memory access")
22(assert_trap (invoke "array-new-data" (i32.const 1) (i32.const 4)) "out of bounds memory access")
23(assert_trap (invoke "array-new-data" (i32.const 4) (i32.const 1)) "out of bounds memory access")
24
25
26(module
27  (type $arr (array (mut i8)))
28
29  (data $d "\aa\bb\cc\dd")
30
31  (func (export "array-new-data-contents") (result i32 i32)
32    (local (ref $arr))
33    (local.set 0 (array.new_data $arr $d (i32.const 1) (i32.const 2)))
34    (array.get_u $arr (local.get 0) (i32.const 0))
35    (array.get_u $arr (local.get 0) (i32.const 1))
36  )
37)
38
39;; Array is initialized with the correct contents.
40(assert_return (invoke "array-new-data-contents") (i32.const 0xbb) (i32.const 0xcc))
41
42(module
43  (type $arr (array (mut i32)))
44
45  (data $d "\aa\bb\cc\dd")
46
47  (func (export "array-new-data-little-endian") (result i32)
48    (array.get $arr
49               (array.new_data $arr $d (i32.const 0) (i32.const 1))
50               (i32.const 0))
51  )
52)
53
54;; Data segments are interpreted as little-endian.
55(assert_return (invoke "array-new-data-little-endian") (i32.const 0xddccbbaa))
56
57(module
58  (type $arr (array (mut i16)))
59
60  (data $d "\00\11\22")
61
62  (func (export "array-new-data-unaligned") (result i32)
63    (array.get_u $arr
64                 (array.new_data $arr $d (i32.const 1) (i32.const 1))
65                 (i32.const 0))
66  )
67)
68
69;; Data inside the segment doesn't need to be aligned to the element size.
70(assert_return (invoke "array-new-data-unaligned") (i32.const 0x2211))
71