1// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Flags: --expose-debug-as debug --harmony
6
7Debug = debug.Debug;
8var break_count = 0
9var exception = null;
10var log = []
11
12var s = 0;
13var a = [1, 2, 3];
14var b = [1, 2, 3, 4];
15var null_value = null;
16var i = 0;
17
18function f() {
19  "use strict";
20  debugger;                      // Break a
21  var j;                         // Break b
22
23  for (var i in null_value) {    // Break c
24    s += a[i];
25  }
26
27  for (j in null_value) {        // Break d
28    s += a[j];
29  }
30
31  for (var i in a) {             // Break e
32    s += a[i];                   // Break E
33  }
34
35  for (j in a) {                 // Break f
36    s += a[j];                   // Break F
37  }
38
39  for (let i in a) {             // Break g
40    s += a[i];                   // Break G
41  }
42
43  for (var i of a) {             // Break h
44    s += i;                      // Break H
45  }
46
47  for (j of a) {                 // Break i
48    s += j;                      // Break I
49  }
50
51  for (let i  of  a) {           // Break j
52    s += i;                      // Break J
53  }
54
55  for (var i = 0; i < 3; i++) {  // Break k
56    s += a[i];                   // Break K
57  }
58
59  for (j = 0; j < 3; j++) {      // Break l
60    s += a[j];                   // Break L
61  }
62
63  for (let i = 0; i < 3; i++) {  // Break m
64    s += a[i];                   // Break M
65  }
66
67  for (let i of a) {}            // Break n
68
69  [1, ...a]                      // Break o
70
71}                                // Break y
72
73function listener(event, exec_state, event_data, data) {
74  if (event != Debug.DebugEvent.Break) return;
75  try {
76    var line = exec_state.frame(0).sourceLineText();
77    var col = exec_state.frame(0).sourceColumn();
78    print(line);
79    var match = line.match(/\/\/ Break (\w)$/);
80    assertEquals(2, match.length);
81    log.push(match[1] + col);
82    exec_state.prepareStep(Debug.StepAction.StepNext);
83    break_count++;
84  } catch (e) {
85    exception = e;
86  }
87}
88
89Debug.setListener(listener);
90f();
91Debug.setListener(null);         // Break z
92
93print("log:\n"+ JSON.stringify(log));
94// The let declaration differs from var in that the loop variable
95// is declared in every iteration.
96// TODO(verwaest): For-of has hacky position numbers for Symbol.iterator and
97// .next. Restore to proper positions once the CallPrinter can disambiguate
98// based on other values.
99var expected = [
100  // Entry
101  "a2",
102  // Empty for-in-var: get enumerable
103  "c16",
104  // Empty for-in: get enumerable
105  "d12",
106  // For-in-var: get enumerable, assign, body, assign, body, ...
107  "e16","e11","E4","e11","E4","e11","E4","e11",
108  // For-in: get enumerable, assign, body, assign, body, ...
109  "f12","f7","F4","f7","F4","f7","F4","f7",
110  // For-in-let: get enumerable, next, body, next,  ...
111  "g16","g11","G4","g11","G4","g11","G4","g11",
112  // For-of-var: [Symbol.iterator](), next(), body, next(), body, ...
113  "h16","h13","H4","h13","H4","h13","H4","h13",
114  // For-of: [Symbol.iterator](), next(), body, next(), body, ...
115  "i12","i9","I4","i9","I4","i9","I4","i9",
116  // For-of-let: [Symbol.iterator](), next(), body, next(), ...
117  "j18","j14","J4","j14","J4","j14","J4","j14",
118  // For-var: init, condition, body, next, condition, body, ...
119  "k15","k20","K4","k26","k20","K4","k26","k20","K4","k26","k20",
120  // For: init, condition, body, next, condition, body, ...
121  "l7","l16","L4","l22","l16","L4","l22","l16","L4","l22","l16",
122  // For-let: init, condition, body, next, condition, body, ...
123  "m15","m20","M4","m26","m20","M4","m26","m20","M4","m26","m20",
124  // For-of, empty: [Symbol.iterator](), next() once
125  "n16", "n13",
126  // Spread: expression statement, spread
127  "o2", "o9",
128  // Exit.
129  "y0","z0",
130]
131print("expected:\n"+ JSON.stringify(expected));
132
133assertArrayEquals(expected, log);
134assertEquals(54, s);
135assertNull(exception);
136