binaryen-sys 0.13.0

Bindings to the binaryen library
Documentation
;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited.

;; Check that heap types are emitted properly in the binary format. This file
;; contains small modules that each use a single instruction with a heap type.
;; If we forgot to update collectHeapTypes then we would not write out their
;; type, and hit an error during --roundtrip.

;; RUN: foreach %s %t wasm-opt -all --roundtrip -S -o - | filecheck %s

(module
  (type $struct.A (struct i32))
  (type $struct.B (struct i32))
  ;; CHECK:      (func $test (type $0)
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (ref.test (ref none)
  ;; CHECK-NEXT:    (ref.null none)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $test
    (drop
      (ref.test (ref $struct.B) (ref.null $struct.A))
    )
  )
)

(module
  (type $struct.A (struct i32))
  (type $struct.B (struct i32))
  ;; CHECK:      (func $test (type $0)
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (ref.cast nullref
  ;; CHECK-NEXT:    (ref.null none)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $test
    ;; Note that this will not round-trip precisely because Binaryen IR will
    ;; apply the more refined type to the cast automatically (in finalize).
    (drop
      (ref.cast (ref null $struct.B) (ref.null $struct.A))
    )
  )
)

(module
  ;; CHECK:      (type $struct.A (struct (field i32)))
  (type $struct.A (struct i32))
  ;; CHECK:      (func $test (type $0)
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (struct.new_default $struct.A)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $test
    (drop
      (struct.new_default $struct.A)
    )
  )
)

(module
  ;; CHECK:      (type $vector (array (mut f64)))
  (type $vector (array (mut f64)))
  ;; CHECK:      (func $test (type $0)
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (array.new $vector
  ;; CHECK-NEXT:    (f64.const 3.14159)
  ;; CHECK-NEXT:    (i32.const 3)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $test
    (drop
      (array.new $vector
        (f64.const 3.14159)
        (i32.const 3)
      )
    )
  )
)

(module
  ;; CHECK:      (type $vector (array (mut f64)))
  (type $vector (array (mut f64)))
  ;; CHECK:      (func $test (type $0)
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (array.new_fixed $vector 4
  ;; CHECK-NEXT:    (f64.const 1)
  ;; CHECK-NEXT:    (f64.const 2)
  ;; CHECK-NEXT:    (f64.const 4)
  ;; CHECK-NEXT:    (f64.const 8)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $test
    (drop
      (array.new_fixed $vector 4
        (f64.const 1)
        (f64.const 2)
        (f64.const 4)
        (f64.const 8)
      )
    )
  )
)

(module
  ;; CHECK:      (type $vector (array (mut f64)))
  (type $vector (array (mut f64)))
  ;; CHECK:      (func $test (type $1) (param $ref (ref $vector)) (param $index i32) (param $value f64) (param $size i32)
  ;; CHECK-NEXT:  (array.fill $vector
  ;; CHECK-NEXT:   (local.get $ref)
  ;; CHECK-NEXT:   (local.get $index)
  ;; CHECK-NEXT:   (local.get $value)
  ;; CHECK-NEXT:   (local.get $size)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $test (param $ref (ref $vector))
              (param $index i32)
              (param $value f64)
              (param $size i32)
    (array.fill $vector
      (local.get $ref)
      (local.get $index)
      (local.get $value)
      (local.get $size)
    )
  )
)

(module
  ;; CHECK:      (type $vector (array (mut i32)))
  (type $vector (array (mut i32)))
  (data "")
  ;; CHECK:      (func $test (type $1) (param $ref (ref $vector)) (param $index i32) (param $offset i32) (param $size i32)
  ;; CHECK-NEXT:  (array.init_data $vector $0
  ;; CHECK-NEXT:   (local.get $ref)
  ;; CHECK-NEXT:   (local.get $index)
  ;; CHECK-NEXT:   (local.get $offset)
  ;; CHECK-NEXT:   (local.get $size)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $test (param $ref (ref $vector))
              (param $index i32)
              (param $offset i32)
              (param $size i32)
    (array.init_data $vector 0
      (local.get $ref)
      (local.get $index)
      (local.get $offset)
      (local.get $size)
    )
  )
)

(module
  ;; CHECK:      (type $vector (array (mut funcref)))
  (type $vector (array (mut funcref)))
  (elem func)
  ;; CHECK:      (func $test (type $1) (param $ref (ref $vector)) (param $index i32) (param $offset i32) (param $size i32)
  ;; CHECK-NEXT:  (array.init_elem $vector $0
  ;; CHECK-NEXT:   (local.get $ref)
  ;; CHECK-NEXT:   (local.get $index)
  ;; CHECK-NEXT:   (local.get $offset)
  ;; CHECK-NEXT:   (local.get $size)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $test (param $ref (ref $vector))
              (param $index i32)
              (param $offset i32)
              (param $size i32)
    (array.init_elem $vector 0
      (local.get $ref)
      (local.get $index)
      (local.get $offset)
      (local.get $size)
    )
  )
)