1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Flags: --expose-debug-as debug --allow-natives-syntax 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Test that live-editing a frame above one that uses new.target succeeds. 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDebug = debug.Debug 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvar wrapper_calls = 0; 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvar construct_calls = 0; 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvar exceptions = 0; 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvar results = []; 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvar replace_again; 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdocheval(` 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch function LogNewTarget(arg) { 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch construct_calls++; 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch results.push(new.target); 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch function Wrapper() { 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch wrapper_calls++; 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ReplaceOnce(); 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new LogNewTarget(true); 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch`); 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction Replace(fun, original, patch) { 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch %ExecuteInDebugContext(function() { 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var change_log = []; 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch try { 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var script = Debug.findScript(fun); 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch var patch_pos = script.source.indexOf(original); 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Debug.LiveEdit.TestApi.ApplySingleChunkPatch( 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch script, patch_pos, original.length, patch, change_log); 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } catch (e) { 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch exceptions++; 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }); 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction ReplaceOnce(x) { 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (replace_again) { 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch replace_again = false; 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Replace(Wrapper, "true", "false"); 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction Revert() { 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Replace(Wrapper, "false", "true"); 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochreplace_again = true; 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochReplaceOnce(); 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochWrapper(); 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRevert(); 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(1, construct_calls); 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(1, wrapper_calls); 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(0, exceptions); // Replace succeeds 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals([LogNewTarget], results); 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochWrapper(); 63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(2, construct_calls); 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(2, wrapper_calls); 65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(0, exceptions); // Replace succeeds 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals([LogNewTarget, LogNewTarget], results); 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochreplace_again = true; 69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochWrapper(); 70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(3, construct_calls); 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(4, wrapper_calls); // Restarts 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals(0, exceptions); // Replace succeeds 73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochassertEquals([LogNewTarget, LogNewTarget, LogNewTarget], results); 74