| (module | |
| (type $struct (sub (struct (field i32)))) | |
| (import "import" "import" (func $import (param anyref))) | |
| ;; Create a GC object in a global. We can keep the struct.new here even after | |
| ;; evalling (we should not create an extra, unneeded global, and read from | |
| ;; that). | |
| (global $global1 (ref $struct) | |
| (struct.new $struct | |
| (i32.const 1337) | |
| ) | |
| ) | |
| ;; After evalling we should see this refer to a struct with contents 42, and | |
| ;; not 41, which is overridden, see "test1". We also should not see any code | |
| ;; that creates an object with 41, as that is no longer live. | |
| ;; | |
| ;; Note that we will not simply do a struct.new in this global, as it is | |
| ;; mutable, and we only use immutable globals as defining globals for values, | |
| ;; so a new (immutable) global will appear, and we will read from it. | |
| (global $global2 (mut (ref null $struct)) (ref.null $struct)) | |
| (func $test1 (export "test1") | |
| ;; The locals will be optimized into a single non-nullable one by the | |
| ;; optimizer. | |
| (local $temp1 (ref null $struct)) | |
| (local $temp2 (ref null $struct)) | |
| (global.set $global2 | |
| (struct.new $struct | |
| (i32.const 41) | |
| ) | |
| ) | |
| (global.set $global2 | |
| (struct.new $struct | |
| (i32.const 42) | |
| ) | |
| ) | |
| ;; Write a value to this local. A struct with value 99 will be created in a | |
| ;; global, and referred to here. | |
| (local.set $temp2 | |
| (struct.new $struct | |
| (i32.const 99) | |
| ) | |
| ) | |
| ;; Stop evalling here at the import. | |
| (call $import (local.get $temp1)) | |
| (call $import (local.get $temp2)) | |
| ) | |
| (func $keepalive (export "keepalive") (result i32) | |
| (i32.add | |
| (struct.get $struct 0 | |
| (global.get $global1) | |
| ) | |
| (struct.get $struct 0 | |
| (global.get $global2) | |
| ) | |
| ) | |
| ) | |
| ) |