blob: c3cd5eb2eb8311d14db0c652b514da049e1fdefb [file] [log] [blame]
Ben Murdoch85b71792012-04-11 18:30:58 +01001// Copyright 2008 the V8 project authors. All rights reserved.
Ben Murdoch3fb3ca82011-12-02 17:19:32 +00002// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
Ben Murdoch85b71792012-04-11 18:30:58 +010028// Flags: --expose-debug-as debug --allow-natives-syntax
Ben Murdoch3fb3ca82011-12-02 17:19:32 +000029// Get the Debug object exposed from the debug context global object.
30Debug = debug.Debug
31
32var listenerComplete = false;
33var exception = false;
34
35var testingConstructCall = false;
36
37
38function listener(event, exec_state, event_data, data) {
39 try {
40 if (event == Debug.DebugEvent.Break)
41 {
42 assertEquals(6, exec_state.frameCount());
43
44 for (var i = 0; i < exec_state.frameCount(); i++) {
45 var frame = exec_state.frame(i);
46 if (i < exec_state.frameCount() - 1) {
Ben Murdoch85b71792012-04-11 18:30:58 +010047 var expected_a = i * 2 + 1;
48 var expected_b = i * 2 + 2;
49 var expected_x = (i + 1) * 2 + 1;
50 var expected_y = (i + 1) * 2 + 2;
Ben Murdoch3fb3ca82011-12-02 17:19:32 +000051
Ben Murdoch85b71792012-04-11 18:30:58 +010052 // All frames except the bottom one has normal variables a and b.
53 var a = ('a' === frame.localName(0)) ? 0 : 1;
54 var b = 1 - a;
55 assertEquals('a', frame.localName(a));
56 assertEquals('b', frame.localName(b));
57 assertEquals(expected_a, frame.localValue(a).value());
58 assertEquals(expected_b, frame.localValue(b).value());
Ben Murdoch3fb3ca82011-12-02 17:19:32 +000059
Ben Murdoch85b71792012-04-11 18:30:58 +010060 // All frames except the bottom one has arguments variables x and y.
61 assertEquals('x', frame.argumentName(0));
62 assertEquals('y', frame.argumentName(1));
63 assertEquals(expected_x, frame.argumentValue(0).value());
64 assertEquals(expected_y, frame.argumentValue(1).value());
Ben Murdoch3fb3ca82011-12-02 17:19:32 +000065
66 // All frames except the bottom one have two scopes.
67 assertEquals(2, frame.scopeCount());
68 assertEquals(debug.ScopeType.Local, frame.scope(0).scopeType());
69 assertEquals(debug.ScopeType.Global, frame.scope(1).scopeType());
Ben Murdoch85b71792012-04-11 18:30:58 +010070 assertEquals(expected_a, frame.scope(0).scopeObject().value()['a']);
71 assertEquals(expected_b, frame.scope(0).scopeObject().value()['b']);
72 assertEquals(expected_x, frame.scope(0).scopeObject().value()['x']);
73 assertEquals(expected_y, frame.scope(0).scopeObject().value()['y']);
Ben Murdoch3fb3ca82011-12-02 17:19:32 +000074
75 // Evaluate in the inlined frame.
Ben Murdoch85b71792012-04-11 18:30:58 +010076 assertEquals(expected_a, frame.evaluate('a').value());
77 assertEquals(expected_x, frame.evaluate('x').value());
78 assertEquals(expected_x, frame.evaluate('arguments[0]').value());
79 assertEquals(expected_a + expected_b + expected_x + expected_y,
80 frame.evaluate('a + b + x + y').value());
81 assertEquals(expected_x + expected_y,
82 frame.evaluate('arguments[0] + arguments[1]').value());
Ben Murdoch3fb3ca82011-12-02 17:19:32 +000083 } else {
84 // The bottom frame only have the global scope.
85 assertEquals(1, frame.scopeCount());
86 assertEquals(debug.ScopeType.Global, frame.scope(0).scopeType());
87 }
88
89 // Check the frame function.
90 switch (i) {
91 case 0: assertEquals(h, frame.func().value()); break;
92 case 1: assertEquals(g3, frame.func().value()); break;
93 case 2: assertEquals(g2, frame.func().value()); break;
94 case 3: assertEquals(g1, frame.func().value()); break;
95 case 4: assertEquals(f, frame.func().value()); break;
96 case 5: break;
97 default: assertUnreachable();
98 }
99
100 // Check for construct call.
Ben Murdoch85b71792012-04-11 18:30:58 +0100101 assertEquals(testingConstructCall && i == 4, frame.isConstructCall());
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000102
103 // When function f is optimized (1 means YES, see runtime.cc) we
104 // expect an optimized frame for f with g1, g2 and g3 inlined.
105 if (%GetOptimizationStatus(f) == 1) {
106 if (i == 1 || i == 2 || i == 3) {
107 assertTrue(frame.isOptimizedFrame());
108 assertTrue(frame.isInlinedFrame());
109 assertEquals(4 - i, frame.inlinedFrameIndex());
110 } else if (i == 4) {
111 assertTrue(frame.isOptimizedFrame());
112 assertFalse(frame.isInlinedFrame());
113 } else {
114 assertFalse(frame.isOptimizedFrame());
115 assertFalse(frame.isInlinedFrame());
116 }
117 }
118 }
119
120 // Indicate that all was processed.
121 listenerComplete = true;
122 }
123 } catch (e) {
Ben Murdoch85b71792012-04-11 18:30:58 +0100124 exception = e.stack;
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000125 };
126};
127
Ben Murdoch85b71792012-04-11 18:30:58 +0100128f();f();f();
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000129%OptimizeFunctionOnNextCall(f);
Ben Murdoch85b71792012-04-11 18:30:58 +0100130f();
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000131
132// Add the debug event listener.
133Debug.setListener(listener);
134
Ben Murdoch85b71792012-04-11 18:30:58 +0100135function h(x, y) {
136 var a = 1;
137 var b = 2;
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000138 debugger; // Breakpoint.
Ben Murdoch85b71792012-04-11 18:30:58 +0100139};
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000140
Ben Murdoch85b71792012-04-11 18:30:58 +0100141function g3(x, y) {
142 var a = 3;
143 var b = 4;
144 h(a, b);
145};
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000146
Ben Murdoch85b71792012-04-11 18:30:58 +0100147function g2(x, y) {
148 var a = 5;
149 var b = 6;
150 g3(a, b);
151};
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000152
Ben Murdoch85b71792012-04-11 18:30:58 +0100153function g1(x, y) {
154 var a = 7;
155 var b = 8;
156 g2(a, b);
157};
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000158
Ben Murdoch85b71792012-04-11 18:30:58 +0100159function f(x, y) {
160 var a = 9;
161 var b = 10;
162 g1(a, b);
163};
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000164
165// Test calling f normally and as a constructor.
Ben Murdoch85b71792012-04-11 18:30:58 +0100166f(11, 12);
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000167testingConstructCall = true;
Ben Murdoch85b71792012-04-11 18:30:58 +0100168new f(11, 12);
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000169
Ben Murdoch85b71792012-04-11 18:30:58 +0100170// Make sure that the debug event listener vas invoked.
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000171assertFalse(exception, "exception in listener " + exception)
172assertTrue(listenerComplete);
173
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000174Debug.setListener(null);