adad7e6ee6
There exists a hidden assumption in V8 that neither foreground nor background tasks own any memory. For asynchronous WebAssembly compilation this assumption was wrong, which causes crashes when V8 shut down before the compilation finished. With this CL I change the way asynchrous compilation happens. In the existing implementation each compilation stage provided its own task which could be spawned either in foreground or background. With this CL each stage only provides a state, and a generic CompileTask executes on that state. There exists exactly one state at a time. To have exactly one state at a time I combined the stages ExecuteCompilationUnits and FinishCompilationUnits to a single stage. In addition I removed the WaitForBackgroundTasks stage and added a CancelableTaskManager to the AsyncCompileJob instead to do the waiting. BUG=v8:6436 R=clemensh@chromium.org, mtrofin@chromium.org Change-Id: I2eb61f74235c65524ce720c474eaf99ae7472c81 Reviewed-on: https://chromium-review.googlesource.com/532993 Commit-Queue: Andreas Haas <ahaas@chromium.org> Reviewed-by: Clemens Hammacher <clemensh@chromium.org> Cr-Commit-Position: refs/heads/master@{#45908}
31 lines
975 B
JavaScript
31 lines
975 B
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: --expose-wasm --wasm-async-compilation
|
|
|
|
load("test/mjsunit/wasm/wasm-constants.js");
|
|
load("test/mjsunit/wasm/wasm-module-builder.js");
|
|
|
|
(function CompileFunctionsTest() {
|
|
// Create a big module.
|
|
var builder = new WasmModuleBuilder();
|
|
|
|
builder.addMemory(1, 1, true);
|
|
for (i = 0; i < 100; i++) {
|
|
builder.addFunction("sub" + i, kSig_i_i)
|
|
.addBody([ // --
|
|
kExprGetLocal, 0, // --
|
|
kExprI32Const, i % 61, // --
|
|
kExprI32Sub]) // --
|
|
.exportFunc()
|
|
}
|
|
|
|
var buffer = builder.toBuffer();
|
|
// Start the compilation but do not wait for the promise to resolve
|
|
// with assertPromiseResult. This should not cause a crash.
|
|
WebAssembly.compile(buffer).then(
|
|
() => { print("success")},
|
|
() => { print("failed"); });
|
|
})();
|