wasm-stepping-out-from-js.js 2.27 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
// 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.

utils.load('test/inspector/wasm-inspector-test.js');

let {session, contextGroup, Protocol} =
    InspectorTest.start('Tests stepping out from javascript to a wasm caller');
session.setupScriptMap();

let builder = new WasmModuleBuilder();

let pause = builder.addImport('imp', 'pause', kSig_v_v);
let func = builder.addFunction('wasm_main', kSig_v_v)
               .addBody([kExprCallFunction, pause])
               .exportAs('main');

let module_bytes = builder.toArray();

Protocol.Debugger.onPaused(async message => {
  InspectorTest.log('Paused at:');
  var frames = message.params.callFrames;
  await session.logSourceLocation(frames[0].location);
  await Protocol.Debugger.stepOut();
});

contextGroup.addScript(`
let pause = true;
function pauseAlternating() {
  if (pause) debugger;
  pause = !pause;
}
`);

35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
InspectorTest.runAsyncTestSuite([
  async function test() {
    await Protocol.Debugger.enable();
    InspectorTest.log('Instantiating.');
    const instantiate_code =
        `const instance = (${WasmInspectorTest.instantiateFromBuffer})(${
            JSON.stringify(module_bytes)}, {imp: {pause: pauseAlternating}});`;
    WasmInspectorTest.evalWithUrl(instantiate_code, 'instantiate');
    const [, {params: wasmScript}] = await Protocol.Debugger.onceScriptParsed(2);
    const scriptId = wasmScript.scriptId;

    InspectorTest.log('Running exports.main.');
    InspectorTest.log('>>> First round');
    await Protocol.Runtime.evaluate({expression: 'instance.exports.main()'});
    InspectorTest.log('exports.main returned.');

    InspectorTest.log('After stepping out of the last script, we should stop right at the beginning of the next script.');
    InspectorTest.log('>>> Second round');
    await Protocol.Runtime.evaluate({expression: 'instance.exports.main()'});
    InspectorTest.log('exports.main returned.');

    InspectorTest.log('The next cycle should work as before (stopping at the "debugger" statement), after stopping at script entry.');
    InspectorTest.log('>>> Third round');
    await Protocol.Runtime.evaluate({expression: 'instance.exports.main()'});
    InspectorTest.log('exports.main returned.');
  }
]);