1// 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) { 41 if (state < 4) { 42 exec_state.prepareStep(Debug.StepAction.StepIn); 43 state++; 44 } else { 45 assertTrue(event_data.sourceLineText().indexOf("Expected to step") > 0, 46 "source line: \"" + event_data.sourceLineText() + "\""); 47 state = 5; 48 } 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); 146 assertEquals(5, state, n); 147 assertEquals(functionsCalled, count, n); 148} 149 150assertEquals(11, functionsCalled); 151 152// Get rid of the debug event listener. 153Debug.setListener(null); 154