blob: f06fad2a756c39f7772f78b8f681d1bbff429149 [file] [log] [blame] [edit]
;; 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"
)