d9fe836dd4
We used to emit debug break location on block entry. This cannot be ported to the interpreted as we do not emit bytecode for block entry. This made no sense to begin with though, but accidentally added break locations for var declarations. With this change, the debugger no longer breaks at var declarations without initialization. This is in accordance with the fact that the interpreter does not emit bytecode for uninitialized var declarations. Also fix the bytecode to match full-codegen's behavior wrt return positions: - there is a break location before the return statement, with the source position of the return statement. - right before the actual return, there is another break location. The source position points to the end of the function. R=rmcilroy@chromium.org, vogelheim@chromium.org TBR=rossberg@chromium.org BUG=v8:4690 LOG=N Review URL: https://codereview.chromium.org/1744123003 Cr-Commit-Position: refs/heads/master@{#34388}
87 lines
3.0 KiB
JavaScript
87 lines
3.0 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 --harmony-destructuring-assignment
|
|
// Flags: --harmony-destructuring-bind
|
|
|
|
var exception = null;
|
|
var Debug = debug.Debug;
|
|
var break_count = 0;
|
|
|
|
function listener(event, exec_state, event_data, data) {
|
|
if (event != Debug.DebugEvent.Break) return;
|
|
try {
|
|
var source = exec_state.frame(0).sourceLineText();
|
|
print(source);
|
|
assertTrue(source.indexOf(`// B${break_count++}`) > 0);
|
|
if (source.indexOf("assertEquals") > 0) {
|
|
exec_state.prepareStep(Debug.StepAction.StepNext);
|
|
} else {
|
|
exec_state.prepareStep(Debug.StepAction.StepIn);
|
|
}
|
|
} catch (e) {
|
|
exception = e;
|
|
print(e);
|
|
}
|
|
};
|
|
|
|
Debug.setListener(listener);
|
|
|
|
function f() {
|
|
var a, b, c, d;
|
|
debugger; // B0
|
|
[ // B1
|
|
a, // B2
|
|
b, // B3
|
|
c = 3 // B4
|
|
] = [1, 2];
|
|
assertEquals({a:1,b:2,c:3}, {a, b, c}); // B5
|
|
|
|
[ // B6
|
|
a, // B7
|
|
[
|
|
b, // B8
|
|
c // B9
|
|
],
|
|
d // B10
|
|
] = [5, [6, 7], 8];
|
|
assertEquals({a:5,b:6,c:7,d:8}, {a, b, c, d}); // B11
|
|
|
|
[ // B12
|
|
a, // B13
|
|
b, // B14
|
|
...c // B15
|
|
] = [1, 2, 3, 4];
|
|
assertEquals({a:1,b:2,c:[3,4]}, {a, b, c}); // B16
|
|
|
|
({ // B17
|
|
a, // B18
|
|
b, // B19
|
|
c = 7 // B20
|
|
} = {a: 5, b: 6});
|
|
assertEquals({a:5,b:6,c:7}, {a, b, c}); // B21
|
|
|
|
({ // B22
|
|
a, // B23
|
|
b = return1(), // B24
|
|
c = return1() // B25
|
|
} = {a: 5, b: 6});
|
|
assertEquals({a:5,b:6,c:1}, {a, b, c}); // B28
|
|
|
|
({ // B29
|
|
x : a, // B30
|
|
y : b, // B31
|
|
z : c = 3 // B32
|
|
} = {x: 1, y: 2});
|
|
assertEquals({a:1,b:2,c:3}, {a, b, c}); // B33
|
|
} // B34
|
|
|
|
function return1() {
|
|
return 1; // B26
|
|
} // B27
|
|
|
|
f();
|
|
Debug.setListener(null); // B35
|
|
assertNull(exception);
|