| // Copyright 2020 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. |
| |
| load("test/mjsunit/wasm/wasm-module-builder.js"); |
| |
| const num_functions = 200; |
| |
| // Create a simple Wasm module. |
| function create_builder(delta = 0) { |
| const builder = new WasmModuleBuilder(); |
| for (let i = 0; i < num_functions; ++i) { |
| builder.addFunction('f' + i, kSig_i_v) |
| .addBody(wasmI32Const(i + delta)) |
| .exportFunc(); |
| } |
| return builder; |
| } |
| |
| function checkTieredDown(instance) { |
| for (let i = 0; i < num_functions; ++i) { |
| assertTrue(%IsLiftoffFunction(instance.exports['f' + i])); |
| } |
| } |
| |
| function waitForTieredUp(instance) { |
| // Busy waiting until all functions are tiered up. |
| let num_liftoff_functions = 0; |
| while (true) { |
| num_liftoff_functions = 0; |
| for (let i = 0; i < num_functions; ++i) { |
| if (%IsLiftoffFunction(instance.exports['f' + i])) { |
| num_liftoff_functions++; |
| } |
| } |
| if (num_liftoff_functions == 0) return; |
| } |
| } |
| |
| const Debug = new DebugWrapper(); |
| |
| (function testTierDownToLiftoff() { |
| // In the 'isolates' test, this test runs in parallel to itself on two |
| // isolates. All checks below should still hold. |
| const instance = create_builder(0).instantiate(); |
| Debug.enable(); |
| checkTieredDown(instance); |
| const instance2 = create_builder(1).instantiate(); |
| checkTieredDown(instance2); |
| Debug.disable(); |
| // Eventually the instances will be completely tiered up again. |
| waitForTieredUp(instance); |
| waitForTieredUp(instance2); |
| })(); |
| |
| // Test async compilation. |
| assertPromiseResult((async function testTierDownToLiftoffAsync() { |
| // First test: enable the debugger *after* compiling the module. |
| const instance = await create_builder(2).asyncInstantiate(); |
| Debug.enable(); |
| checkTieredDown(instance); |
| const instance2 = await create_builder(3).asyncInstantiate(); |
| checkTieredDown(instance2); |
| Debug.disable(); |
| waitForTieredUp(instance); |
| waitForTieredUp(instance2); |
| |
| // Second test: enable the debugger *while* compiling the module. |
| const instancePromise = create_builder(4).asyncInstantiate(); |
| Debug.enable(); |
| const instance3 = await instancePromise; |
| checkTieredDown(instance3); |
| Debug.disable(); |
| waitForTieredUp(instance3); |
| })()); |