| (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) | |
| ) | |
| ) | |
| ) |