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