// 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: --no-always-opt

Debug = debug.Debug;

var step = 0;
var exception = null;

function listener(event, exec_state, event_data, data) {
  if (event != Debug.DebugEvent.Break) return;
  try {
    if (step == 0) {
      assertEquals("error", exec_state.frame(0).evaluate("e").value());
      exec_state.frame(0).evaluate("write_0('foo')");
      exec_state.frame(0).evaluate("write_1('modified')");
    } else {
      assertEquals("argument", exec_state.frame(0).evaluate("e").value());
      exec_state.frame(0).evaluate("write_2('bar')");
    }
    step++;
  } catch (e) {
    print(e + e.stack);
    exception = e;
  }
}

Debug.setListener(listener);

function f(e, x) {
  try {
    throw "error";
  } catch(e) {
    // In ES2015 hoisting semantics, 'x' binds to the argument
    // and 'e' binds to the exception.
    function write_0(v) { e = v }
    function write_1(v) { x = v }
    // Make sure write_0 and write_1 are 'used' so that they are visible to the
    // debugger.
    write_0, write_1;
    debugger;
    assertEquals("foo", e);  // overwritten by the debugger
  }
  assertEquals("argument", e);  // debugger did not overwrite
  function write_2(v) { e = v }
  // Make sure write_2 is 'used' so that it is visible to the debugger.
  write_2;
  debugger;
  assertEquals("bar", e);
  assertEquals("modified", x);
}

f("argument")
assertNull(exception);
assertEquals(2, step);
