blob: 6a29ed973a171175a4ad238b4980594e91a611d2 [file] [edit]
;;; TOOL: run-interp
;;; ARGS: --enable-function-references
(module
(type $i32_func (func (result i32)))
;; Two simple functions to use as reference values.
(func $f1 (type $i32_func) i32.const 42)
(func $f2 (type $i32_func) i32.const 99)
;; Declare functions in elem so ref.func is valid.
(elem declare funcref (ref.func $f1) (ref.func $f2))
;; Typed select choosing between two funcref values.
;; When cond is nonzero, should return first operand (ref to $f1).
(func (export "select_funcref_true") (result i32)
ref.func $f1
ref.func $f2
i32.const 1
select (result funcref)
ref.is_null
)
;; When cond is zero, should return second operand (ref to $f2).
(func (export "select_funcref_false") (result i32)
ref.func $f1
ref.func $f2
i32.const 0
select (result funcref)
ref.is_null
)
;; Select between a non-null ref and a null ref.
;; cond=1 selects first (non-null), so ref.is_null should return 0.
(func (export "select_nonnull") (result i32)
ref.func $f1
ref.null func
i32.const 1
select (result funcref)
ref.is_null
)
;; cond=0 selects second (null), so ref.is_null should return 1.
(func (export "select_null") (result i32)
ref.func $f1
ref.null func
i32.const 0
select (result funcref)
ref.is_null
)
;; Use select result as a global to verify the ref survives.
(global $g (mut funcref) (ref.null func))
(func (export "select_to_global") (result i32)
ref.func $f1
ref.func $f2
i32.const 1
select (result funcref)
global.set $g
global.get $g
ref.is_null
)
)
(;; STDOUT ;;;
select_funcref_true() => i32:0
select_funcref_false() => i32:0
select_nonnull() => i32:0
select_null() => i32:1
select_to_global() => i32:0
;;; STDOUT ;;)