diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/subtypes.wast | 44 | ||||
-rw-r--r-- | test/subtypes.wast.from-wast | 32 | ||||
-rw-r--r-- | test/subtypes.wast.fromBinary | 33 | ||||
-rw-r--r-- | test/subtypes.wast.fromBinary.noDebugInfo | 33 |
4 files changed, 142 insertions, 0 deletions
diff --git a/test/subtypes.wast b/test/subtypes.wast new file mode 100644 index 000000000..d37735777 --- /dev/null +++ b/test/subtypes.wast @@ -0,0 +1,44 @@ +;; Test that we can roundtrip struct and array types +(module + ;; Arrays + (type $vector-i32 (array i32)) + + (type $vector-i31 (array (ref i31))) + (type $vector-any (array (ref any))) + + ;; Structs + (type $struct-i31 (struct + (field (ref i31)) + )) + (type $struct-any (struct + (field (ref any)) + )) + (type $struct-i31_any (struct + (field (ref i31)) + (field (ref any)) + )) + + (func $foo (param $no-null (ref $vector-i32)) + (param $yes-null (ref null $vector-i32)) + ;; ok to set a non-nullable reference to a nullable target + (local.set $no-null (local.get $yes-null)) + ) + + (func $bar (param $v-i31 (ref $vector-i31)) + (param $v-any (ref $vector-any)) + ;; ok to set a vector of (immutable) i31s to a vector of anyies + (local.set $v-any (local.get $v-i31)) + ) + + (func $baz (param $s-i31 (ref $struct-i31)) + (param $s-any (ref $struct-any)) + ;; ok to set a struct of an (immutable) i31 to a one of an any + (local.set $s-any (local.get $s-i31)) + ) + + (func $boo (param $s-i31 (ref $struct-i31)) + (param $s-i31_any (ref $struct-i31_any)) + ;; also ok to have extra fields + (local.set $s-i31 (local.get $s-i31_any)) + ) +) diff --git a/test/subtypes.wast.from-wast b/test/subtypes.wast.from-wast new file mode 100644 index 000000000..249421578 --- /dev/null +++ b/test/subtypes.wast.from-wast @@ -0,0 +1,32 @@ +(module + (type ${ref?|i31|} (struct (field (ref null i31)))) + (type $[i32] (array i32)) + (type $ref?|{ref?|i31|}|_ref?|{anyref}|_=>_none (func (param (ref null ${ref?|i31|}) (ref null ${anyref})))) + (type $ref?|{ref?|i31|}|_ref?|{ref?|i31|_anyref}|_=>_none (func (param (ref null ${ref?|i31|}) (ref null ${ref?|i31|_anyref})))) + (type $ref?|[i32]|_ref?|[i32]|_=>_none (func (param (ref null $[i32]) (ref null $[i32])))) + (type $ref?|[ref?|i31|]|_ref?|[anyref]|_=>_none (func (param (ref null $[ref?|i31|]) (ref null $[anyref])))) + (type ${anyref} (struct (field anyref))) + (type ${ref?|i31|_anyref} (struct (field (ref null i31)) (field anyref))) + (type $[anyref] (array anyref)) + (type $[ref?|i31|] (array (ref null i31))) + (func $foo (param $no-null (ref null $[i32])) (param $yes-null (ref null $[i32])) + (local.set $no-null + (local.get $yes-null) + ) + ) + (func $bar (param $v-i31 (ref null $[ref?|i31|])) (param $v-any (ref null $[anyref])) + (local.set $v-any + (local.get $v-i31) + ) + ) + (func $baz (param $s-i31 (ref null ${ref?|i31|})) (param $s-any (ref null ${anyref})) + (local.set $s-any + (local.get $s-i31) + ) + ) + (func $boo (param $s-i31 (ref null ${ref?|i31|})) (param $s-i31_any (ref null ${ref?|i31|_anyref})) + (local.set $s-i31 + (local.get $s-i31_any) + ) + ) +) diff --git a/test/subtypes.wast.fromBinary b/test/subtypes.wast.fromBinary new file mode 100644 index 000000000..44f441f42 --- /dev/null +++ b/test/subtypes.wast.fromBinary @@ -0,0 +1,33 @@ +(module + (type ${ref?|i31|} (struct (field (ref null i31)))) + (type $[i32] (array i32)) + (type $ref?|{ref?|i31|}|_ref?|{anyref}|_=>_none (func (param (ref null ${ref?|i31|}) (ref null ${anyref})))) + (type $ref?|{ref?|i31|}|_ref?|{ref?|i31|_anyref}|_=>_none (func (param (ref null ${ref?|i31|}) (ref null ${ref?|i31|_anyref})))) + (type $ref?|[i32]|_ref?|[i32]|_=>_none (func (param (ref null $[i32]) (ref null $[i32])))) + (type $ref?|[ref?|i31|]|_ref?|[anyref]|_=>_none (func (param (ref null $[ref?|i31|]) (ref null $[anyref])))) + (type ${anyref} (struct (field anyref))) + (type ${ref?|i31|_anyref} (struct (field (ref null i31)) (field anyref))) + (type $[anyref] (array anyref)) + (type $[ref?|i31|] (array (ref null i31))) + (func $foo (param $no-null (ref null $[i32])) (param $yes-null (ref null $[i32])) + (local.set $no-null + (local.get $yes-null) + ) + ) + (func $bar (param $v-i31 (ref null $[ref?|i31|])) (param $v-any (ref null $[anyref])) + (local.set $v-any + (local.get $v-i31) + ) + ) + (func $baz (param $s-i31 (ref null ${ref?|i31|})) (param $s-any (ref null ${anyref})) + (local.set $s-any + (local.get $s-i31) + ) + ) + (func $boo (param $s-i31 (ref null ${ref?|i31|})) (param $s-i31_any (ref null ${ref?|i31|_anyref})) + (local.set $s-i31 + (local.get $s-i31_any) + ) + ) +) + diff --git a/test/subtypes.wast.fromBinary.noDebugInfo b/test/subtypes.wast.fromBinary.noDebugInfo new file mode 100644 index 000000000..d80e5afd0 --- /dev/null +++ b/test/subtypes.wast.fromBinary.noDebugInfo @@ -0,0 +1,33 @@ +(module + (type ${ref?|i31|} (struct (field (ref null i31)))) + (type $[i32] (array i32)) + (type $ref?|{ref?|i31|}|_ref?|{anyref}|_=>_none (func (param (ref null ${ref?|i31|}) (ref null ${anyref})))) + (type $ref?|{ref?|i31|}|_ref?|{ref?|i31|_anyref}|_=>_none (func (param (ref null ${ref?|i31|}) (ref null ${ref?|i31|_anyref})))) + (type $ref?|[i32]|_ref?|[i32]|_=>_none (func (param (ref null $[i32]) (ref null $[i32])))) + (type $ref?|[ref?|i31|]|_ref?|[anyref]|_=>_none (func (param (ref null $[ref?|i31|]) (ref null $[anyref])))) + (type ${anyref} (struct (field anyref))) + (type ${ref?|i31|_anyref} (struct (field (ref null i31)) (field anyref))) + (type $[anyref] (array anyref)) + (type $[ref?|i31|] (array (ref null i31))) + (func $0 (param $0 (ref null $[i32])) (param $1 (ref null $[i32])) + (local.set $0 + (local.get $1) + ) + ) + (func $1 (param $0 (ref null $[ref?|i31|])) (param $1 (ref null $[anyref])) + (local.set $1 + (local.get $0) + ) + ) + (func $2 (param $0 (ref null ${ref?|i31|})) (param $1 (ref null ${anyref})) + (local.set $1 + (local.get $0) + ) + ) + (func $3 (param $0 (ref null ${ref?|i31|})) (param $1 (ref null ${ref?|i31|_anyref})) + (local.set $0 + (local.get $1) + ) + ) +) + |