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