Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/tests/misc_testsuite/gc/struct-instructions.wast
1692 views
;;! gc = true

(module
  (type $ty (struct (field (mut f32))
                    (field (mut i8))
                    (field (mut anyref))))

  (global $g (mut (ref null $ty)) (ref.null $ty))

  ;; Constructors.

  (func $new (param f32 i32 anyref) (result (ref $ty))
    (struct.new $ty (local.get 0) (local.get 1) (local.get 2))
  )
  (func (export "new") (param f32 i32 anyref)
    (global.set $g (call $new (local.get 0) (local.get 1) (local.get 2)))
  )

  (func $new-default (result (ref $ty))
    (struct.new_default $ty)
  )
  (func (export "new-default")
    (global.set $g (call $new-default))
  )

  ;; Getters.

  (func $get-f32 (param (ref null $ty)) (result f32)
    (struct.get $ty 0 (local.get 0))
  )
  (func (export "get-f32") (result f32)
    (call $get-f32 (global.get $g))
  )

  (func $get-s-i8 (param (ref null $ty)) (result i32)
    (struct.get_s $ty 1 (local.get 0))
  )
  (func (export "get-s-i8") (result i32)
    (call $get-s-i8 (global.get $g))
  )

  (func $get-u-i8 (param (ref null $ty)) (result i32)
    (struct.get_u $ty 1 (local.get 0))
  )
  (func (export "get-u-i8") (result i32)
    (call $get-u-i8 (global.get $g))
  )

  (func $get-anyref (param (ref null $ty)) (result anyref)
    (struct.get $ty 2 (local.get 0))
  )
  (func (export "get-anyref") (result anyref)
    (call $get-anyref (global.get $g))
  )

  ;; Setters.

  (func $set-f32 (param (ref null $ty) f32)
    (struct.set $ty 0 (local.get 0) (local.get 1))
  )
  (func (export "set-f32") (param f32)
    (call $set-f32 (global.get $g) (local.get 0))
  )

  (func $set-i8 (param (ref null $ty) i32)
    (struct.set $ty 1 (local.get 0) (local.get 1))
  )
  (func (export "set-i8") (param i32)
    (call $set-i8 (global.get $g) (local.get 0))
  )

  (func $set-anyref (param (ref null $ty) anyref)
    (struct.set $ty 2 (local.get 0) (local.get 1))
  )
  (func (export "set-anyref") (param anyref)
    (call $set-anyref (global.get $g) (local.get 0))
  )

  (func (export "set-anyref-non-null")
    (call $set-anyref (global.get $g) (struct.new_default $ty))
  )
)

(assert_return (invoke "new" (f32.const 1) (i32.const -1) (ref.null any)))
(assert_return (invoke "get-f32") (f32.const 1))
(assert_return (invoke "get-s-i8") (i32.const -1))
(assert_return (invoke "get-u-i8") (i32.const 255))
(assert_return (invoke "get-anyref") (ref.null any))

(assert_return (invoke "new-default"))
(assert_return (invoke "get-f32") (f32.const 0))
(assert_return (invoke "get-s-i8") (i32.const 0))
(assert_return (invoke "get-u-i8") (i32.const 0))
(assert_return (invoke "get-anyref") (ref.null any))

(assert_return (invoke "set-f32" (f32.const 2)))
(assert_return (invoke "get-f32") (f32.const 2))

(assert_return (invoke "set-i8" (i32.const -1)))
(assert_return (invoke "get-s-i8") (i32.const -1))
(assert_return (invoke "get-u-i8") (i32.const 255))

(assert_return (invoke "set-anyref-non-null"))
(assert_return (invoke "get-anyref") (ref.struct))
(assert_return (invoke "set-anyref" (ref.null any)))
(assert_return (invoke "get-anyref") (ref.null any))

;; Null dereference

(module
  (type $t (struct (field (mut i32) (mut i16))))

  (func (export "struct.get-null") (param (ref null $t))
    (drop (struct.get $t 0 (local.get 0)))
  )

  (func (export "struct.get_s-null") (param (ref null $t))
    (drop (struct.get_s $t 1 (local.get 0)))
  )

  (func (export "struct.get_u-null") (param (ref null $t))
    (drop (struct.get_u $t 1 (local.get 0)))
  )

  (func (export "struct.set-null") (param (ref null $t))
    (struct.set $t 0 (local.get 0) (i32.const 0))
  )
)

(assert_trap (invoke "struct.get-null" (ref.null none)) "null structure reference")
(assert_trap (invoke "struct.get_s-null" (ref.null none)) "null structure reference")
(assert_trap (invoke "struct.get_u-null" (ref.null none)) "null structure reference")
(assert_trap (invoke "struct.set-null" (ref.null none)) "null structure reference")