28cc5dc672
Tsan figured out that I called compilation_units_.empty() outside a lock. Original message: This CL adds a new function {InitializeCompilationUnit} to initialize a single compilation unit and not just all compilation units at once. This is necessary for streaming compilation eventually. This also required some refactoring on how the working queue for compilation units works. Previously the synchronization was done with an atomic counter, now it is done with a lock. Note that the code to finish compilation of a module still only works if the working queue gets only empty when all work is done. I plan to change this in a different CL. Since the code would not be tested without streaming compilation, I added an experimental flag and a test to test the new code. R=clemensh@chromium.org, mtrofin@chromium.org Change-Id: Ia83560d1c70f0802271a88c514e0d1cb0458f6c4 Reviewed-on: https://chromium-review.googlesource.com/561458 Reviewed-by: Clemens Hammacher <clemensh@chromium.org> Commit-Queue: Andreas Haas <ahaas@chromium.org> Cr-Commit-Position: refs/heads/master@{#46454}
73 lines
2.4 KiB
JavaScript
73 lines
2.4 KiB
JavaScript
// 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: --wasm-async-compilation --expose-wasm --allow-natives-syntax
|
|
|
|
load("test/mjsunit/wasm/wasm-constants.js");
|
|
load("test/mjsunit/wasm/wasm-module-builder.js");
|
|
|
|
function assertCompiles(buffer) {
|
|
return assertPromiseResult(
|
|
WebAssembly.compile(buffer),
|
|
module => assertTrue(module instanceof WebAssembly.Module),
|
|
ex => assertUnreachable);
|
|
}
|
|
|
|
function assertCompileError(buffer) {
|
|
return assertPromiseResult(
|
|
WebAssembly.compile(buffer), module => assertUnreachable,
|
|
ex => assertTrue(ex instanceof WebAssembly.CompileError));
|
|
}
|
|
|
|
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();
|
|
})();
|
|
|
|
// 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);
|
|
|
|
// 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);
|
|
|
|
let kNumCompiles = 3;
|
|
|
|
// 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++) {
|
|
await assertCompileError(bad_buffer);
|
|
}
|
|
}());
|
|
|
|
assertPromiseResult(async function badFunctionInTheMiddle() {
|
|
// 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
|
|
// inbetween, since the HandleScope was left.
|
|
// 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();
|
|
await assertCompileError(buffer);
|
|
}());
|