blob: ca543b068a52cf4d79cc6c5fa196500b6b1024e1 [file] [log] [blame]
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Murdochda12d292016-06-02 14:46:10 +01005// Flags: --expose-debug-as debug
Emily Bernierd0a1eb72015-03-24 16:35:39 -04006
7Debug = debug.Debug;
8
9var step = 0;
10var exception = null;
11
12function listener(event, exec_state, event_data, data) {
13 if (event != Debug.DebugEvent.Break) return;
14 try {
15 if (step == 0) {
16 assertEquals("error", exec_state.frame(0).evaluate("e").value());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000017 exec_state.frame(0).evaluate("write_0('foo')");
18 exec_state.frame(0).evaluate("write_1('modified')");
Emily Bernierd0a1eb72015-03-24 16:35:39 -040019 } else {
20 assertEquals("argument", exec_state.frame(0).evaluate("e").value());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000021 exec_state.frame(0).evaluate("write_2('bar')");
Emily Bernierd0a1eb72015-03-24 16:35:39 -040022 }
23 step++;
24 } catch (e) {
25 print(e + e.stack);
26 exception = e;
27 }
28}
29
30Debug.setListener(listener);
31
32function f(e, x) {
33 try {
34 throw "error";
35 } catch(e) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000036 // In ES2015 hoisting semantics, 'x' binds to the argument
37 // and 'e' binds to the exception.
38 function write_0(v) { e = v }
39 function write_1(v) { x = v }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040040 debugger;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000041 assertEquals("foo", e); // overwritten by the debugger
Emily Bernierd0a1eb72015-03-24 16:35:39 -040042 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000043 assertEquals("argument", e); // debugger did not overwrite
44 function write_2(v) { e = v }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040045 debugger;
46 assertEquals("bar", e);
47 assertEquals("modified", x);
48}
49
50f("argument")
51assertNull(exception);
52assertEquals(2, step);