diff options
Diffstat (limited to 'test/spec/data.wast')
-rw-r--r-- | test/spec/data.wast | 335 |
1 files changed, 335 insertions, 0 deletions
diff --git a/test/spec/data.wast b/test/spec/data.wast new file mode 100644 index 000000000..7d6945417 --- /dev/null +++ b/test/spec/data.wast @@ -0,0 +1,335 @@ +;; Test the data section + +;; Syntax + +(module + (memory $m 1) + (data (i32.const 0)) + (data (i32.const 1) "a" "" "bcd") + (data (offset (i32.const 0))) + (data (offset (i32.const 0)) "" "a" "bc" "") + (data 0 (i32.const 0)) + (data 0x0 (i32.const 1) "a" "" "bcd") + (data 0x000 (offset (i32.const 0))) + (data 0 (offset (i32.const 0)) "" "a" "bc" "") + (data $m (i32.const 0)) + (data $m (i32.const 1) "a" "" "bcd") + (data $m (offset (i32.const 0))) + (data $m (offset (i32.const 0)) "" "a" "bc" "") +) + +;; Basic use + +(module + (memory 1) + (data (i32.const 0) "a") +) +(module + (import "spectest" "memory" (memory 1)) + (data (i32.const 0) "a") +) + +(module + (memory 1) + (data (i32.const 0) "a") + (data (i32.const 3) "b") + (data (i32.const 100) "cde") + (data (i32.const 5) "x") + (data (i32.const 3) "c") +) +(module + (import "spectest" "memory" (memory 1)) + (data (i32.const 0) "a") + (data (i32.const 1) "b") + (data (i32.const 2) "cde") + (data (i32.const 3) "f") + (data (i32.const 2) "g") + (data (i32.const 1) "h") +) + +(module + (global (import "spectest" "global_i32") i32) + (memory 1) + (data (global.get 0) "a") +) +(module + (global (import "spectest" "global_i32") i32) + (import "spectest" "memory" (memory 1)) + (data (global.get 0) "a") +) + +(module + (global $g (import "spectest" "global_i32") i32) + (memory 1) + (data (global.get $g) "a") +) +(module + (global $g (import "spectest" "global_i32") i32) + (import "spectest" "memory" (memory 1)) + (data (global.get $g) "a") +) + +;; Use of internal globals in constant expressions is not allowed in MVP. +;; (module (memory 1) (data (global.get 0) "a") (global i32 (i32.const 0))) +;; (module (memory 1) (data (global.get $g) "a") (global $g i32 (i32.const 0))) + +;; Corner cases + +(module + (memory 1) + (data (i32.const 0) "a") + (data (i32.const 0xffff) "b") +) +(module + (import "spectest" "memory" (memory 1)) + (data (i32.const 0) "a") + (data (i32.const 0xffff) "b") +) + +(module + (memory 2) + (data (i32.const 0x1_ffff) "a") +) + +(module + (memory 0) + (data (i32.const 0)) +) +(module + (import "spectest" "memory" (memory 0)) + (data (i32.const 0)) +) + +(module + (memory 0 0) + (data (i32.const 0)) +) + +(module + (memory 1) + (data (i32.const 0x1_0000) "") +) + +(module + (memory 0) + (data (i32.const 0) "" "") +) +(module + (import "spectest" "memory" (memory 0)) + (data (i32.const 0) "" "") +) + +(module + (memory 0 0) + (data (i32.const 0) "" "") +) + +(module + (import "spectest" "memory" (memory 0)) + (data (i32.const 0) "a") +) + +(module + (import "spectest" "memory" (memory 0 3)) + (data (i32.const 0) "a") +) + +(module + (global (import "spectest" "global_i32") i32) + (import "spectest" "memory" (memory 0)) + (data (global.get 0) "a") +) + +(module + (global (import "spectest" "global_i32") i32) + (import "spectest" "memory" (memory 0 3)) + (data (global.get 0) "a") +) + +(module + (import "spectest" "memory" (memory 0)) + (data (i32.const 1) "a") +) + +(module + (import "spectest" "memory" (memory 0 3)) + (data (i32.const 1) "a") +) + +;; Invalid bounds for data + +(assert_unlinkable + (module + (memory 0) + (data (i32.const 0) "a") + ) + "data segment does not fit" +) + +(assert_unlinkable + (module + (memory 0 0) + (data (i32.const 0) "a") + ) + "data segment does not fit" +) + +(assert_unlinkable + (module + (memory 0 1) + (data (i32.const 0) "a") + ) + "data segment does not fit" +) + +(assert_unlinkable + (module + (memory 0) + (data (i32.const 1)) + ) + "data segment does not fit" +) + +(assert_unlinkable + (module + (memory 0 1) + (data (i32.const 1)) + ) + "data segment does not fit" +) + +;; This seems to cause a time-out on Travis. +(;assert_unlinkable + (module + (memory 0x10000) + (data (i32.const 0xffffffff) "ab") + ) + "" ;; either out of memory or segment does not fit +;) + +(assert_unlinkable + (module + (global (import "spectest" "global_i32") i32) + (memory 0) + (data (global.get 0) "a") + ) + "data segment does not fit" +) + +(assert_unlinkable + (module + (memory 1 2) + (data (i32.const 0x1_0000) "a") + ) + "data segment does not fit" +) +(assert_unlinkable + (module + (import "spectest" "memory" (memory 1)) + (data (i32.const 0x1_0000) "a") + ) + "data segment does not fit" +) + +(assert_unlinkable + (module + (memory 2) + (data (i32.const 0x2_0000) "a") + ) + "data segment does not fit" +) + +(assert_unlinkable + (module + (memory 2 3) + (data (i32.const 0x2_0000) "a") + ) + "data segment does not fit" +) + +(assert_unlinkable + (module + (memory 1) + (data (i32.const -1) "a") + ) + "data segment does not fit" +) +(assert_unlinkable + (module + (import "spectest" "memory" (memory 1)) + (data (i32.const -1) "a") + ) + "data segment does not fit" +) + +(assert_unlinkable + (module + (memory 2) + (data (i32.const -100) "a") + ) + "data segment does not fit" +) +(assert_unlinkable + (module + (import "spectest" "memory" (memory 1)) + (data (i32.const -100) "a") + ) + "data segment does not fit" +) + +;; Data without memory + +(assert_invalid + (module + (data (i32.const 0) "") + ) + "unknown memory" +) + +;; Invalid offsets + +(assert_invalid + (module + (memory 1) + (data (i64.const 0)) + ) + "type mismatch" +) + +(assert_invalid + (module + (memory 1) + (data (i32.ctz (i32.const 0))) + ) + "constant expression required" +) + +(assert_invalid + (module + (memory 1) + (data (nop)) + ) + "constant expression required" +) + +(assert_invalid + (module + (memory 1) + (data (offset (nop) (i32.const 0))) + ) + "constant expression required" +) + +(assert_invalid + (module + (memory 1) + (data (offset (i32.const 0) (nop))) + ) + "constant expression required" +) + +;; Use of internal globals in constant expressions is not allowed in MVP. +;; (assert_invalid +;; (module (memory 1) (data (global.get $g)) (global $g (mut i32) (i32.const 0))) +;; "constant expression required" +;; ) |