• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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