// 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. // Flags: --harmony-reflect --expose-debug-as debug --allow-natives-syntax // Test that live-editing a frame that uses new.target fails. 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 Replace(fun, original, patch) { %ExecuteInDebugContext(function() { var change_log = []; try { var script = Debug.findScript(fun); var patch_pos = script.source.indexOf(original); Debug.LiveEdit.TestApi.ApplySingleChunkPatch( script, patch_pos, original.length, patch, change_log); } catch (e) { assertEquals("BLOCKED_NO_NEW_TARGET_ON_RESTART", change_log[0].functions_on_stack[0].replace_problem); assertInstanceof(e, Debug.LiveEdit.Failure); 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.