wasmtime-cli 46.0.0

Command-line interface for Wasmtime
Documentation
;;! gc = true

;; Test `array.len` on various array sizes.

(module
  (type $arr-i32 (array (mut i32)))
  (type $arr-ref (array (mut anyref)))

  (func (export "len-zero") (result i32)
    (array.len (array.new_default $arr-i32 (i32.const 0)))
  )

  (func (export "len-one") (result i32)
    (array.len (array.new_default $arr-i32 (i32.const 1)))
  )

  (func (export "len-many") (result i32)
    (array.len (array.new_default $arr-i32 (i32.const 100)))
  )

  (func (export "len-fixed") (result i32)
    (array.len
      (array.new_fixed $arr-i32 4
        (i32.const 10)
        (i32.const 20)
        (i32.const 30)
        (i32.const 40)
      )
    )
  )

  ;; array.len should not change after set operations
  (func (export "len-after-set") (result i32)
    (local $a (ref $arr-i32))
    (local.set $a (array.new_default $arr-i32 (i32.const 5)))
    (array.set $arr-i32 (local.get $a) (i32.const 0) (i32.const 99))
    (array.set $arr-i32 (local.get $a) (i32.const 4) (i32.const 99))
    (array.len (local.get $a))
  )

  ;; array.len on a ref-element array
  (func (export "len-ref-array") (result i32)
    (array.len (array.new_default $arr-ref (i32.const 7)))
  )
)

(assert_return (invoke "len-zero") (i32.const 0))
(assert_return (invoke "len-one") (i32.const 1))
(assert_return (invoke "len-many") (i32.const 100))
(assert_return (invoke "len-fixed") (i32.const 4))
(assert_return (invoke "len-after-set") (i32.const 5))
(assert_return (invoke "len-ref-array") (i32.const 7))

;; array.len on a null array reference should trap
(module
  (type $arr (array i32))
  (func (export "len-null")
    (drop (array.len (ref.null $arr)))
  )
)
(assert_trap (invoke "len-null") "null array reference")