| // META: global=window,dedicatedworker,jsshell |
| // META: script=/wasm/jsapi/wasm-module-builder.js |
| // META: script=/wasm/jsapi/assertions.js |
| // META: script=/wasm/jsapi/instanceTestFactory.js |
| |
| let emptyModuleBinary; |
| setup(() => { |
| emptyModuleBinary = new WasmModuleBuilder().toBuffer(); |
| }); |
| |
| promise_test(t => { |
| return promise_rejects_js(t, TypeError, WebAssembly.instantiate()); |
| }, "Missing arguments"); |
| |
| promise_test(() => { |
| const fn = WebAssembly.instantiate; |
| const thisValues = [ |
| undefined, |
| null, |
| true, |
| "", |
| Symbol(), |
| 1, |
| {}, |
| WebAssembly, |
| ]; |
| return Promise.all(thisValues.map(thisValue => { |
| return fn.call(thisValue, emptyModuleBinary).then(assert_WebAssemblyInstantiatedSource); |
| })); |
| }, "Branding"); |
| |
| promise_test(t => { |
| const invalidArguments = [ |
| undefined, |
| null, |
| true, |
| "", |
| Symbol(), |
| 1, |
| {}, |
| WebAssembly.Module, |
| WebAssembly.Module.prototype, |
| ArrayBuffer, |
| ArrayBuffer.prototype, |
| Array.from(emptyModuleBinary), |
| ]; |
| return Promise.all(invalidArguments.map(argument => { |
| return promise_rejects_js(t, TypeError, WebAssembly.instantiate(argument), |
| `instantiate(${format_value(argument)})`); |
| })); |
| }, "Invalid arguments"); |
| |
| test(() => { |
| const promise = WebAssembly.instantiate(emptyModuleBinary); |
| assert_equals(Object.getPrototypeOf(promise), Promise.prototype, "prototype"); |
| assert_true(Object.isExtensible(promise), "extensibility"); |
| }, "Promise type"); |
| |
| for (const [name, fn] of instanceTestFactory) { |
| promise_test(() => { |
| const { buffer, args, exports, verify } = fn(); |
| return WebAssembly.instantiate(buffer, ...args).then(result => { |
| assert_WebAssemblyInstantiatedSource(result, exports); |
| verify(result.instance); |
| }); |
| }, `${name}: BufferSource argument`); |
| |
| promise_test(() => { |
| const { buffer, args, exports, verify } = fn(); |
| const module = new WebAssembly.Module(buffer); |
| return WebAssembly.instantiate(module, ...args).then(instance => { |
| assert_Instance(instance, exports); |
| verify(instance); |
| }); |
| }, `${name}: Module argument`); |
| } |
| |
| promise_test(() => { |
| const builder = new WasmModuleBuilder(); |
| builder.addImportedGlobal("module", "global", kWasmI32); |
| const buffer = builder.toBuffer(); |
| const order = []; |
| |
| const imports = { |
| get module() { |
| order.push("module getter"); |
| return { |
| get global() { |
| order.push("global getter"); |
| return 0; |
| }, |
| } |
| }, |
| }; |
| |
| const expected = [ |
| "module getter", |
| "global getter", |
| ]; |
| const p = WebAssembly.instantiate(buffer, imports); |
| assert_array_equals(order, []); |
| return p.then(result => { |
| assert_WebAssemblyInstantiatedSource(result); |
| assert_array_equals(order, expected); |
| }); |
| }, "Synchronous options handling: Buffer argument"); |
| |
| promise_test(() => { |
| const builder = new WasmModuleBuilder(); |
| builder.addImportedGlobal("module", "global", kWasmI32); |
| const buffer = builder.toBuffer(); |
| const module = new WebAssembly.Module(buffer); |
| const order = []; |
| |
| const imports = { |
| get module() { |
| order.push("module getter"); |
| return { |
| get global() { |
| order.push("global getter"); |
| return 0; |
| }, |
| } |
| }, |
| }; |
| |
| const expected = [ |
| "module getter", |
| "global getter", |
| ]; |
| const p = WebAssembly.instantiate(module, imports); |
| assert_array_equals(order, expected); |
| return p.then(instance => assert_Instance(instance, {})); |
| }, "Synchronous options handling: Module argument"); |
| |
| promise_test(t => { |
| const buffer = new Uint8Array(); |
| return promise_rejects_js(t, WebAssembly.CompileError, WebAssembly.instantiate(buffer)); |
| }, "Empty buffer"); |
| |
| promise_test(t => { |
| const buffer = new Uint8Array(Array.from(emptyModuleBinary).concat([0, 0])); |
| return promise_rejects_js(t, WebAssembly.CompileError, WebAssembly.instantiate(buffer)); |
| }, "Invalid code"); |
| |
| promise_test(() => { |
| const buffer = new WasmModuleBuilder().toBuffer(); |
| assert_equals(buffer[0], 0); |
| const promise = WebAssembly.instantiate(buffer); |
| buffer[0] = 1; |
| return promise.then(assert_WebAssemblyInstantiatedSource); |
| }, "Changing the buffer"); |