Home | History | Annotate | Download | only in mjsunit
      1 // Copyright 2010 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 // Flags: --expose-debug-as debug
     29 // Get the Debug object exposed from the debug context global object.
     30 
     31 // Scenario: a function is being changed, which causes enclosing function to
     32 // have its positions patched; position changing requires new instance of Code
     33 // object to be introduced; the function happens to be on stack at this moment;
     34 // later it will resume over new instance of Code.
     35 // Before the change 2 rinfo are 22 characters away from each other. After the
     36 // change they are 114 characters away from each other. New instance of Code is
     37 // required when those numbers cross the border value of 64 (in any direction).
     38 
     39 Debug = debug.Debug
     40 
     41 eval(
     42     "function BeingReplaced(changer, opt_x, opt_y) {\n" +
     43     "  changer();\n" +
     44     "  var res = new Object();\n" +
     45     "  if (opt_x) { res.y = opt_y; }\n" +
     46     "  res.a = (function() {})();\n" +
     47     "  return res.a;\n" +
     48     "}"
     49 );
     50 
     51 var script = Debug.findScript(BeingReplaced);
     52 
     53 var orig_body = "{}";
     54 var patch_pos = script.source.indexOf(orig_body);
     55 // Line long enough to change rinfo encoding.
     56 var new_body_patch = "{return 'Capybara';" +
     57     "                                                                          " +
     58     "}";
     59 
     60 var change_log = new Array();
     61 function Changer() {
     62   Debug.LiveEdit.TestApi.ApplySingleChunkPatch(script, patch_pos, orig_body.length, new_body_patch, change_log);
     63   print("Change log: " + JSON.stringify(change_log) + "\n");
     64 }
     65 
     66 function NoOp() {
     67 }
     68 
     69 function CallM(changer) {
     70   // We expect call IC here after several function runs.
     71   return BeingReplaced(changer);
     72 }
     73 
     74 // This several iterations should cause call IC for BeingReplaced call. This IC
     75 // will keep reference to code object of BeingRepalced function. This reference
     76 // should also be patched. Unfortunately, this is a manually checked fact (from
     77 // debugger or debug print) and doesn't work as an automatic test.
     78 CallM(NoOp);
     79 CallM(NoOp);
     80 CallM(NoOp);
     81 
     82 var res = CallM(Changer);
     83 assertEquals("Capybara", res);
     84