1a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
2a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
3a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org// found in the LICENSE file.
4a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
5d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org// Flags: --expose-debug-as debug
6a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
7a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgDebug = debug.Debug
8a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
9a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgvar debug_step = 0;
10a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgvar failure = null;
11a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
12a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgfunction listener(event, exec_state, event_data, data) {
13a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  if (event != Debug.DebugEvent.Break) return;
14a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  try {
15a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    if (debug_step == 0) {
16a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      assertEquals(1, exec_state.frame(0).evaluate('a').value());
17a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      assertEquals(3, exec_state.frame(0).evaluate('b').value());
18a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      exec_state.frame(0).evaluate("a = 4").value();
19a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      debug_step++;
20a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    } else {
21a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      assertEquals(4, exec_state.frame(0).evaluate('a').value());
22a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      assertEquals(3, exec_state.frame(0).evaluate('b').value());
23a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      exec_state.frame(0).evaluate("b = 5").value();
24a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    }
25a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  } catch (e) {
26a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    failure = e;
27a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  }
28a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org}
29a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
30a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgDebug.setListener(listener);
31a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
32a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgfunction* generator(a, b) {
33a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  var b = 3;  // Shadows a parameter.
34a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  debugger;
35a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  yield a;
36a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  yield b;
37a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  debugger;
38a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  return b;
39a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org}
40a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
41a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgvar foo = generator(1, 2);
42a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
43a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgassertEquals(4, foo.next().value);
44a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgassertEquals(3, foo.next().value);
45a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgassertEquals(5, foo.next().value);
46a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgassertNull(failure);
47a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org
48a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgDebug.setListener(null);
49