Home | History | Annotate | Download | only in mjsunit
      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