summaryrefslogtreecommitdiff
path: root/crates/wasm-testsuite/tests/proposals
diff options
context:
space:
mode:
authorDaniel Stuart <daniel.stuart14@gmail.com>2024-09-09 19:19:25 -0300
committerGitHub <noreply@github.com>2024-09-10 00:19:25 +0200
commit3c16adc4e12873802b15d77a8357f56893a9c84f (patch)
tree3c592f7546c85f4c95434a0537c7281c8d812019 /crates/wasm-testsuite/tests/proposals
parentba6a03d6038f8c1e3973879bd23490a86539d2b1 (diff)
feat: Custom memory page size (#22)
Diffstat (limited to 'crates/wasm-testsuite/tests/proposals')
-rw-r--r--crates/wasm-testsuite/tests/proposals/custom-page-sizes/custom-page-sizes-invalid.wast112
-rw-r--r--crates/wasm-testsuite/tests/proposals/custom-page-sizes/custom-page-sizes.wast110
2 files changed, 222 insertions, 0 deletions
diff --git a/crates/wasm-testsuite/tests/proposals/custom-page-sizes/custom-page-sizes-invalid.wast b/crates/wasm-testsuite/tests/proposals/custom-page-sizes/custom-page-sizes-invalid.wast
new file mode 100644
index 0000000..150f58b
--- /dev/null
+++ b/crates/wasm-testsuite/tests/proposals/custom-page-sizes/custom-page-sizes-invalid.wast
@@ -0,0 +1,112 @@
+;; from https://github.com/WebAssembly/custom-page-sizes/blob/main/test/core/custom-page-sizes/custom-page-sizes-invalid.wast
+
+;; Page size that is not a power of two.
+(assert_malformed
+ (module quote "(memory 0 (pagesize 3))")
+ "invalid custom page size"
+)
+
+;; Power-of-two page sizes that are not 1 or 64KiB.
+(assert_invalid
+ (module (memory 0 (pagesize 2)))
+ "invalid custom page size"
+)
+(assert_invalid
+ (module (memory 0 (pagesize 4)))
+ "invalid custom page size"
+)
+(assert_invalid
+ (module (memory 0 (pagesize 8)))
+ "invalid custom page size"
+)
+(assert_invalid
+ (module (memory 0 (pagesize 16)))
+ "invalid custom page size"
+)
+(assert_invalid
+ (module (memory 0 (pagesize 32)))
+ "invalid custom page size"
+)
+(assert_invalid
+ (module (memory 0 (pagesize 64)))
+ "invalid custom page size"
+)
+(assert_invalid
+ (module (memory 0 (pagesize 128)))
+ "invalid custom page size"
+)
+(assert_invalid
+ (module (memory 0 (pagesize 256)))
+ "invalid custom page size"
+)
+(assert_invalid
+ (module (memory 0 (pagesize 512)))
+ "invalid custom page size"
+)
+(assert_invalid
+ (module (memory 0 (pagesize 1024)))
+ "invalid custom page size"
+)
+(assert_invalid
+ (module (memory 0 (pagesize 2048)))
+ "invalid custom page size"
+)
+(assert_invalid
+ (module (memory 0 (pagesize 4096)))
+ "invalid custom page size"
+)
+(assert_invalid
+ (module (memory 0 (pagesize 8192)))
+ "invalid custom page size"
+)
+(assert_invalid
+ (module (memory 0 (pagesize 16384)))
+ "invalid custom page size"
+)
+(assert_invalid
+ (module (memory 0 (pagesize 32768)))
+ "invalid custom page size"
+)
+
+;; Power-of-two page size that is larger than 64KiB.
+(assert_invalid
+ (module (memory 0 (pagesize 0x20000)))
+ "invalid custom page size"
+)
+
+;; Power of two page size that cannot fit in a u64 to exercise checks against
+;; shift overflow.
+(assert_malformed
+ (module binary
+ "\00asm" "\01\00\00\00"
+ "\05\04\01" ;; Memory section
+
+ ;; memory 0
+ "\08" ;; flags w/ custom page size
+ "\00" ;; minimum = 0
+ "\41" ;; pagesize = 2**65
+ )
+ "invalid custom page size"
+)
+
+;; Importing a memory with the wrong page size.
+
+(module $m
+ (memory (export "small-pages-memory") 0 (pagesize 1))
+ (memory (export "large-pages-memory") 0 (pagesize 65536))
+)
+(register "m" $m)
+
+(assert_unlinkable
+ (module
+ (memory (import "m" "small-pages-memory") 0 (pagesize 65536))
+ )
+ "incompatible import type"
+)
+
+(assert_unlinkable
+ (module
+ (memory (import "m" "large-pages-memory") 0 (pagesize 1))
+ )
+ "incompatible import type"
+)
diff --git a/crates/wasm-testsuite/tests/proposals/custom-page-sizes/custom-page-sizes.wast b/crates/wasm-testsuite/tests/proposals/custom-page-sizes/custom-page-sizes.wast
new file mode 100644
index 0000000..f59d52b
--- /dev/null
+++ b/crates/wasm-testsuite/tests/proposals/custom-page-sizes/custom-page-sizes.wast
@@ -0,0 +1,110 @@
+;; from https://github.com/WebAssembly/custom-page-sizes/blob/main/test/core/custom-page-sizes/custom-page-sizes.wast
+
+;; Check all the valid custom page sizes.
+(module (memory 1 (pagesize 1)))
+(module (memory 1 (pagesize 65536)))
+
+;; Check them all again with maximums specified.
+(module (memory 1 2 (pagesize 1)))
+(module (memory 1 2 (pagesize 65536)))
+
+;; Check the behavior of memories with page size 1.
+(module
+ (memory 0 (pagesize 1))
+ (func (export "size") (result i32)
+ memory.size
+ )
+ (func (export "grow") (param i32) (result i32)
+ (memory.grow (local.get 0))
+ )
+ (func (export "load") (param i32) (result i32)
+ (i32.load8_u (local.get 0))
+ )
+ (func (export "store") (param i32 i32)
+ (i32.store8 (local.get 0) (local.get 1))
+ )
+)
+
+(assert_return (invoke "size") (i32.const 0))
+(assert_trap (invoke "load" (i32.const 0)) "out of bounds memory access")
+
+(assert_return (invoke "grow" (i32.const 65536)) (i32.const 0))
+(assert_return (invoke "size") (i32.const 65536))
+(assert_return (invoke "load" (i32.const 65535)) (i32.const 0))
+(assert_return (invoke "store" (i32.const 65535) (i32.const 1)))
+(assert_return (invoke "load" (i32.const 65535)) (i32.const 1))
+(assert_trap (invoke "load" (i32.const 65536)) "out of bounds memory access")
+
+(assert_return (invoke "grow" (i32.const 65536)) (i32.const 65536))
+(assert_return (invoke "size") (i32.const 131072))
+(assert_return (invoke "load" (i32.const 131071)) (i32.const 0))
+(assert_return (invoke "store" (i32.const 131071) (i32.const 1)))
+(assert_return (invoke "load" (i32.const 131071)) (i32.const 1))
+(assert_trap (invoke "load" (i32.const 131072)) "out of bounds memory access")
+
+;; Although smaller page sizes let us get to memories larger than 2**16 pages,
+;; we can't do that with the default page size, even if we explicitly state it
+;; as a custom page size.
+(module
+ (memory 0 (pagesize 65536))
+ (func (export "size") (result i32)
+ memory.size
+ )
+ (func (export "grow") (param i32) (result i32)
+ (memory.grow (local.get 0))
+ )
+)
+(assert_return (invoke "size") (i32.const 0))
+(assert_return (invoke "grow" (i32.const 65537)) (i32.const -1))
+(assert_return (invoke "size") (i32.const 0))
+
+;; Can copy between memories of different page sizes.
+(module
+ (memory $small 10 (pagesize 1))
+ (memory $large 1 (pagesize 65536))
+
+ (data (memory $small) (i32.const 0) "\11\22\33\44")
+ (data (memory $large) (i32.const 0) "\55\66\77\88")
+
+ (func (export "copy-small-to-large") (param i32 i32 i32)
+ (memory.copy $large $small (local.get 0) (local.get 1) (local.get 2))
+ )
+
+ (func (export "copy-large-to-small") (param i32 i32 i32)
+ (memory.copy $small $large (local.get 0) (local.get 1) (local.get 2))
+ )
+
+ (func (export "load8-small") (param i32) (result i32)
+ (i32.load8_u $small (local.get 0))
+ )
+
+ (func (export "load8-large") (param i32) (result i32)
+ (i32.load8_u $large (local.get 0))
+ )
+)
+
+(assert_return (invoke "copy-small-to-large" (i32.const 6) (i32.const 0) (i32.const 2)))
+(assert_return (invoke "load8-large" (i32.const 6)) (i32.const 0x11))
+(assert_return (invoke "load8-large" (i32.const 7)) (i32.const 0x22))
+
+(assert_return (invoke "copy-large-to-small" (i32.const 4) (i32.const 1) (i32.const 3)))
+(assert_return (invoke "load8-small" (i32.const 4)) (i32.const 0x66))
+(assert_return (invoke "load8-small" (i32.const 5)) (i32.const 0x77))
+(assert_return (invoke "load8-small" (i32.const 6)) (i32.const 0x88))
+
+;; Can link together modules that export and import memories with custom page
+;; sizes.
+
+(module $m
+ (memory (export "small-pages-memory") 0 (pagesize 1))
+ (memory (export "large-pages-memory") 0 (pagesize 65536))
+)
+(register "m" $m)
+
+(module
+ (memory (import "m" "small-pages-memory") 0 (pagesize 1))
+)
+
+(module
+ (memory (import "m" "large-pages-memory") 0 (pagesize 65536))
+)