| 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); | 
|  |