1594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
2594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Redistribution and use in source and binary forms, with or without
3594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// modification, are permitted provided that the following conditions are
4594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// met:
5594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org//
6594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org//     * Redistributions of source code must retain the above copyright
7594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org//       notice, this list of conditions and the following disclaimer.
8594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org//     * Redistributions in binary form must reproduce the above
9594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org//       copyright notice, this list of conditions and the following
10594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org//       disclaimer in the documentation and/or other materials provided
11594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org//       with the distribution.
12594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org//     * Neither the name of Google Inc. nor the names of its
13594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org//       contributors may be used to endorse or promote products derived
14594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org//       from this software without specific prior written permission.
15594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org//
16594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
28594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Flags: --expose-debug-as debug
29594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
30594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgDebug = debug.Debug
31594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
32594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orglistenerComplete = false;
33594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgexception = false;
34594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
35594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// var0:   init after break point, changed by debug eval.
36594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// const0: init before break point, changed by debug eval.
37594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// const1: init after break point, materialized but untouched by debug eval.
38594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// const2: init after break point, materialized and changed by debug eval.
39594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// const3: context allocated const, init before break point, changed by eval.
40594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgfunction f() {
41594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  var var1 = 21;
42594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  const const3 = 3;
43594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
44594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  function g() {
45594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    const const0 = 0;
46594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    assertEquals(undefined, const1);
47594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    assertEquals(undefined, const2);
48594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    assertEquals(3, const3);
49594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    assertEquals(21, var1);
50594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
51594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    debugger;  // Break point.
52594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
53594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    assertEquals(30, var0);
54594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    // TODO(yangguo): debug evaluate should not be able to alter
55594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    //                stack-allocated const values
56594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    // assertEquals(0, const0);
57594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    assertEquals(undefined, const1);
58594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    assertEquals(undefined, const2);
59594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    var var0 = 20;
60594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    const const1 = 1;
61594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    const const2 = 2;
62594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    assertEquals(20, var0);
63594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    assertEquals(1, const1);
64594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    assertEquals(2, const2);
65594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  }
66594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
67594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  g();
68594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
69594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  assertEquals(31, var1);
70594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  assertEquals(3, const3);
71594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
72594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
73594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
74594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgfunction listener(event, exec_state, event_data, data) {
75594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  if (event != Debug.DebugEvent.Break) return;
76594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  try {
77594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    var frame = exec_state.frame(0);
78594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    var evaluate = function(something) {
79594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      return frame.evaluate(something).value()
80594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    }
81594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
82594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    var count = frame.localCount();
83594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    assertEquals(4, count);
84594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    var expectation = { "const0" : 0,
85594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                        "const1" : undefined,
86594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                        "const2" : undefined,
87594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                        "const3" : 3,
88594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                        "var0"   : undefined,
89594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                        "var1"   : 21 };
90594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    for (var i = 0; i < frame.localCount(); ++i) {
91594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      var name = frame.localName(i);
92594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      var value = frame.localValue(i).value();
93594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      assertEquals(expectation[name], value);
94594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    }
95594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
96594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    evaluate('const0 = 10');
97594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    evaluate('const2 = 12');
98594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    evaluate('const3 = 13');
99594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    evaluate('var0 = 30');
100594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    evaluate('var1 = 31');
101594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
102594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    // Indicate that all was processed.
103594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    listenerComplete = true;
104594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  } catch (e) {
105594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    exception = e;
106594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    print("Caught something. " + e + " " + e.stack);
107594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  };
108594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org};
109594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
110594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// Run and compile before debugger is active.
111594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgtry { f(); } catch (e) { }
112594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
113594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgDebug.setListener(listener);
114594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
115594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgf();
116594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
117594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgDebug.setListener(null);
118594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
119594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgassertFalse(exception, "exception in listener")
120594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgassertTrue(listenerComplete);
121