Skip to content

Commit a765a6d

Browse files
authored
Merge pull request #562 from fitzgen/test-for-out-of-bounds-array-new-data
Expand tests for `array.new_data`
2 parents 671b526 + f846dd1 commit a765a6d

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

test/core/gc/array_new_data.wast

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

0 commit comments

Comments
 (0)