blob: dff83c7e148ae7dd92ad414802cab197b3f38922 [file] [log] [blame]
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001// Copyright 2014 the V8 project authors. All rights reserved.
2// 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
28// Flags: --expose-debug-as debug --nocrankshaft
29// Get the Debug object exposed from the debug context global object.
30Debug = debug.Debug
31
32var exception = null;
33var state = 1;
34
35// Simple debug event handler which first time will cause 'step in' action
36// to get into g.call and than check that execution is stopped inside
37// function 'g'.
38function listener(event, exec_state, event_data, data) {
39 try {
40 if (event == Debug.DebugEvent.Break) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000041 if (state < 4) {
42 exec_state.prepareStep(Debug.StepAction.StepIn);
43 state++;
44 } else {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040045 assertTrue(event_data.sourceLineText().indexOf("Expected to step") > 0,
46 "source line: \"" + event_data.sourceLineText() + "\"");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000047 state = 5;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040048 }
49 }
50 } catch(e) {
51 print("Exception: " + e);
52 exception = e;
53 }
54};
55
56// Add the debug event listener.
57Debug.setListener(listener);
58
59var count = 0;
60var obj = {
61 fun: function() {
62 ++count;
63 return count; // Expected to step
64 }
65};
66obj.fun2 = obj.fun;
67
68function testCall_Dots() {
69 debugger;
70 obj.fun();
71}
72
73function testCall_Quotes() {
74 debugger;
75 obj["fun"]();
76}
77
78function testCall_Call() {
79 debugger;
80 obj.fun.call(obj);
81}
82
83function testCall_Apply() {
84 debugger;
85 obj.fun.apply(obj);
86}
87
88function testCall_Variable() {
89 var functionName = "fun";
90 debugger;
91 obj[functionName]();
92}
93
94function testCall_Fun2() {
95 debugger;
96 obj.fun2();
97}
98
99function testCall_InternStrings() {
100 var cache = { "fun": "fun" };
101 var functionName = "fu" + "n";
102 debugger;
103 obj[cache[functionName]]();
104}
105
106function testCall_ViaFunRef() {
107 var functionName = "fu" + "n";
108 var funRef = obj[functionName];
109 debugger;
110 funRef();
111}
112
113// bug 2888
114function testCall_RuntimeVariable1() {
115 var functionName = "fu" + "n";
116 debugger;
117 obj[functionName]();
118}
119
120// bug 2888
121function testCall_RuntimeVariable2() {
122 var functionName = "un".replace(/u/, "fu");
123 debugger;
124 obj[functionName]();
125}
126
127// bug 2888
128function testCall_RuntimeVariable3() {
129 var expr = "fu" + "n";
130 const functionName = expr;
131 assertEquals("fun", functionName);
132 debugger;
133 obj[functionName]();
134}
135
136var functionsCalled = 0;
137for (var n in this) {
138 if (n.substr(0, 4) != 'test' || typeof this[n] !== "function") {
139 continue;
140 }
141 state = 1;
142 print("Running " + n + "...");
143 this[n]();
144 ++functionsCalled;
145 assertNull(exception, n);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000146 assertEquals(5, state, n);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400147 assertEquals(functionsCalled, count, n);
148}
149
150assertEquals(11, functionsCalled);
151
152// Get rid of the debug event listener.
153Debug.setListener(null);