blob: 40facd3167e9ff99f567cde5a6184db22beab031 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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);