13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
23ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Redistribution and use in source and binary forms, with or without
33ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// modification, are permitted provided that the following conditions are
43ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// met:
53ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Redistributions of source code must retain the above copyright
73ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       notice, this list of conditions and the following disclaimer.
83ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Redistributions in binary form must reproduce the above
93ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       copyright notice, this list of conditions and the following
103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       disclaimer in the documentation and/or other materials provided
113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       with the distribution.
123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Neither the name of Google Inc. nor the names of its
133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       contributors may be used to endorse or promote products derived
143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       from this software without specific prior written permission.
153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Flags: --expose-debug-as debug --allow-natives-syntax --turbo-deoptimization
293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// This test tests that deoptimization due to debug breaks works for
313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// inlined functions where the full-code is generated before the
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// debugger is attached.
333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//See http://code.google.com/p/chromium/issues/detail?id=105375
353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Get the Debug object exposed from the debug context global object.
373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug = debug.Debug;
383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar count = 0;
403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar break_count = 0;
413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Debug event listener which sets a breakpoint first time it is hit
433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// and otherwise counts break points hit and checks that the expected
443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// state is reached.
453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction listener(event, exec_state, event_data, data) {
463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (event == Debug.DebugEvent.Break) {
473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    break_count++;
483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (break_count == 1) {
493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      Debug.setBreakPoint(g, 3);
503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      for (var i = 0; i < exec_state.frameCount(); i++) {
523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        var frame = exec_state.frame(i);
533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        // When function f is optimized (1 means YES, see runtime.cc) we
543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        // expect an optimized frame for f and g.
553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        if (%GetOptimizationStatus(f) == 1) {
563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          if (i == 1) {
573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            assertTrue(frame.isOptimizedFrame());
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            assertTrue(frame.isInlinedFrame());
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            assertEquals(4 - i, frame.inlinedFrameIndex());
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          } else if (i == 2) {
613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            assertTrue(frame.isOptimizedFrame());
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            assertFalse(frame.isInlinedFrame());
633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          } else {
643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            assertFalse(frame.isOptimizedFrame());
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            assertFalse(frame.isInlinedFrame());
663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          }
673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        }
683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction f() {
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  g();
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction g() {
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  count++;
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  h();
803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var b = 1;  // Break point is set here.
813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochfunction h() {
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  debugger;
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf();f();f();
883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch%OptimizeFunctionOnNextCall(f);
893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf();
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Add the debug event listener.
923ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.setListener(listener);
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochf();
953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
963ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertEquals(5, count);
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochassertEquals(2, break_count);
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Get rid of the debug event listener.
1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.setListener(null);
101