tables.js (3997B)
1 // implicit null funcref value 2 { 3 const { t, get } = wasmEvalText(`(module 4 (table (export "t") 3 funcref) 5 (func (export "get") (param i32) (result funcref) 6 (table.get (local.get 0)) 7 ) 8 )`).exports; 9 10 assertEq(t.get(0), null); 11 assertEq(t.get(1), null); 12 assertEq(t.get(2), null); 13 assertEq(get(0), null); 14 assertEq(get(1), null); 15 assertEq(get(2), null); 16 } 17 18 // explicit null funcref value 19 { 20 const { t, get } = wasmEvalText(`(module 21 (table (export "t") 3 funcref (ref.null func)) 22 (func (export "get") (param i32) (result funcref) 23 (table.get (local.get 0)) 24 ) 25 )`).exports; 26 27 assertEq(t.get(0), null); 28 assertEq(t.get(1), null); 29 assertEq(t.get(2), null); 30 assertEq(get(0), null); 31 assertEq(get(1), null); 32 assertEq(get(2), null); 33 } 34 35 // actual funcref value 36 { 37 const { t, get, foo } = wasmEvalText(`(module 38 (func $foo (export "foo")) 39 40 (table (export "t") 3 funcref (ref.func $foo)) 41 (func (export "get") (param i32) (result funcref) 42 (table.get (local.get 0)) 43 ) 44 )`).exports; 45 46 assertEq(t.get(0), foo); 47 assertEq(t.get(1), foo); 48 assertEq(t.get(2), foo); 49 assertEq(get(0), foo); 50 assertEq(get(1), foo); 51 assertEq(get(2), foo); 52 } 53 54 // implicit null anyref value 55 { 56 const { t, get } = wasmEvalText(`(module 57 (table (export "t") 3 anyref) 58 (func (export "get") (param i32) (result anyref) 59 (table.get (local.get 0)) 60 ) 61 )`).exports; 62 63 assertEq(t.get(0), null); 64 assertEq(t.get(1), null); 65 assertEq(t.get(2), null); 66 assertEq(get(0), null); 67 assertEq(get(1), null); 68 assertEq(get(2), null); 69 } 70 71 // explicit null anyref value 72 { 73 const { t, get } = wasmEvalText(`(module 74 (table (export "t") 3 anyref (ref.null any)) 75 (func (export "get") (param i32) (result anyref) 76 (table.get (local.get 0)) 77 ) 78 )`).exports; 79 80 assertEq(t.get(0), null); 81 assertEq(t.get(1), null); 82 assertEq(t.get(2), null); 83 assertEq(get(0), null); 84 assertEq(get(1), null); 85 assertEq(get(2), null); 86 } 87 88 // actual anyref value 89 { 90 const { t, get } = wasmEvalText(`(module 91 (type $s (struct)) 92 93 (table (export "t") 3 anyref (struct.new $s)) 94 (func (export "get") (param i32) (result anyref) 95 (table.get (local.get 0)) 96 ) 97 )`).exports; 98 99 assertEq(!!t.get(0), true); 100 assertEq(!!t.get(1), true); 101 assertEq(!!t.get(2), true); 102 assertEq(!!get(0), true); 103 assertEq(!!get(1), true); 104 assertEq(!!get(2), true); 105 } 106 107 // implicit null externref value 108 { 109 const { t, get } = wasmEvalText(`(module 110 (table (export "t") 3 externref) 111 (func (export "get") (param i32) (result externref) 112 (table.get (local.get 0)) 113 ) 114 )`).exports; 115 116 assertEq(t.get(0), null); 117 assertEq(t.get(1), null); 118 assertEq(t.get(2), null); 119 assertEq(get(0), null); 120 assertEq(get(1), null); 121 assertEq(get(2), null); 122 } 123 124 // explicit null externref value 125 { 126 const { t, get } = wasmEvalText(`(module 127 (table (export "t") 3 externref (ref.null extern)) 128 (func (export "get") (param i32) (result externref) 129 (table.get (local.get 0)) 130 ) 131 )`).exports; 132 133 assertEq(t.get(0), null); 134 assertEq(t.get(1), null); 135 assertEq(t.get(2), null); 136 assertEq(get(0), null); 137 assertEq(get(1), null); 138 assertEq(get(2), null); 139 } 140 141 // actual externref value (from an imported global, which is visible to tables) 142 { 143 const foo = "wowzers"; 144 const { t, get } = wasmEvalText(`(module 145 (global (import "" "foo") externref) 146 147 (table (export "t") 3 externref (global.get 0)) 148 (func (export "get") (param i32) (result externref) 149 (table.get (local.get 0)) 150 ) 151 )`, { "": { "foo": foo } }).exports; 152 153 assertEq(t.get(0), foo); 154 assertEq(t.get(1), foo); 155 assertEq(t.get(2), foo); 156 assertEq(get(0), foo); 157 assertEq(get(1), foo); 158 assertEq(get(2), foo); 159 } 160 161 // non-imported globals come after tables and are therefore not visible 162 assertErrorMessage(() => wasmEvalText(`(module 163 (global anyref (ref.null any)) 164 (table 3 anyref (global.get 0)) 165 )`), WebAssembly.CompileError, /global.get index out of range/);