// Copyright 2016 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 --validate-asm Debug = debug.Debug // Initialized in setup(). var exception; var break_count; var num_wasm_scripts; var module; var expected_stack_entries = []; function listener(event, exec_state, event_data, data) { try { if (event == Debug.DebugEvent.Break) { ++break_count; // Request frame details. var num_frames = exec_state.frameCount(); assertEquals( expected_stack_entries.length, num_frames, 'number of frames'); print('Stack Trace (length ' + num_frames + '):'); for (var i = 0; i < num_frames; ++i) { var frame = exec_state.frame(i); var line = frame.sourceLine(); var column = frame.sourceColumn() + 1; var funcName = frame.func().name(); print( ' [' + i + '] ' + funcName + ' (' + line + ':' + column + ')'); assertEquals( expected_stack_entries[i][0], funcName, 'function name at ' + i); assertEquals(expected_stack_entries[i][1], line, 'line at ' + i); assertEquals(expected_stack_entries[i][2], column, 'column at ' + i); } } } catch (e) { print('exception: ' + e); exception = e; } }; function generateWasmFromAsmJs(stdlib, foreign, heap) { 'use asm'; var debugger_fun = foreign.call_debugger; function callDebugger() { debugger_fun(); } function redirectFun() { callDebugger(); } return redirectFun; } function call_debugger() { debugger; } function setup() { exception = null; break_count = 0; } (function FrameInspection() { setup(); var fun = generateWasmFromAsmJs(this, {'call_debugger': call_debugger}, undefined); expected_stack_entries = [ ['call_debugger', 58, 3], // -- ['callDebugger', 49, 5], // -- ['redirectFun', 52, 5], // -- ['FrameInspection', 78, 3], // -- ['', 82, 3] ]; Debug.setListener(listener); fun(); Debug.setListener(null); assertEquals(1, break_count); if (exception) throw exception; })();