| Index: test/mjsunit/wasm/test-wasm-compilation-control.js
|
| diff --git a/test/mjsunit/wasm/test-wasm-compilation-control.js b/test/mjsunit/wasm/test-wasm-compilation-control.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..176c40392604404775be1c346673961b67895595
|
| --- /dev/null
|
| +++ b/test/mjsunit/wasm/test-wasm-compilation-control.js
|
| @@ -0,0 +1,118 @@
|
| +// Copyright 2017 the V8 project authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// Flags: --allow-natives-syntax --validate-asm
|
| +
|
| +load("test/mjsunit/wasm/wasm-constants.js");
|
| +load("test/mjsunit/wasm/wasm-module-builder.js");
|
| +
|
| +let buffer = (() => {
|
| + var builder = new WasmModuleBuilder();
|
| + builder.addFunction("f", kSig_i_v)
|
| + .addBody([kExprI32Const, 42])
|
| + .exportAs("f");
|
| + return builder.toBuffer();
|
| +})();
|
| +
|
| +// allow up to the buffer size
|
| +%SetWasmCompileControls(buffer.byteLength, true);
|
| +%SetWasmInstantiateControls();
|
| +var m = new WebAssembly.Module(buffer);
|
| +var i = new WebAssembly.Instance(m);
|
| +assertEquals(i.exports.f(), 42);
|
| +
|
| +// the buffer can't compile synchronously, but we allow async compile
|
| +%SetWasmCompileControls(buffer.byteLength - 1, true);
|
| +// test first that we can't sync-instantiate this module anymore
|
| +try {
|
| + i = new WebAssembly.Instance(m);
|
| +} catch (e) {
|
| + assertTrue(e instanceof RangeError);
|
| +}
|
| +
|
| +//...but we can async-instantiate it
|
| +WebAssembly.instantiate(m)
|
| + .then(instance => i = instance,
|
| + assertUnreachable);
|
| +%RunMicrotasks();
|
| +assertTrue(i instanceof WebAssembly.Instance);
|
| +
|
| +try {
|
| + m = new WebAssembly.Module(buffer);
|
| + assertUnreachable();
|
| +} catch (e) {
|
| + assertTrue(e instanceof RangeError);
|
| +}
|
| +
|
| +WebAssembly.compile(buffer)
|
| + .then(res => m = res,
|
| + m = null);
|
| +
|
| +%RunMicrotasks();
|
| +assertTrue(m instanceof WebAssembly.Module)
|
| +
|
| +WebAssembly.instantiate(buffer)
|
| + .then(res => m = res.module,
|
| + m = null);
|
| +
|
| +%RunMicrotasks();
|
| +assertTrue(m instanceof WebAssembly.Module);
|
| +
|
| +// Async compile works, but using the sync instantiate doesn't
|
| +i = undefined;
|
| +m = undefined;
|
| +var ex = undefined;
|
| +WebAssembly.compile(buffer)
|
| + .then(mod => {
|
| + m = mod;
|
| + try {
|
| + i = new WebAssembly.Instance(m);
|
| + } catch (e) {
|
| + ex = e;
|
| + }
|
| + },
|
| + e => ex = e);
|
| +%RunMicrotasks();
|
| +assertTrue(ex instanceof RangeError);
|
| +assertEquals(i, undefined);
|
| +assertTrue(m instanceof WebAssembly.Module);
|
| +
|
| +// Now block async compile works.
|
| +%SetWasmCompileControls(buffer.byteLength - 1, false);
|
| +WebAssembly.compile(buffer)
|
| + .then(ex = null,
|
| + e => ex = e);
|
| +
|
| +%RunMicrotasks();
|
| +assertTrue(ex instanceof RangeError);
|
| +
|
| +WebAssembly.instantiate(buffer)
|
| + .then(ex = null,
|
| + e => ex = e);
|
| +%RunMicrotasks();
|
| +assertTrue(ex instanceof RangeError);
|
| +
|
| +
|
| +// Verify that, for asm-wasm, these controls are ignored.
|
| +%SetWasmCompileControls(0, false);
|
| +function assertValidAsm(func) {
|
| + assertTrue(%IsAsmWasmCode(func));
|
| +}
|
| +
|
| +function assertWasm(expected, func) {
|
| + assertEquals(
|
| + expected, func(undefined, undefined, new ArrayBuffer(1024)).caller());
|
| + assertValidAsm(func);
|
| +}
|
| +
|
| +function TestAsmWasmIsUnaffected() {
|
| + "use asm";
|
| + function caller() {
|
| + return 43;
|
| + }
|
| +
|
| + return {caller: caller};
|
| +}
|
| +
|
| +assertWasm(43, TestAsmWasmIsUnaffected);
|
|
|