1af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
2af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
3af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org// found in the LICENSE file.
4af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
5d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org// Flags: --expose-debug-as debug
6af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
7af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.orgvar Debug = debug.Debug;
8af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
9af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.orgfunction assertIteratorResult(value, done, result) {
10af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  assertEquals({value: value, done: done}, result);
11af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org}
12af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
13af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.orgfunction RunTest(formals_and_body, args, value1, value2) {
14af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  // A null listener. It isn't important what the listener does.
15af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  function listener(event, exec_state, event_data, data) {
16af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  }
17af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
18af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  // Create the generator function outside a debugging context. It will probably
19af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  // be lazily compiled.
20af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  var gen = (function*(){}).constructor.apply(null, formals_and_body);
21af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
22af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  // Instantiate the generator object.
23af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  var obj = gen.apply(null, args);
24af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
25af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  // Advance to the first yield.
26af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  assertIteratorResult(value1, false, obj.next());
27af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
28af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  // Add a breakpoint on line 3 (the second yield).
29af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  var bp = Debug.setBreakPoint(gen, 3);
30af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
31af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  // Enable the debugger, which should force recompilation of the generator
32af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  // function and relocation of the suspended generator activation.
33af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  Debug.setListener(listener);
34af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
35af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  // Check that the generator resumes and suspends properly.
36af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  assertIteratorResult(value2, false, obj.next());
37af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
38af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  // Disable debugger -- should not force recompilation.
39af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  Debug.clearBreakPoint(bp);
40af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  Debug.setListener(null);
41af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
42af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  // Run to completion.
43af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  assertIteratorResult(undefined, true, obj.next());
44af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org}
45af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
46af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.orgfunction prog(a, b, c) {
47af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  return a + ';\n' + 'yield ' + b + ';\n' + 'yield ' + c;
48af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org}
49af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
50af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org// Simple empty local scope.
51af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.orgRunTest([prog('', '1', '2')], [], 1, 2);
52af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
53af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.orgRunTest([prog('for (;;) break', '1', '2')], [], 1, 2);
54af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
55af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.orgRunTest([prog('while (0) foo()', '1', '2')], [], 1, 2);
56af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
57af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.orgRunTest(['a', prog('var x = 3', 'a', 'x')], [1], 1, 3);
58af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
59af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.orgRunTest(['a', prog('', '1', '2')], [42], 1, 2);
60af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
61af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.orgRunTest(['a', prog('for (;;) break', '1', '2')], [42], 1, 2);
62