Home | History | Annotate | Download | only in es6
      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 
      9 Debug = debug.Debug
     10 var wrapper_calls = 0;
     11 var construct_calls = 0;
     12 var exceptions = 0;
     13 var results = [];
     14 var replace_again;
     15 
     16 eval(`
     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 
     28 function 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 
     42 function ReplaceOnce(x) {
     43   if (replace_again) {
     44     replace_again = false;
     45     Replace(Wrapper, "true", "false");
     46   }
     47 }
     48 
     49 function Revert() {
     50   Replace(Wrapper, "false", "true");
     51 }
     52 
     53 replace_again = true;
     54 ReplaceOnce();
     55 Wrapper();
     56 Revert();
     57 assertEquals(1, construct_calls);
     58 assertEquals(1, wrapper_calls);
     59 assertEquals(0, exceptions);  // Replace succeeds
     60 assertEquals([LogNewTarget], results);
     61 
     62 Wrapper();
     63 assertEquals(2, construct_calls);
     64 assertEquals(2, wrapper_calls);
     65 assertEquals(0, exceptions);  // Replace succeeds
     66 assertEquals([LogNewTarget, LogNewTarget], results);
     67 
     68 replace_again = true;
     69 Wrapper();
     70 assertEquals(3, construct_calls);
     71 assertEquals(4, wrapper_calls);  // Restarts
     72 assertEquals(0, exceptions);  // Replace succeeds
     73 assertEquals([LogNewTarget, LogNewTarget, LogNewTarget], results);
     74