casts.tentative.any.js (15571B)
1 // META: global=window,dedicatedworker,jsshell 2 // META: script=/wasm/jsapi/wasm-module-builder.js 3 4 let exports = {}; 5 setup(() => { 6 const builder = new WasmModuleBuilder(); 7 const structIndex = builder.addStruct([makeField(kWasmI32, true)]); 8 const arrayIndex = builder.addArray(kWasmI32, true); 9 const structIndex2 = builder.addStruct([makeField(kWasmF32, true)]); 10 const arrayIndex2 = builder.addArray(kWasmF32, true); 11 const funcIndex = builder.addType({ params: [], results: [] }); 12 const funcIndex2 = builder.addType({ params: [], results: [kWasmI32] }); 13 14 const argFunctions = [ 15 { name: "any", code: kWasmAnyRef }, 16 { name: "eq", code: kWasmEqRef }, 17 { name: "struct", code: kWasmStructRef }, 18 { name: "array", code: kWasmArrayRef }, 19 { name: "i31", code: kWasmI31Ref }, 20 { name: "func", code: kWasmFuncRef }, 21 { name: "extern", code: kWasmExternRef }, 22 { name: "none", code: kWasmNullRef }, 23 { name: "nofunc", code: kWasmNullFuncRef }, 24 { name: "noextern", code: kWasmNullExternRef }, 25 { name: "concreteStruct", code: structIndex }, 26 { name: "concreteArray", code: arrayIndex }, 27 { name: "concreteFunc", code: funcIndex }, 28 ]; 29 30 for (const desc of argFunctions) { 31 builder 32 .addFunction(desc.name + "Arg", makeSig_v_x(wasmRefType(desc.code))) 33 .addBody([]) 34 .exportFunc(); 35 36 builder 37 .addFunction(desc.name + "NullableArg", makeSig_v_x(wasmRefNullType(desc.code))) 38 .addBody([]) 39 .exportFunc(); 40 } 41 42 builder 43 .addFunction("makeStruct", makeSig_r_v(wasmRefType(structIndex))) 44 .addBody([...wasmI32Const(42), 45 ...GCInstr(kExprStructNew), structIndex]) 46 .exportFunc(); 47 48 builder 49 .addFunction("makeArray", makeSig_r_v(wasmRefType(arrayIndex))) 50 .addBody([...wasmI32Const(5), ...wasmI32Const(42), 51 ...GCInstr(kExprArrayNew), arrayIndex]) 52 .exportFunc(); 53 54 builder 55 .addFunction("makeStruct2", makeSig_r_v(wasmRefType(structIndex2))) 56 .addBody([...wasmF32Const(42), 57 ...GCInstr(kExprStructNew), structIndex2]) 58 .exportFunc(); 59 60 builder 61 .addFunction("makeArray2", makeSig_r_v(wasmRefType(arrayIndex2))) 62 .addBody([...wasmF32Const(42), ...wasmI32Const(5), 63 ...GCInstr(kExprArrayNew), arrayIndex2]) 64 .exportFunc(); 65 66 builder 67 .addFunction("testFunc", funcIndex) 68 .addBody([]) 69 .exportFunc(); 70 71 builder 72 .addFunction("testFunc2", funcIndex2) 73 .addBody([...wasmI32Const(42)]) 74 .exportFunc(); 75 76 const buffer = builder.toBuffer(); 77 const module = new WebAssembly.Module(buffer); 78 const instance = new WebAssembly.Instance(module, {}); 79 exports = instance.exports; 80 }); 81 82 test(() => { 83 exports.anyArg(exports.makeStruct()); 84 exports.anyArg(exports.makeArray()); 85 exports.anyArg(42); 86 exports.anyArg(42n); 87 exports.anyArg("foo"); 88 exports.anyArg({}); 89 exports.anyArg(() => {}); 90 exports.anyArg(exports.testFunc); 91 assert_throws_js(TypeError, () => exports.anyArg(null)); 92 93 exports.anyNullableArg(null); 94 exports.anyNullableArg(exports.makeStruct()); 95 exports.anyNullableArg(exports.makeArray()); 96 exports.anyNullableArg(42); 97 exports.anyNullableArg(42n); 98 exports.anyNullableArg("foo"); 99 exports.anyNullableArg({}); 100 exports.anyNullableArg(() => {}); 101 exports.anyNullableArg(exports.testFunc); 102 }, "anyref casts"); 103 104 test(() => { 105 exports.eqArg(exports.makeStruct()); 106 exports.eqArg(exports.makeArray()); 107 exports.eqArg(42); 108 assert_throws_js(TypeError, () => exports.eqArg(42n)); 109 assert_throws_js(TypeError, () => exports.eqArg("foo")); 110 assert_throws_js(TypeError, () => exports.eqArg({})); 111 assert_throws_js(TypeError, () => exports.eqArg(exports.testFunc)); 112 assert_throws_js(TypeError, () => exports.eqArg(() => {})); 113 assert_throws_js(TypeError, () => exports.eqArg(null)); 114 115 exports.eqNullableArg(null); 116 exports.eqNullableArg(exports.makeStruct()); 117 exports.eqNullableArg(exports.makeArray()); 118 exports.eqNullableArg(42); 119 assert_throws_js(TypeError, () => exports.eqNullableArg(42n)); 120 assert_throws_js(TypeError, () => exports.eqNullableArg("foo")); 121 assert_throws_js(TypeError, () => exports.eqNullableArg({})); 122 assert_throws_js(TypeError, () => exports.eqNullableArg(exports.testFunc)); 123 assert_throws_js(TypeError, () => exports.eqNullableArg(() => {})); 124 }, "eqref casts"); 125 126 test(() => { 127 exports.structArg(exports.makeStruct()); 128 assert_throws_js(TypeError, () => exports.structArg(exports.makeArray())); 129 assert_throws_js(TypeError, () => exports.structArg(42)); 130 assert_throws_js(TypeError, () => exports.structArg(42n)); 131 assert_throws_js(TypeError, () => exports.structArg("foo")); 132 assert_throws_js(TypeError, () => exports.structArg({})); 133 assert_throws_js(TypeError, () => exports.structArg(exports.testFunc)); 134 assert_throws_js(TypeError, () => exports.structArg(() => {})); 135 assert_throws_js(TypeError, () => exports.structArg(null)); 136 137 exports.structNullableArg(null); 138 exports.structNullableArg(exports.makeStruct()); 139 assert_throws_js(TypeError, () => exports.structNullableArg(exports.makeArray())); 140 assert_throws_js(TypeError, () => exports.structNullableArg(42)); 141 assert_throws_js(TypeError, () => exports.structNullableArg(42n)); 142 assert_throws_js(TypeError, () => exports.structNullableArg("foo")); 143 assert_throws_js(TypeError, () => exports.structNullableArg({})); 144 assert_throws_js(TypeError, () => exports.structNullableArg(exports.testFunc)); 145 assert_throws_js(TypeError, () => exports.structNullableArg(() => {})); 146 }, "structref casts"); 147 148 test(() => { 149 exports.arrayArg(exports.makeArray()); 150 assert_throws_js(TypeError, () => exports.arrayArg(exports.makeStruct())); 151 assert_throws_js(TypeError, () => exports.arrayArg(42)); 152 assert_throws_js(TypeError, () => exports.arrayArg(42n)); 153 assert_throws_js(TypeError, () => exports.arrayArg("foo")); 154 assert_throws_js(TypeError, () => exports.arrayArg({})); 155 assert_throws_js(TypeError, () => exports.arrayArg(exports.testFunc)); 156 assert_throws_js(TypeError, () => exports.arrayArg(() => {})); 157 assert_throws_js(TypeError, () => exports.arrayArg(null)); 158 159 exports.arrayNullableArg(null); 160 exports.arrayNullableArg(exports.makeArray()); 161 assert_throws_js(TypeError, () => exports.arrayNullableArg(exports.makeStruct())); 162 assert_throws_js(TypeError, () => exports.arrayNullableArg(42)); 163 assert_throws_js(TypeError, () => exports.arrayNullableArg(42n)); 164 assert_throws_js(TypeError, () => exports.arrayNullableArg("foo")); 165 assert_throws_js(TypeError, () => exports.arrayNullableArg({})); 166 assert_throws_js(TypeError, () => exports.arrayNullableArg(exports.testFunc)); 167 assert_throws_js(TypeError, () => exports.arrayNullableArg(() => {})); 168 }, "arrayref casts"); 169 170 test(() => { 171 exports.i31Arg(42); 172 assert_throws_js(TypeError, () => exports.i31Arg(exports.makeStruct())); 173 assert_throws_js(TypeError, () => exports.i31Arg(exports.makeArray())); 174 assert_throws_js(TypeError, () => exports.i31Arg(42n)); 175 assert_throws_js(TypeError, () => exports.i31Arg("foo")); 176 assert_throws_js(TypeError, () => exports.i31Arg({})); 177 assert_throws_js(TypeError, () => exports.i31Arg(exports.testFunc)); 178 assert_throws_js(TypeError, () => exports.i31Arg(() => {})); 179 assert_throws_js(TypeError, () => exports.i31Arg(null)); 180 181 exports.i31NullableArg(null); 182 exports.i31NullableArg(42); 183 assert_throws_js(TypeError, () => exports.i31NullableArg(exports.makeStruct())); 184 assert_throws_js(TypeError, () => exports.i31NullableArg(exports.makeArray())); 185 assert_throws_js(TypeError, () => exports.i31NullableArg(42n)); 186 assert_throws_js(TypeError, () => exports.i31NullableArg("foo")); 187 assert_throws_js(TypeError, () => exports.i31NullableArg({})); 188 assert_throws_js(TypeError, () => exports.i31NullableArg(exports.testFunc)); 189 assert_throws_js(TypeError, () => exports.i31NullableArg(() => {})); 190 }, "i31ref casts"); 191 192 test(() => { 193 exports.funcArg(exports.testFunc); 194 assert_throws_js(TypeError, () => exports.funcArg(exports.makeStruct())); 195 assert_throws_js(TypeError, () => exports.funcArg(exports.makeArray())); 196 assert_throws_js(TypeError, () => exports.funcArg(42)); 197 assert_throws_js(TypeError, () => exports.funcArg(42n)); 198 assert_throws_js(TypeError, () => exports.funcArg("foo")); 199 assert_throws_js(TypeError, () => exports.funcArg({})); 200 assert_throws_js(TypeError, () => exports.funcArg(() => {})); 201 assert_throws_js(TypeError, () => exports.funcArg(null)); 202 203 exports.funcNullableArg(null); 204 exports.funcNullableArg(exports.testFunc); 205 assert_throws_js(TypeError, () => exports.funcNullableArg(exports.makeStruct())); 206 assert_throws_js(TypeError, () => exports.funcNullableArg(exports.makeArray())); 207 assert_throws_js(TypeError, () => exports.funcNullableArg(42)); 208 assert_throws_js(TypeError, () => exports.funcNullableArg(42n)); 209 assert_throws_js(TypeError, () => exports.funcNullableArg("foo")); 210 assert_throws_js(TypeError, () => exports.funcNullableArg({})); 211 assert_throws_js(TypeError, () => exports.funcNullableArg(() => {})); 212 }, "funcref casts"); 213 214 test(() => { 215 exports.externArg(exports.makeArray()); 216 exports.externArg(exports.makeStruct()); 217 exports.externArg(42); 218 exports.externArg(42n); 219 exports.externArg("foo"); 220 exports.externArg({}); 221 exports.externArg(exports.testFunc); 222 exports.externArg(() => {}); 223 assert_throws_js(TypeError, () => exports.externArg(null)); 224 225 exports.externNullableArg(null); 226 exports.externNullableArg(exports.makeArray()); 227 exports.externNullableArg(exports.makeStruct()); 228 exports.externNullableArg(42); 229 exports.externNullableArg(42n); 230 exports.externNullableArg("foo"); 231 exports.externNullableArg({}); 232 exports.externNullableArg(exports.testFunc); 233 exports.externNullableArg(() => {}); 234 }, "externref casts"); 235 236 test(() => { 237 for (const nullfunc of [exports.noneArg, exports.nofuncArg, exports.noexternArg]) { 238 assert_throws_js(TypeError, () => nullfunc(exports.makeStruct())); 239 assert_throws_js(TypeError, () => nullfunc(exports.makeArray())); 240 assert_throws_js(TypeError, () => nullfunc(42)); 241 assert_throws_js(TypeError, () => nullfunc(42n)); 242 assert_throws_js(TypeError, () => nullfunc("foo")); 243 assert_throws_js(TypeError, () => nullfunc({})); 244 assert_throws_js(TypeError, () => nullfunc(exports.testFunc)); 245 assert_throws_js(TypeError, () => nullfunc(() => {})); 246 assert_throws_js(TypeError, () => nullfunc(null)); 247 } 248 249 for (const nullfunc of [exports.noneNullableArg, exports.nofuncNullableArg, exports.noexternNullableArg]) { 250 nullfunc(null); 251 assert_throws_js(TypeError, () => nullfunc(exports.makeStruct())); 252 assert_throws_js(TypeError, () => nullfunc(exports.makeArray())); 253 assert_throws_js(TypeError, () => nullfunc(42)); 254 assert_throws_js(TypeError, () => nullfunc(42n)); 255 assert_throws_js(TypeError, () => nullfunc("foo")); 256 assert_throws_js(TypeError, () => nullfunc({})); 257 assert_throws_js(TypeError, () => nullfunc(exports.testFunc)); 258 assert_throws_js(TypeError, () => nullfunc(() => {})); 259 } 260 }, "null casts"); 261 262 test(() => { 263 exports.concreteStructArg(exports.makeStruct()); 264 assert_throws_js(TypeError, () => exports.concreteStructArg(exports.makeStruct2())); 265 assert_throws_js(TypeError, () => exports.concreteStructArg(exports.makeArray())); 266 assert_throws_js(TypeError, () => exports.concreteStructArg(42)); 267 assert_throws_js(TypeError, () => exports.concreteStructArg(42n)); 268 assert_throws_js(TypeError, () => exports.concreteStructArg("foo")); 269 assert_throws_js(TypeError, () => exports.concreteStructArg({})); 270 assert_throws_js(TypeError, () => exports.concreteStructArg(exports.testFunc)); 271 assert_throws_js(TypeError, () => exports.concreteStructArg(() => {})); 272 assert_throws_js(TypeError, () => exports.concreteStructArg(null)); 273 274 exports.concreteStructNullableArg(null); 275 exports.concreteStructNullableArg(exports.makeStruct()); 276 assert_throws_js(TypeError, () => exports.concreteStructNullableArg(exports.makeStruct2())); 277 assert_throws_js(TypeError, () => exports.concreteStructNullableArg(exports.makeArray())); 278 assert_throws_js(TypeError, () => exports.concreteStructNullableArg(42)); 279 assert_throws_js(TypeError, () => exports.concreteStructNullableArg(42n)); 280 assert_throws_js(TypeError, () => exports.concreteStructNullableArg("foo")); 281 assert_throws_js(TypeError, () => exports.concreteStructNullableArg({})); 282 assert_throws_js(TypeError, () => exports.concreteStructNullableArg(exports.testFunc)); 283 assert_throws_js(TypeError, () => exports.concreteStructNullableArg(() => {})); 284 }, "concrete struct casts"); 285 286 test(() => { 287 exports.concreteArrayArg(exports.makeArray()); 288 assert_throws_js(TypeError, () => exports.concreteArrayArg(exports.makeArray2())); 289 assert_throws_js(TypeError, () => exports.concreteArrayArg(exports.makeStruct())); 290 assert_throws_js(TypeError, () => exports.concreteArrayArg(42)); 291 assert_throws_js(TypeError, () => exports.concreteArrayArg(42n)); 292 assert_throws_js(TypeError, () => exports.concreteArrayArg("foo")); 293 assert_throws_js(TypeError, () => exports.concreteArrayArg({})); 294 assert_throws_js(TypeError, () => exports.concreteArrayArg(exports.testFunc)); 295 assert_throws_js(TypeError, () => exports.concreteArrayArg(() => {})); 296 assert_throws_js(TypeError, () => exports.concreteArrayArg(null)); 297 298 exports.concreteArrayNullableArg(null); 299 exports.concreteArrayNullableArg(exports.makeArray()); 300 assert_throws_js(TypeError, () => exports.concreteArrayNullableArg(exports.makeArray2())); 301 assert_throws_js(TypeError, () => exports.concreteArrayNullableArg(exports.makeStruct())); 302 assert_throws_js(TypeError, () => exports.concreteArrayNullableArg(42)); 303 assert_throws_js(TypeError, () => exports.concreteArrayNullableArg(42n)); 304 assert_throws_js(TypeError, () => exports.concreteArrayNullableArg("foo")); 305 assert_throws_js(TypeError, () => exports.concreteArrayNullableArg({})); 306 assert_throws_js(TypeError, () => exports.concreteArrayNullableArg(exports.testFunc)); 307 assert_throws_js(TypeError, () => exports.concreteArrayNullableArg(() => {})); 308 }, "concrete array casts"); 309 310 test(() => { 311 exports.concreteFuncArg(exports.testFunc); 312 assert_throws_js(TypeError, () => exports.concreteFuncArg(exports.testFunc2)); 313 assert_throws_js(TypeError, () => exports.concreteFuncArg(exports.makeArray())); 314 assert_throws_js(TypeError, () => exports.concreteFuncArg(exports.makeStruct())); 315 assert_throws_js(TypeError, () => exports.concreteFuncArg(42)); 316 assert_throws_js(TypeError, () => exports.concreteFuncArg(42n)); 317 assert_throws_js(TypeError, () => exports.concreteFuncArg("foo")); 318 assert_throws_js(TypeError, () => exports.concreteFuncArg({})); 319 assert_throws_js(TypeError, () => exports.concreteFuncArg(() => {})); 320 assert_throws_js(TypeError, () => exports.concreteFuncArg(null)); 321 322 exports.concreteFuncNullableArg(null); 323 exports.concreteFuncNullableArg(exports.testFunc); 324 assert_throws_js(TypeError, () => exports.concreteFuncNullableArg(exports.testFunc2)); 325 assert_throws_js(TypeError, () => exports.concreteFuncNullableArg(exports.makeArray())); 326 assert_throws_js(TypeError, () => exports.concreteFuncNullableArg(exports.makeStruct())); 327 assert_throws_js(TypeError, () => exports.concreteFuncNullableArg(42)); 328 assert_throws_js(TypeError, () => exports.concreteFuncNullableArg(42n)); 329 assert_throws_js(TypeError, () => exports.concreteFuncNullableArg("foo")); 330 assert_throws_js(TypeError, () => exports.concreteFuncNullableArg({})); 331 assert_throws_js(TypeError, () => exports.concreteFuncNullableArg(() => {})); 332 }, "concrete func casts");