Chromium Code Reviews| 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..7b0e5d3fb66267da63d6d215bf428117f330b925 |
| --- /dev/null |
| +++ b/test/mjsunit/wasm/test-wasm-compilation-control.js |
| @@ -0,0 +1,101 @@ |
| +// 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(); |
|
bradnelson
2017/02/18 00:28:43
Some reason this ended up indented by 4 (should be
Mircea Trofin
2017/02/18 00:41:47
huh... no idea. Emacs?
|
| + 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 synchrnously, but we allow async compile |
|
bradnelson
2017/02/18 00:28:42
typo
Mircea Trofin
2017/02/18 00:41:47
Acknowledged.
|
| +%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); |
| + |
| +// not even async compile works. |
| +var ex; |
| +%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); |
| + |
| + |
| +// 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 TestReturnInBlock() { |
|
bradnelson
2017/02/18 00:28:42
Leftover?
Mircea Trofin
2017/02/18 00:41:47
No! Intended. See comment above: we're making sure
|
| + "use asm"; |
| + function caller() { |
| + return 43; |
| + } |
| + |
| + return {caller: caller}; |
| +} |
| + |
| +assertWasm(43, TestReturnInBlock); |