125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// Copyright 2010 the V8 project authors. All rights reserved. 225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// Redistribution and use in source and binary forms, with or without 325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// modification, are permitted provided that the following conditions are 425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// met: 525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// 625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// * Redistributions of source code must retain the above copyright 725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// notice, this list of conditions and the following disclaimer. 825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// * Redistributions in binary form must reproduce the above 925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// copyright notice, this list of conditions and the following 1025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// disclaimer in the documentation and/or other materials provided 1125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// with the distribution. 1225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// * Neither the name of Google Inc. nor the names of its 1325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// contributors may be used to endorse or promote products derived 1425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// from this software without specific prior written permission. 1525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// 1625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org 2825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// Flags: --expose-debug-as debug 2925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org// Get the Debug object exposed from the debug context global object. 3025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org 3125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.orgDebug = debug.Debug 3225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org 33013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.orgeval("var something1 = 25; \n" 34013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org + "var something2 = 2010; \n" 35a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org + "// Array(); \n" 36013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org + "function ChooseAnimal() {\n" 37013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org + " return 'Cat';\n" 38013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org + "} \n" 39013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org + "function ChooseFurniture() {\n" 40013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org + " return 'Table';\n" 41013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org + "} \n" 42013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org + "function ChooseNumber() { return 17; } \n" 43013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org + "ChooseAnimal.Factory = function Factory() {\n" 44013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org + " return function FactoryImpl(name) {\n" 45013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org + " return 'Help ' + name;\n" 46013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org + " }\n" 47013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org + "}\n"); 4825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org 4925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.orgassertEquals("Cat", ChooseAnimal()); 50013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.orgassertEquals(25, something1); 5125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org 5225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.orgvar script = Debug.findScript(ChooseAnimal); 5325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org 5425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.orgvar new_source = script.source.replace("Cat", "Cap' + 'yb' + 'ara"); 55013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.orgvar new_source = new_source.replace("25", "26"); 56013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.orgvar new_source = new_source.replace("Help", "Hello"); 57013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.orgvar new_source = new_source.replace("17", "18"); 58a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// The call to array causes a change in the number of type feedback slots for 59a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// the script. 60a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// 61a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// TODO(mvstanton): For now, the inclusion of the Array() call at the top level 62a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// of the script causes us to visit a corner case, but I'd like to validate 63a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org// correctness more explicitly. 64a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgvar new_source = new_source.replace("// Array", "Array"); 6525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.orgprint("new source: " + new_source); 6625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org 6725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.orgvar change_log = new Array(); 6869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgvar result = Debug.LiveEdit.SetScriptSource(script, new_source, false, change_log); 6969ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgprint("Result: " + JSON.stringify(result) + "\n"); 70013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.orgprint("Change log: " + JSON.stringify(change_log) + "\n"); 7125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org 7225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.orgassertEquals("Capybara", ChooseAnimal()); 73013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org// Global variable do not get changed (without restarting script). 74013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.orgassertEquals(25, something1); 75c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org// We should support changes in oneliners. 76c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgassertEquals(18, ChooseNumber()); 77013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.orgassertEquals("Hello Peter", ChooseAnimal.Factory()("Peter")); 78