// Copyright 2014 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: --turbo-filter=g

// Test that Debug::PrepareForBreakPoints can deal with turbofan code (g)
// on the stack.  Without deoptimization support, we will not be able to
// replace optimized code for g by unoptimized code with debug break slots.
// This would cause stepping to fail (V8 issue 3660).

function f(x) {
  g(x);
  var a = 0;              // Break 6
  return a;               // Break 7
}                         // Break 8

function g(x) {
  if (x) h();
  var a = 0;              // Break 2
  var b = 1;              // Break 3
  return a + b;           // Break 4
}                         // Break 5

function h() {
  debugger;               // Break 0
}                         // Break 1

Debug = debug.Debug;
var exception = null;
var break_count = 0;

function listener(event, exec_state, event_data, data) {
  if (event != Debug.DebugEvent.Break) return;
  try {
    exec_state.prepareStep(Debug.StepAction.StepNext);
    print(exec_state.frame(0).sourceLineText());
    var match = exec_state.frame(0).sourceLineText().match(/Break (\d)/);
    assertNotNull(match);
    assertEquals(break_count++, parseInt(match[1]));
  } catch (e) {
    print(e + e.stack);
    exception = e;
  }
}

f(0);
f(0);
%OptimizeFunctionOnNextCall(g);

Debug.setListener(listener);

f(1);

Debug.setListener(null);  // Break 9
assertNull(exception);
assertEquals(10, break_count);
