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