;; Shared array declaration syntax (module (type (shared (array i8))) (type (sub final (shared (array i8)))) (rec (type (sub final (shared (array i8)))) ) (global (ref 0) (array.new_default 1 (i32.const 1))) (global (ref 1) (array.new_default 2 (i32.const 1))) (global (ref 2) (array.new_default 0 (i32.const 1))) ) ;; Shared arrays are distinct from non-shared arrays (assert_invalid (module (type (shared (array i8))) (type (array i8)) (global (ref 0) (array.new_default 1 (i32.const 1))) ) "not a subtype" ) (assert_invalid (module (type (shared (array i8))) (type (array i8)) (global (ref 1) (array.new 0)) ) "not a subtype" ) ;; Shared arrays may not be subtypes of non-shared arrays (assert_invalid (module (type (sub (array i8))) (type (sub 0 (shared (array i8)))) ) "invalid supertype" ) ;; Non-shared arrays may not be subtypes of shared arrays (assert_invalid (module (type (sub (shared (array i8)))) (type (sub 0 (array i8))) ) "invalid supertype" ) ;; Shared arrays may not contain non-shared references (assert_invalid (module (type (shared (array anyref))) ) "invalid field" ) ;; But they may contain shared references (module (type (shared (array (ref null (shared any))))) ) ;; Non-shared arrays may contain shared references (module (type (array (ref null (shared any)))) ) ;; Array instructions work on shared arrays. (module (type $i8 (shared (array (mut i8)))) (type $i32 (shared (array (mut i32)))) (type $unshared (array (mut i8))) (type $funcs (shared (array (mut (ref null (shared any)))))) (data) (elem (ref null (shared any))) (func (array.new $i8 (i32.const 0) (i32.const 0)) (drop)) (func (array.new_default $i8 (i32.const 0)) (drop)) (func (array.new_fixed $i8 0) (drop)) (func (param (ref null $i8)) (array.get_s $i8 (local.get 0) (i32.const 0)) (drop)) (func (param (ref null $i8)) (array.get_u $i8 (local.get 0) (i32.const 0)) (drop)) (func (param (ref null $i32)) (array.get $i32 (local.get 0) (i32.const 0)) (drop)) (func (param (ref null $i8)) (array.set $i8 (local.get 0) (i32.const 0) (i32.const 0))) (func (param (ref null $i8) (ref null $i8)) (array.copy $i8 $i8 (local.get 0) (i32.const 0) (local.get 1) (i32.const 0) (i32.const 0))) (func (param (ref null $i8) (ref null $unshared)) (array.copy $i8 $unshared (local.get 0) (i32.const 0) (local.get 1) (i32.const 0) (i32.const 0))) (func (param (ref null $unshared) (ref null $i8)) (array.copy $unshared $i8 (local.get 0) (i32.const 0) (local.get 1) (i32.const 0) (i32.const 0))) (func (param (ref null $i8)) (array.fill $i8 (local.get 0) (i32.const 0) (i32.const 0) (i32.const 0))) (func (param (ref null $i8)) (array.init_data $i8 0 (local.get 0) (i32.const 0) (i32.const 0) (i32.const 0))) (func (param (ref null $funcs)) (array.init_elem $funcs 0 (local.get 0) (i32.const 0) (i32.const 0) (i32.const 0))) ) ;; Bottom types (module (type $i8 (shared (array (mut i8)))) (type $i32 (shared (array (mut i32)))) (type $funcs (shared (array (mut (ref null (shared func)))))) (data) (elem (ref null (shared func))) (func (array.get_s $i8 (ref.null (shared none)) (i32.const 0)) (drop)) (func (array.get_u $i8 (ref.null (shared none)) (i32.const 0)) (drop)) (func (array.get $i32 (ref.null (shared none)) (i32.const 0)) (drop)) (func (array.set $i8 (ref.null (shared none)) (i32.const 0) (i32.const 0))) (func (param (ref null $i8)) (array.copy $i8 $i8 (ref.null (shared none)) (i32.const 0) (local.get 0) (i32.const 0) (i32.const 0))) (func (param (ref null $i8)) (array.copy $i8 $i8 (local.get 0) (i32.const 0) (ref.null (shared none)) (i32.const 0) (i32.const 0))) (func (array.copy $i8 $i8 (ref.null (shared none)) (i32.const 0) (ref.null (shared none)) (i32.const 0) (i32.const 0))) (func (array.fill $i8 (ref.null (shared none)) (i32.const 0) (i32.const 0) (i32.const 0))) (func (array.init_data $i8 0 (ref.null (shared none)) (i32.const 0) (i32.const 0) (i32.const 0))) (func (array.init_elem $funcs 0 (ref.null (shared none)) (i32.const 0) (i32.const 0) (i32.const 0))) ) ;; Check validation of element segments (assert_invalid (module (type $array (shared (array (mut (ref null (shared any)))))) (elem (ref null (shared func))) (func (array.init_elem $array 0 (ref.null (shared none)) (i32.const 0) (i32.const 0) (i32.const 0))) ) "invalid field type" )