1;;! gc = true 2;;! bulk_memory = true 3 4(module 5 (type $arr (array (mut i8))) 6 7 (data $d "abcd") 8 9 (func (export "array-init-data") (param $arr_len i32) 10 (param $dst i32) 11 (param $src i32) 12 (param $data_len i32) (result (ref $arr)) 13 (local $a (ref $arr)) 14 (local.set $a (array.new_default $arr (local.get $arr_len))) 15 (array.init_data $arr $d (local.get $a) (local.get $dst) (local.get $src) (local.get $data_len)) 16 (local.get $a) 17 ) 18) 19 20;; In bounds. 21(assert_return (invoke "array-init-data" (i32.const 4) (i32.const 0) (i32.const 0) (i32.const 0)) (ref.array)) 22(assert_return (invoke "array-init-data" (i32.const 4) (i32.const 0) (i32.const 0) (i32.const 4)) (ref.array)) 23(assert_return (invoke "array-init-data" (i32.const 4) (i32.const 0) (i32.const 1) (i32.const 2)) (ref.array)) 24(assert_return (invoke "array-init-data" (i32.const 4) (i32.const 0) (i32.const 4) (i32.const 0)) (ref.array)) 25 26;; Out-of-bounds data segment accesses. 27(assert_trap 28 (invoke "array-init-data" (i32.const 5) (i32.const 0) (i32.const 0) (i32.const 5)) 29 "out of bounds memory access") 30(assert_trap 31 (invoke "array-init-data" (i32.const 4) (i32.const 0) (i32.const 5) (i32.const 0)) 32 "out of bounds memory access") 33(assert_trap 34 (invoke "array-init-data" (i32.const 4) (i32.const 0) (i32.const 1) (i32.const 4)) 35 "out of bounds memory access") 36(assert_trap 37 (invoke "array-init-data" (i32.const 4) (i32.const 0) (i32.const 4) (i32.const 1)) 38 "out of bounds memory access") 39 40;; Out-of-bounds array accesses. 41(assert_trap 42 (invoke "array-init-data" (i32.const 3) (i32.const 0) (i32.const 0) (i32.const 4)) 43 "out of bounds array access") 44(assert_trap 45 (invoke "array-init-data" (i32.const 3) (i32.const 1) (i32.const 0) (i32.const 3)) 46 "out of bounds array access") 47(assert_trap 48 (invoke "array-init-data" (i32.const 3) (i32.const 3) (i32.const 0) (i32.const 1)) 49 "out of bounds array access") 50(assert_trap 51 (invoke "array-init-data" (i32.const 3) (i32.const 4) (i32.const 0) (i32.const 0)) 52 "out of bounds array access") 53 54(module 55 (type $arr (array (mut i8))) 56 57 (data $d "\aa\bb\cc\dd") 58 59 (func (export "array-init-data-contents") (result i32 i32) 60 (local (ref $arr)) 61 (local.set 0 (array.new_default $arr (i32.const 4))) 62 (array.init_data $arr $d (local.get 0) (i32.const 0) (i32.const 1) (i32.const 2)) 63 (array.get_u $arr (local.get 0) (i32.const 0)) 64 (array.get_u $arr (local.get 0) (i32.const 1)) 65 ) 66) 67 68;; Array is initialized with the correct contents. 69(assert_return (invoke "array-init-data-contents") (i32.const 0xbb) (i32.const 0xcc)) 70 71(module 72 (type $arr (array (mut i32))) 73 74 (data $d "\aa\bb\cc\dd") 75 76 (func (export "array-init-data-little-endian") (result i32) 77 (local (ref $arr)) 78 (local.set 0 (array.new_default $arr (i32.const 1))) 79 (array.init_data $arr $d (local.get 0) (i32.const 0) (i32.const 0) (i32.const 1)) 80 (array.get $arr (local.get 0) (i32.const 0)) 81 ) 82) 83 84;; Data segments are interpreted as little-endian. 85(assert_return (invoke "array-init-data-little-endian") (i32.const 0xddccbbaa)) 86 87(module 88 (type $arr (array (mut i16))) 89 90 (data $d "\00\11\22") 91 92 (func (export "array-init-data-unaligned") (result i32) 93 (local (ref $arr)) 94 (local.set 0 (array.new_default $arr (i32.const 1))) 95 (array.init_data $arr $d (local.get 0) (i32.const 0) (i32.const 1) (i32.const 1)) 96 (array.get_u $arr (local.get 0) (i32.const 0)) 97 ) 98) 99 100;; Data inside the segment doesn't need to be aligned to the element size. 101(assert_return (invoke "array-init-data-unaligned") (i32.const 0x2211)) 102