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