// 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-turbofan 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);