v8/test/mjsunit/harmony/debug-step-destructuring-assignment.js
yangguo d9fe836dd4 [debugger] fix break locations for assignments and return.
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}
2016-03-01 12:47:55 +00:00

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);