1// Copyright 2015 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// Flags: --expose-debug-as debug --allow-natives-syntax 6 7// Test that live-editing a frame that uses new.target fails. 8 9Debug = debug.Debug 10var calls = 0; 11var exceptions = 0; 12var results = []; 13var replace_again; 14 15eval(` 16 function LogNewTarget() { 17 calls++; 18 ReplaceOnce(); 19 results.push(true); 20 results.push(new.target); 21 } 22`); 23 24function Dummy() {} 25 26function Replace(fun, original, patch) { 27 %ExecuteInDebugContext(function() { 28 var change_log = []; 29 try { 30 var script = Debug.findScript(fun); 31 var patch_pos = script.source.indexOf(original); 32 Debug.LiveEdit.TestApi.ApplySingleChunkPatch( 33 script, patch_pos, original.length, patch, change_log); 34 } catch (e) { 35 assertEquals("BLOCKED_NO_NEW_TARGET_ON_RESTART", 36 change_log[0].functions_on_stack[0].replace_problem); 37 assertInstanceof(e, Debug.LiveEdit.Failure); 38 exceptions++; 39 } 40 }); 41} 42 43function ReplaceOnce() { 44 if (replace_again) { 45 replace_again = false; 46 Replace(LogNewTarget, "true", "false"); 47 } 48} 49 50function Revert() { 51 Replace(LogNewTarget, "false", "true"); 52} 53 54replace_again = true; 55ReplaceOnce(); 56new LogNewTarget(); 57Revert(); 58assertEquals(1, calls); 59assertEquals(0, exceptions); 60assertEquals([false, LogNewTarget], results); 61 62replace_again = true; 63LogNewTarget(); 64 65replace_again = true; 66new LogNewTarget(); 67 68replace_again = true; 69Reflect.construct(LogNewTarget, [], Dummy); 70 71assertEquals( 72 [false, LogNewTarget, true, undefined, true, LogNewTarget, true, Dummy], 73 results); 74assertEquals(4, calls); // No restarts 75assertEquals(3, exceptions); // Replace failed. 76