1// Copyright 2013 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 --allow-natives-syntax 29// Flags: --concurrent-recompilation --block-concurrent-recompilation 30// Flags: --turbo-deoptimization 31 32if (!%IsConcurrentRecompilationSupported()) { 33 print("Concurrent recompilation is disabled. Skipping this test."); 34 quit(); 35} 36 37Debug = debug.Debug; 38 39function listener(event, exec_state, event_data, data) { 40 if (event != Debug.DebugEvent.Break) return; 41 try { 42 assertEquals("foo", exec_state.frame(0).evaluate("a").value()); 43 } catch (e) { 44 exception = e; 45 }; 46 listened++; 47}; 48 49var exception = null; 50var listened = 0; 51 52var f = function() { 53 var a = "foo"; 54 var b = a.substring("1"); 55 [a, b].sort(); 56 return a; 57} 58 59f(); 60f(); 61%OptimizeFunctionOnNextCall(f, "concurrent"); // Mark with builtin. 62f(); // Kick off concurrent recompilation. 63 64// After compile graph has been created... 65Debug.setListener(listener); // Activate debugger. 66Debug.setBreakPoint(f, 2, 0); // Force deopt. 67 68// At this point, concurrent recompilation is still being blocked. 69assertUnoptimized(f, "no sync"); 70// Let concurrent recompilation proceed. 71%UnblockConcurrentRecompilation(); 72// Sync with optimization thread. But no optimized code is installed. 73assertUnoptimized(f, "sync"); 74 75f(); // Trigger break point. 76assertEquals(1, listened); 77assertNull(exception); 78