6d8a2611c0
We used to flood the handler when preparing for stepping, even if we may not throw. Instead, we now flood the handler only when we actually throw. This also solves an issue with step-next when we throw and leave the function unexpectedly. In combination with microtasks, this could cause a crash. R=mstarzinger@chromium.org BUG=chromium:568477 LOG=N Review URL: https://codereview.chromium.org/1527593002 Cr-Commit-Position: refs/heads/master@{#32856}
57 lines
1.3 KiB
JavaScript
57 lines
1.3 KiB
JavaScript
// Copyright 2015 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-debug-as debug --allow-natives-syntax
|
|
|
|
var Debug = debug.Debug;
|
|
var expected = ["debugger;", "var x = y;", "debugger;", "var x = y;"];
|
|
var log = [];
|
|
|
|
function listener(event, exec_state, event_data, data) {
|
|
if (event != Debug.DebugEvent.Break) return;
|
|
try {
|
|
log.push(exec_state.frame(0).sourceLineText().trimLeft());
|
|
exec_state.prepareStep(Debug.StepAction.StepNext, 1);
|
|
} catch (e) {
|
|
%AbortJS(e + "\n" + e.stack);
|
|
}
|
|
}
|
|
|
|
Debug.setListener(listener);
|
|
|
|
function f() {
|
|
var a = 1;
|
|
debugger;
|
|
var x = y;
|
|
print(x);
|
|
}
|
|
|
|
function call_f_with_deeper_stack() {
|
|
(() => () => () => f())()()();
|
|
}
|
|
|
|
var p = Promise.resolve();
|
|
p.then(f);
|
|
p.then(call_f_with_deeper_stack);
|
|
|
|
// Schedule microtask to check against expectation at the end.
|
|
function testDone(iteration) {
|
|
function checkResult() {
|
|
try {
|
|
assertTrue(iteration < 10);
|
|
if (expected.length == log.length) {
|
|
assertEquals(expected, log);
|
|
} else {
|
|
testDone(iteration + 1);
|
|
}
|
|
} catch (e) {
|
|
%AbortJS(e + "\n" + e.stack);
|
|
}
|
|
}
|
|
|
|
%EnqueueMicrotask(checkResult);
|
|
}
|
|
|
|
testDone(0);
|