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 31Debug = debug.Debug 32 33eval("var something1 = 25; \n" 34 + "var something2 = 2010; \n" 35 + "// Array(); \n" 36 + "function ChooseAnimal() {\n" 37 + " return 'Cat';\n" 38 + "} \n" 39 + "function ChooseFurniture() {\n" 40 + " return 'Table';\n" 41 + "} \n" 42 + "function ChooseNumber() { return 17; } \n" 43 + "ChooseAnimal.Factory = function Factory() {\n" 44 + " return function FactoryImpl(name) {\n" 45 + " return 'Help ' + name;\n" 46 + " }\n" 47 + "}\n"); 48 49assertEquals("Cat", ChooseAnimal()); 50assertEquals(25, something1); 51 52var script = Debug.findScript(ChooseAnimal); 53 54var new_source = script.source.replace("Cat", "Cap' + 'yb' + 'ara"); 55var new_source = new_source.replace("25", "26"); 56var new_source = new_source.replace("Help", "Hello"); 57var new_source = new_source.replace("17", "18"); 58// The call to array causes a change in the number of type feedback slots for 59// the script. 60// 61// TODO(mvstanton): For now, the inclusion of the Array() call at the top level 62// of the script causes us to visit a corner case, but I'd like to validate 63// correctness more explicitly. 64var new_source = new_source.replace("// Array", "Array"); 65print("new source: " + new_source); 66 67var change_log = new Array(); 68var result = Debug.LiveEdit.SetScriptSource(script, new_source, false, change_log); 69print("Result: " + JSON.stringify(result) + "\n"); 70print("Change log: " + JSON.stringify(change_log) + "\n"); 71 72assertEquals("Capybara", ChooseAnimal()); 73// Global variable do not get changed (without restarting script). 74assertEquals(25, something1); 75// We should support changes in oneliners. 76assertEquals(18, ChooseNumber()); 77assertEquals("Hello Peter", ChooseAnimal.Factory()("Peter")); 78