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