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 above one that uses new.target succeeds. 8 9Debug = debug.Debug 10var wrapper_calls = 0; 11var construct_calls = 0; 12var exceptions = 0; 13var results = []; 14var replace_again; 15 16eval(` 17 function LogNewTarget(arg) { 18 construct_calls++; 19 results.push(new.target); 20 } 21 function Wrapper() { 22 wrapper_calls++; 23 ReplaceOnce(); 24 new LogNewTarget(true); 25 } 26`); 27 28function Replace(fun, original, patch) { 29 %ExecuteInDebugContext(function() { 30 var change_log = []; 31 try { 32 var script = Debug.findScript(fun); 33 var patch_pos = script.source.indexOf(original); 34 Debug.LiveEdit.TestApi.ApplySingleChunkPatch( 35 script, patch_pos, original.length, patch, change_log); 36 } catch (e) { 37 exceptions++; 38 } 39 }); 40} 41 42function ReplaceOnce(x) { 43 if (replace_again) { 44 replace_again = false; 45 Replace(Wrapper, "true", "false"); 46 } 47} 48 49function Revert() { 50 Replace(Wrapper, "false", "true"); 51} 52 53replace_again = true; 54ReplaceOnce(); 55Wrapper(); 56Revert(); 57assertEquals(1, construct_calls); 58assertEquals(1, wrapper_calls); 59assertEquals(0, exceptions); // Replace succeeds 60assertEquals([LogNewTarget], results); 61 62Wrapper(); 63assertEquals(2, construct_calls); 64assertEquals(2, wrapper_calls); 65assertEquals(0, exceptions); // Replace succeeds 66assertEquals([LogNewTarget, LogNewTarget], results); 67 68replace_again = true; 69Wrapper(); 70assertEquals(3, construct_calls); 71assertEquals(4, wrapper_calls); // Restarts 72assertEquals(0, exceptions); // Replace succeeds 73assertEquals([LogNewTarget, LogNewTarget, LogNewTarget], results); 74