// Copyright 2018 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Flags: --block-concurrent-recompilation Debug = debug.Debug // Test that the side-effect check is not bypassed in optimized code. var exception = null; var counter = 0; function f1() { counter++; } function wrapper1() { for (var i = 0; i < 4; i++) { // Get this function optimized before calling to increment. // Check that that call performs the necessary side-effect checks. %OptimizeOsr(); %PrepareFunctionForOptimization(wrapper1); } f1(); } %PrepareFunctionForOptimization(wrapper1); function f2() { counter++; } function wrapper2(call) { if (call) f2(); } function listener(event, exec_state, event_data, data) { if (event != Debug.DebugEvent.Break) return; try { function success(expectation, source) { assertEquals(expectation, exec_state.frame(0).evaluate(source, true).value()); } function fail(source) { assertThrows(() => exec_state.frame(0).evaluate(source, true), EvalError); } wrapper1(); wrapper1(); fail("wrapper1()"); %PrepareFunctionForOptimization(wrapper2); wrapper2(true); wrapper2(false); wrapper2(true); %OptimizeFunctionOnNextCall(wrapper2); wrapper2(false); fail("wrapper2(true)"); fail("%PrepareFunctionForOptimization(wrapper2); "+ "%OptimizeFunctionOnNextCall(wrapper2); wrapper2(true)"); %PrepareFunctionForOptimization(wrapper2); %OptimizeFunctionOnNextCall(wrapper2, "concurrent"); wrapper2(false); fail("%UnblockConcurrentRecompilation();" + "%GetOptimizationStatus(wrapper2, 'sync');" + "wrapper2(true);"); } catch (e) { exception = e; print(e, e.stack); } }; // Add the debug event listener. Debug.setListener(listener); function f() { debugger; }; f(); assertNull(exception);