// Copyright 2015 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. // Test that live-editing a frame that uses new.target fails. // Flags: --allow-natives-syntax Debug = debug.Debug var calls = 0; var exceptions = 0; var results = []; var replace_again; eval(` function LogNewTarget() { calls++; ReplaceOnce(); results.push(true); results.push(new.target); } `); function Dummy() {} function ExecuteInDebugContext(f) { var result; var exception = null; Debug.setListener(function(event) { if (event == Debug.DebugEvent.Break) { try { result = f(); } catch (e) { // Rethrow this exception later. exception = e; } } }); debugger; Debug.setListener(null); if (exception !== null) throw exception; return result; } function Replace(fun, original, patch) { ExecuteInDebugContext(function() { try { %LiveEditPatchScript(fun, Debug.scriptSource(fun).replace(original, patch)); } catch (e) { assertEquals(e, 'LiveEdit failed: BLOCKED_BY_NEW_TARGET_IN_RESTART_FRAME'); exceptions++; } }); } function ReplaceOnce() { if (replace_again) { replace_again = false; Replace(LogNewTarget, "true", "false"); } } function Revert() { Replace(LogNewTarget, "false", "true"); } replace_again = true; ReplaceOnce(); new LogNewTarget(); Revert(); assertEquals(1, calls); assertEquals(0, exceptions); assertEquals([false, LogNewTarget], results); replace_again = true; LogNewTarget(); replace_again = true; new LogNewTarget(); replace_again = true; Reflect.construct(LogNewTarget, [], Dummy); assertEquals( [false, LogNewTarget, true, undefined, true, LogNewTarget, true, Dummy], results); assertEquals(4, calls); // No restarts assertEquals(3, exceptions); // Replace failed.