| (module | |
| (type $struct (sub (struct (field i32)))) | |
| (import "import" "import" (func $import (param anyref))) | |
| ;; This struct is created in an immutable global, but it has the wrong type. | |
| ;; We will create a new defining global for it that has the proper type, and | |
| ;; read from it here. (This is necessary as when the global is used elsewhere | |
| ;; we want to get the right type from the global.get.) | |
| (global $global1 (ref any) | |
| (struct.new $struct | |
| (i32.const 1337) | |
| ) | |
| ) | |
| ;; Test reordering of globals. This global will be written a value that is | |
| ;; actually defined after it. To handle that, we must create it earlier than | |
| ;; this global. | |
| (global $global2 (mut (ref null $struct)) | |
| (ref.null $struct) | |
| ) | |
| ;; This global is perfect to be a defining global (immutable, right type), but | |
| ;; because of an earlier use, we will end up defining it earlier on, and | |
| ;; reading it here. | |
| (global $global3 (ref $struct) | |
| (struct.new $struct | |
| (i32.const 9999) | |
| ) | |
| ) | |
| (func $test (export "test1") | |
| (global.set $global2 | |
| (global.get $global3) | |
| ) | |
| ) | |
| (func $keepalive (export "keepalive") (result i32) | |
| (select | |
| (struct.get $struct 0 | |
| (ref.cast (ref $struct) | |
| (global.get $global1) | |
| ) | |
| ) | |
| (struct.get $struct 0 | |
| (global.get $global2) | |
| ) | |
| (struct.get $struct 0 | |
| (global.get $global3) | |
| ) | |
| ) | |
| ) | |
| ) |