async-compile.js 2.7 KB
Newer Older
1 2 3 4
// 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.

5
d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
6

7 8 9
async function assertCompiles(buffer) {
  var module = await WebAssembly.compile(buffer);
  assertInstanceof(module, WebAssembly.Module);
10 11
}

12 13
function assertCompileError(buffer, msg) {
  assertEquals('string', typeof msg);
14 15 16
  return assertThrowsAsync(
      WebAssembly.compile(buffer), WebAssembly.CompileError,
      'WebAssembly.compile(): ' + msg);
17 18
}

19 20 21 22 23 24 25 26
assertPromiseResult(async function basicCompile() {
  let ok_buffer = (() => {
    var builder = new WasmModuleBuilder();
    builder.addFunction('f', kSig_i_v)
        .addBody([kExprI32Const, 42])
        .exportAs('f');
    return builder.toBuffer();
  })();
27

28 29 30 31
  // The OK buffer validates and can be made into a module.
  assertTrue(WebAssembly.validate(ok_buffer));
  let ok_module = new WebAssembly.Module(ok_buffer);
  assertTrue(ok_module instanceof WebAssembly.Module);
32

33 34 35 36 37
  // The bad buffer does not validate and cannot be made into a module.
  let bad_buffer = new ArrayBuffer(0);
  assertFalse(WebAssembly.validate(bad_buffer));
  assertThrows(
      () => new WebAssembly.Module(bad_buffer), WebAssembly.CompileError);
38

39
  let kNumCompiles = 3;
40 41 42 43 44 45 46 47

  // Three compilations of the OK module should succeed.
  for (var i = 0; i < kNumCompiles; i++) {
    await assertCompiles(ok_buffer);
  }

  // Three compilations of the bad module should fail.
  for (var i = 0; i < kNumCompiles; i++) {
48
    await assertCompileError(bad_buffer, 'BufferSource argument is empty');
49
  }
50
}());
51

52
assertPromiseResult(async function badFunctionInTheMiddle() {
53 54
  // We had an error where an exception was generated by a background task and
  // later thrown in a foreground task. The handle to the exception died
55
  // between, since the HandleScope was left.
56 57 58 59 60 61 62 63 64 65 66
  // This test reproduced that error.
  let builder = new WasmModuleBuilder();
  let sig = builder.addType(kSig_i_v);
  for (var i = 0; i < 10; ++i) {
    builder.addFunction('a' + i, sig).addBody([kExprI32Const, 42]);
  }
  builder.addFunction('bad', sig).addBody([]);
  for (var i = 0; i < 10; ++i) {
    builder.addFunction('b' + i, sig).addBody([kExprI32Const, 42]);
  }
  let buffer = builder.toBuffer();
67 68
  await assertCompileError(
      buffer,
69
      'Compiling function #10:\"bad\" failed: ' +
70
          'expected 1 elements on the stack for fallthru, found 0 @+94');
71
}());
72 73 74 75 76 77 78

assertPromiseResult(async function importWithoutCode() {
  // Regression test for https://crbug.com/898310.
  let builder = new WasmModuleBuilder();
  builder.addImport('m', 'q', kSig_i_i);
  await builder.asyncInstantiate({'m': {'q': i => i}});
}());