1 // 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 5 // Flags: --expose-debug-as debug --turbo-filter=g --allow-natives-syntax 6 7 // Test that Debug::PrepareForBreakPoints can deal with turbofan code (g) 8 // on the stack. Without deoptimization support, we will not be able to 9 // replace optimized code for g by unoptimized code with debug break slots. 10 // This would cause stepping to fail (V8 issue 3660). 11 12 function f(x) { 13 g(x); 14 var a = 0; // Break 6 15 return a; // Break 7 16 } // Break 8 17 18 function g(x) { 19 if (x) h(); 20 var a = 0; // Break 2 21 var b = 1; // Break 3 22 return a + b; // Break 4 23 } // Break 5 24 25 function h() { 26 debugger; // Break 0 27 } // Break 1 28 29 Debug = debug.Debug; 30 var exception = null; 31 var break_count = 0; 32 33 function listener(event, exec_state, event_data, data) { 34 if (event != Debug.DebugEvent.Break) return; 35 try { 36 exec_state.prepareStep(Debug.StepAction.StepNext); 37 print(exec_state.frame(0).sourceLineText()); 38 var match = exec_state.frame(0).sourceLineText().match(/Break (\d)/); 39 assertNotNull(match); 40 assertEquals(break_count++, parseInt(match[1])); 41 } catch (e) { 42 print(e + e.stack); 43 exception = e; 44 } 45 } 46 47 f(0); 48 f(0); 49 %OptimizeFunctionOnNextCall(g); 50 51 Debug.setListener(listener); 52 53 f(1); 54 55 Debug.setListener(null); // Break 9 56 assertNull(exception); 57 assertEquals(10, break_count); 58