1 // Copyright 2012 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 29 30 // Get the Debug object exposed from the debug context global object. 31 Debug = debug.Debug 32 33 var exception = null; 34 var state = 1; 35 var expected_source_line_text = null; 36 var expected_function_name = null; 37 38 // Simple debug event handler which first time will cause 'step in' action 39 // to get into g.call and than check that execution is stopped inside 40 // function 'g'. 41 function listener(event, exec_state, event_data, data) { 42 try { 43 if (event == Debug.DebugEvent.Break) { 44 if (state == 3) { 45 assertEquals(expected_source_line_text, 46 event_data.sourceLineText()); 47 assertEquals(expected_function_name, event_data.func().name()); 48 state = 4; 49 } else { 50 exec_state.prepareStep(Debug.StepAction.StepIn); 51 state++; 52 } 53 } 54 } catch(e) { 55 exception = e; 56 } 57 }; 58 59 // Add the debug event listener. 60 Debug.setListener(listener); 61 62 63 var c = { 64 name: 'name ', 65 get getter1() { 66 return this.name; // getter 1 67 }, 68 get getter2() { 69 return { // getter 2 70 'a': c.name 71 }; 72 }, 73 set setter1(n) { 74 this.name = n; // setter 1 75 } 76 }; 77 78 c.__defineGetter__('y', function getterY() { 79 return this.name; // getter y 80 }); 81 82 c.__defineGetter__(3, function getter3() { 83 return this.name; // getter 3 84 }); 85 86 c.__defineSetter__('y', function setterY(n) { 87 this.name = n; // setter y 88 }); 89 90 c.__defineSetter__(3, function setter3(n) { 91 this.name = n; // setter 3 92 }); 93 94 var d = { 95 'c': c, 96 }; 97 98 function testGetter1_1() { 99 expected_function_name = 'getter1'; 100 expected_source_line_text = ' return this.name; // getter 1'; 101 debugger; 102 var x = c.getter1; 103 } 104 105 function testGetter1_2() { 106 expected_function_name = 'getter1'; 107 expected_source_line_text = ' return this.name; // getter 1'; 108 debugger; 109 var x = c['getter1']; 110 } 111 112 function testGetter1_3() { 113 expected_function_name = 'getter1'; 114 expected_source_line_text = ' return this.name; // getter 1'; 115 for (var i = 1; i < 2; i++) { 116 debugger; 117 var x = c['getter' + i]; 118 } 119 } 120 121 function testGetter1_4() { 122 expected_function_name = 'getter1'; 123 expected_source_line_text = ' return this.name; // getter 1'; 124 debugger; 125 var x = d.c.getter1; 126 } 127 128 function testGetter1_5() { 129 expected_function_name = 'getter1'; 130 expected_source_line_text = ' return this.name; // getter 1'; 131 for (var i = 2; i != 1; i--); 132 debugger; 133 var x = d.c['getter' + i]; 134 } 135 136 function testGetter2_1() { 137 expected_function_name = 'getter2'; 138 expected_source_line_text = ' return { // getter 2'; 139 for (var i = 2; i != 1; i--); 140 debugger; 141 var t = d.c.getter2.name; 142 } 143 144 145 function testGetterY_1() { 146 expected_function_name = 'getterY'; 147 expected_source_line_text = ' return this.name; // getter y'; 148 debugger; 149 var t = d.c.y; 150 } 151 152 function testIndexedGetter3_1() { 153 expected_function_name = 'getter3'; 154 expected_source_line_text = ' return this.name; // getter 3'; 155 debugger; 156 var r = d.c[3]; 157 } 158 159 function testSetterY_1() { 160 expected_function_name = 'setterY'; 161 expected_source_line_text = ' this.name = n; // setter y'; 162 debugger; 163 d.c.y = 'www'; 164 } 165 166 function testIndexedSetter3_1() { 167 expected_function_name = 'setter3'; 168 expected_source_line_text = ' this.name = n; // setter 3'; 169 var i = 3 170 debugger; 171 d.c[3] = 'www'; 172 } 173 174 function testSetter1_1() { 175 expected_function_name = 'setter1'; 176 expected_source_line_text = ' this.name = n; // setter 1'; 177 debugger; 178 d.c.setter1 = 'aa'; 179 } 180 181 function testSetter1_2() { 182 expected_function_name = 'setter1'; 183 expected_source_line_text = ' this.name = n; // setter 1'; 184 debugger; 185 d.c['setter1'] = 'bb'; 186 } 187 188 function testSetter1_3() { 189 expected_function_name = 'setter1'; 190 expected_source_line_text = ' this.name = n; // setter 1'; 191 for (var i = 2; i != 1; i--); 192 debugger; 193 d.c['setter' + i] = i; 194 } 195 196 var e = { 197 name: 'e' 198 }; 199 e.__proto__ = c; 200 201 function testProtoGetter1_1() { 202 expected_function_name = 'getter1'; 203 expected_source_line_text = ' return this.name; // getter 1'; 204 debugger; 205 var x = e.getter1; 206 } 207 208 function testProtoSetter1_1() { 209 expected_function_name = 'setter1'; 210 expected_source_line_text = ' this.name = n; // setter 1'; 211 debugger; 212 e.setter1 = 'aa'; 213 } 214 215 function testProtoIndexedGetter3_1() { 216 expected_function_name = 'getter3'; 217 expected_source_line_text = ' return this.name; // getter 3'; 218 debugger; 219 var x = e[3]; 220 } 221 222 function testProtoIndexedSetter3_1() { 223 expected_function_name = 'setter3'; 224 expected_source_line_text = ' this.name = n; // setter 3'; 225 debugger; 226 e[3] = 'new val'; 227 } 228 229 function testProtoSetter1_2() { 230 expected_function_name = 'setter1'; 231 expected_source_line_text = ' this.name = n; // setter 1'; 232 for (var i = 2; i != 1; i--); 233 debugger; 234 e['setter' + i] = 'aa'; 235 } 236 237 for (var n in this) { 238 if (n.substr(0, 4) != 'test') { 239 continue; 240 } 241 state = 1; 242 this[n](); 243 assertNull(exception); 244 assertEquals(4, state); 245 } 246 247 // Get rid of the debug event listener. 248 Debug.setListener(null); 249