1;;! gc = true 2 3(module 4 (type $ty (struct (field (mut f32)) 5 (field (mut i8)) 6 (field (mut anyref)))) 7 8 (global $g (mut (ref null $ty)) (ref.null $ty)) 9 10 ;; Constructors. 11 12 (func $new (param f32 i32 anyref) (result (ref $ty)) 13 (struct.new $ty (local.get 0) (local.get 1) (local.get 2)) 14 ) 15 (func (export "new") (param f32 i32 anyref) 16 (global.set $g (call $new (local.get 0) (local.get 1) (local.get 2))) 17 ) 18 19 (func $new-default (result (ref $ty)) 20 (struct.new_default $ty) 21 ) 22 (func (export "new-default") 23 (global.set $g (call $new-default)) 24 ) 25 26 ;; Getters. 27 28 (func $get-f32 (param (ref null $ty)) (result f32) 29 (struct.get $ty 0 (local.get 0)) 30 ) 31 (func (export "get-f32") (result f32) 32 (call $get-f32 (global.get $g)) 33 ) 34 35 (func $get-s-i8 (param (ref null $ty)) (result i32) 36 (struct.get_s $ty 1 (local.get 0)) 37 ) 38 (func (export "get-s-i8") (result i32) 39 (call $get-s-i8 (global.get $g)) 40 ) 41 42 (func $get-u-i8 (param (ref null $ty)) (result i32) 43 (struct.get_u $ty 1 (local.get 0)) 44 ) 45 (func (export "get-u-i8") (result i32) 46 (call $get-u-i8 (global.get $g)) 47 ) 48 49 (func $get-anyref (param (ref null $ty)) (result anyref) 50 (struct.get $ty 2 (local.get 0)) 51 ) 52 (func (export "get-anyref") (result anyref) 53 (call $get-anyref (global.get $g)) 54 ) 55 56 ;; Setters. 57 58 (func $set-f32 (param (ref null $ty) f32) 59 (struct.set $ty 0 (local.get 0) (local.get 1)) 60 ) 61 (func (export "set-f32") (param f32) 62 (call $set-f32 (global.get $g) (local.get 0)) 63 ) 64 65 (func $set-i8 (param (ref null $ty) i32) 66 (struct.set $ty 1 (local.get 0) (local.get 1)) 67 ) 68 (func (export "set-i8") (param i32) 69 (call $set-i8 (global.get $g) (local.get 0)) 70 ) 71 72 (func $set-anyref (param (ref null $ty) anyref) 73 (struct.set $ty 2 (local.get 0) (local.get 1)) 74 ) 75 (func (export "set-anyref") (param anyref) 76 (call $set-anyref (global.get $g) (local.get 0)) 77 ) 78 79 (func (export "set-anyref-non-null") 80 (call $set-anyref (global.get $g) (struct.new_default $ty)) 81 ) 82) 83 84(assert_return (invoke "new" (f32.const 1) (i32.const -1) (ref.null any))) 85(assert_return (invoke "get-f32") (f32.const 1)) 86(assert_return (invoke "get-s-i8") (i32.const -1)) 87(assert_return (invoke "get-u-i8") (i32.const 255)) 88(assert_return (invoke "get-anyref") (ref.null any)) 89 90(assert_return (invoke "new-default")) 91(assert_return (invoke "get-f32") (f32.const 0)) 92(assert_return (invoke "get-s-i8") (i32.const 0)) 93(assert_return (invoke "get-u-i8") (i32.const 0)) 94(assert_return (invoke "get-anyref") (ref.null any)) 95 96(assert_return (invoke "set-f32" (f32.const 2))) 97(assert_return (invoke "get-f32") (f32.const 2)) 98 99(assert_return (invoke "set-i8" (i32.const -1))) 100(assert_return (invoke "get-s-i8") (i32.const -1)) 101(assert_return (invoke "get-u-i8") (i32.const 255)) 102 103(assert_return (invoke "set-anyref-non-null")) 104(assert_return (invoke "get-anyref") (ref.struct)) 105(assert_return (invoke "set-anyref" (ref.null any))) 106(assert_return (invoke "get-anyref") (ref.null any)) 107 108;; Null dereference 109 110(module 111 (type $t (struct (field (mut i32) (mut i16)))) 112 113 (func (export "struct.get-null") (param (ref null $t)) 114 (drop (struct.get $t 0 (local.get 0))) 115 ) 116 117 (func (export "struct.get_s-null") (param (ref null $t)) 118 (drop (struct.get_s $t 1 (local.get 0))) 119 ) 120 121 (func (export "struct.get_u-null") (param (ref null $t)) 122 (drop (struct.get_u $t 1 (local.get 0))) 123 ) 124 125 (func (export "struct.set-null") (param (ref null $t)) 126 (struct.set $t 0 (local.get 0) (i32.const 0)) 127 ) 128) 129 130(assert_trap (invoke "struct.get-null" (ref.null none)) "null structure reference") 131(assert_trap (invoke "struct.get_s-null" (ref.null none)) "null structure reference") 132(assert_trap (invoke "struct.get_u-null" (ref.null none)) "null structure reference") 133(assert_trap (invoke "struct.set-null" (ref.null none)) "null structure reference") 134