(module (type $func (func (result funcref))) (global $global (mut anyref) (ref.null any)) (global $global-ref (mut funcref) (ref.func $use-global-ref)) (func $null (export "null") (result anyref) (ref.null any) ) (func $is_null (export "is_null") (param $ref anyref) (result i32) (ref.is_null (local.get $ref) ) ) (func $ref.func (export "ref.func") (result funcref) ;; Test that we are aware that "$ref.func" below refers to the function and ;; not the local. This code will keep the local around (at least in an ;; unoptimized build), and it should use a different name than the function. (local $ref.func i32) (local.set $ref.func (i32.add (local.get $ref.func) (i32.const 1) ) ) (ref.func $ref.func) ) (func $ref.eq (export "ref.eq") (param $x eqref) (param $y eqref) (result i32) (ref.eq (local.get $x) (local.get $y) ) ) (func $ref.as (export "ref.as") (param $x anyref) (result anyref) (ref.as_non_null (local.get $x) ) ) (func $use-global (export "use-global") (param $x anyref) (result anyref) (local $temp anyref) (local.set $temp (global.get $global) ) (global.set $global (local.get $x) ) (local.get $temp) ) (func $use-global-ref (export "use-global-ref") (param $x funcref) (result funcref) (local $temp funcref) (local.set $temp (global.get $global-ref) ) (global.set $global-ref (local.get $x) ) (local.get $temp) ) (func $funcref_temps (export "funcref_temps") (param $0 funcref) (param $1 f64) ;; A deeply-nested expression that ends up requiring multiple function type ;; temp variables. (call $funcref_temps (ref.func $funcref_temps) (f64.convert_i32_s (ref.is_null (select (result funcref) (local.get $0) (loop $loop (result funcref) (ref.func $funcref_temps) ) (i32.const 0) ) ) ) ) ) (func $named_type_temps (export "named_type_temps") (result funcref) ;; This nested expression ends up needing to use temp vars, and one such ;; name contains the type $func. We should emit that in form that is ;; mangled for JS, without '(' which appears in the stringified name of the ;; type, "(ref null $func)". (select (result (ref null $func)) (ref.null nofunc) (if (result (ref $func)) (i32.const 1) (then (ref.func $named_type_temps) ) (else (unreachable) ) ) (i32.const 0) ) ) )