Index: test/mjsunit/es6/debug-liveedit-new-target-3.js |
diff --git a/test/mjsunit/es6/debug-liveedit-new-target-3.js b/test/mjsunit/es6/debug-liveedit-new-target-3.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..40facd3167e9ff99f567cde5a6184db22beab031 |
--- /dev/null |
+++ b/test/mjsunit/es6/debug-liveedit-new-target-3.js |
@@ -0,0 +1,73 @@ |
+// Copyright 2015 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Flags: --expose-debug-as debug --allow-natives-syntax |
+ |
+// Test that live-editing a frame above one that uses new.target succeeds. |
+ |
+Debug = debug.Debug |
+var wrapper_calls = 0; |
+var construct_calls = 0; |
+var exceptions = 0; |
+var results = []; |
+var replace_again; |
+ |
+eval(` |
+ function LogNewTarget(arg) { |
+ construct_calls++; |
+ results.push(new.target); |
+ } |
+ function Wrapper() { |
+ wrapper_calls++; |
+ ReplaceOnce(); |
+ new LogNewTarget(true); |
+ } |
+`); |
+ |
+function Replace(fun, original, patch) { |
+ %ExecuteInDebugContext(function() { |
+ var change_log = []; |
+ try { |
+ var script = Debug.findScript(fun); |
+ var patch_pos = script.source.indexOf(original); |
+ Debug.LiveEdit.TestApi.ApplySingleChunkPatch( |
+ script, patch_pos, original.length, patch, change_log); |
+ } catch (e) { |
+ exceptions++; |
+ } |
+ }); |
+} |
+ |
+function ReplaceOnce(x) { |
+ if (replace_again) { |
+ replace_again = false; |
+ Replace(Wrapper, "true", "false"); |
+ } |
+} |
+ |
+function Revert() { |
+ Replace(Wrapper, "false", "true"); |
+} |
+ |
+replace_again = true; |
+ReplaceOnce(); |
+Wrapper(); |
+Revert(); |
+assertEquals(1, construct_calls); |
+assertEquals(1, wrapper_calls); |
+assertEquals(0, exceptions); // Replace succeeds |
+assertEquals([LogNewTarget], results); |
+ |
+Wrapper(); |
+assertEquals(2, construct_calls); |
+assertEquals(2, wrapper_calls); |
+assertEquals(0, exceptions); // Replace succeeds |
+assertEquals([LogNewTarget, LogNewTarget], results); |
+ |
+replace_again = true; |
+Wrapper(); |
+assertEquals(3, construct_calls); |
+assertEquals(4, wrapper_calls); // Restarts |
+assertEquals(0, exceptions); // Replace succeeds |
+assertEquals([LogNewTarget, LogNewTarget, LogNewTarget], results); |