19258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Copyright 2008 the V8 project authors. All rights reserved.
29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Redistribution and use in source and binary forms, with or without
39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions are
49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// met:
59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Redistributions of source code must retain the above copyright
79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       notice, this list of conditions and the following disclaimer.
89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Redistributions in binary form must reproduce the above
99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       copyright notice, this list of conditions and the following
109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       disclaimer in the documentation and/or other materials provided
119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       with the distribution.
129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//     * Neither the name of Google Inc. nor the names of its
139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       contributors may be used to endorse or promote products derived
149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//       from this software without specific prior written permission.
159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Flags: --expose-debug-as debug
299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// The functions used for testing backtraces. They are at the top to make the
309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// testing of source line/column easier.
319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfunction f(x, y) {
329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  a=1;
339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com};
349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
359085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgvar m = function() {
369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  new f(1);
379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com};
389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
399085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgfunction g() {
40b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  m();
419085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org};
429085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Get the Debug object exposed from the debug context global object.
459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comDebug = debug.Debug
469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comlistenerCalled = false;
489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comexception = false;
499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
503291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
513291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgfunction ParsedResponse(json) {
523291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  this.response_ = eval('(' + json + ')');
533291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  this.refs_ = [];
543291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  if (this.response_.refs) {
553291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    for (var i = 0; i < this.response_.refs.length; i++) {
563291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      this.refs_[this.response_.refs[i].handle] = this.response_.refs[i];
573291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    }
589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  }
599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
613291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
623291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgParsedResponse.prototype.response = function() {
633291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return this.response_;
643291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
653291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
663291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
673291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgParsedResponse.prototype.body = function() {
683291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return this.response_.body;
693291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
703291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
713291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
729d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comParsedResponse.prototype.running = function() {
739d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  return this.response_.running;
749d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com}
759d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
769d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
773291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgParsedResponse.prototype.lookup = function(handle) {
783291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return this.refs_[handle];
793291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
803291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
813291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfunction listener(event, exec_state, event_data, data) {
839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  try {
84defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org    if (event == Debug.DebugEvent.Break) {
85defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      // The expected backtrace is
86defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      // 0: f
87defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      // 1: m
88defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      // 2: g
89defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      // 3: [anonymous]
90defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
91defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      var response;
92defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      var backtrace;
93defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      var frame;
94defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      var source;
95defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
969d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      var dcp;
979d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      // New copy of debug command processor paused state.
989d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      dcp = exec_state.debugCommandProcessor(false);
99defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
100defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      // Get the backtrace.
101defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      var json;
102defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      json = '{"seq":0,"type":"request","command":"backtrace"}'
103defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      var resp = dcp.processDebugJSONRequest(json);
104defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      response = new ParsedResponse(resp);
105defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      backtrace = response.body();
106defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(0, backtrace.fromFrame);
107defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(4, backtrace.toFrame);
108defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(4, backtrace.totalFrames);
109defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      var frames = backtrace.frames;
110defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(4, frames.length);
111defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      for (var i = 0; i < frames.length; i++) {
112defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org        assertEquals('frame', frames[i].type);
113defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      }
114defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(0, frames[0].index);
115defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("f", response.lookup(frames[0].func.ref).name);
116defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(1, frames[1].index);
117defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("", response.lookup(frames[1].func.ref).name);
118defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("m", response.lookup(frames[1].func.ref).inferredName);
119defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(2, frames[2].index);
120defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("g", response.lookup(frames[2].func.ref).name);
121defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(3, frames[3].index);
122defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("", response.lookup(frames[3].func.ref).name);
1239d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      assertFalse(response.running(), "expected not running");
124defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
125defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      // Get backtrace with two frames.
126defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      json = '{"seq":0,"type":"request","command":"backtrace","arguments":{"fromFrame":1,"toFrame":3}}'
127defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
128defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      backtrace = response.body();
129defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(1, backtrace.fromFrame);
130defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(3, backtrace.toFrame);
131defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(4, backtrace.totalFrames);
132defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      var frames = backtrace.frames;
133defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(2, frames.length);
134defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      for (var i = 0; i < frames.length; i++) {
135defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org        assertEquals('frame', frames[i].type);
136defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      }
137defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(1, frames[0].index);
138defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("", response.lookup(frames[0].func.ref).name);
139defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("m", response.lookup(frames[0].func.ref).inferredName);
140defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(2, frames[1].index);
141defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("g", response.lookup(frames[1].func.ref).name);
142defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
143defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      // Get backtrace with bottom two frames.
144defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      json = '{"seq":0,"type":"request","command":"backtrace","arguments":{"fromFrame":0,"toFrame":2, "bottom":true}}'
145defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
146defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      backtrace = response.body();
147defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(2, backtrace.fromFrame);
148defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(4, backtrace.toFrame);
149defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(4, backtrace.totalFrames);
150defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      var frames = backtrace.frames;
151defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(2, frames.length);
152defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      for (var i = 0; i < frames.length; i++) {
153defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org        assertEquals('frame', frames[i].type);
154defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      }
155defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(2, frames[0].index);
156defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("g", response.lookup(frames[0].func.ref).name);
157defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(3, frames[1].index);
158defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("", response.lookup(frames[1].func.ref).name);
159defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
160defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      // Get the individual frames.
161defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      json = '{"seq":0,"type":"request","command":"frame"}'
162defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
163defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      frame = response.body();
164defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(0, frame.index);
165defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("f", response.lookup(frame.func.ref).name);
166defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertTrue(frame.constructCall);
167defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(31, frame.line);
168defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(3, frame.column);
169defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(2, frame.arguments.length);
170defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals('x', frame.arguments[0].name);
171defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals('number', response.lookup(frame.arguments[0].value.ref).type);
172defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(1, response.lookup(frame.arguments[0].value.ref).value);
173defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals('y', frame.arguments[1].name);
174defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals('undefined', response.lookup(frame.arguments[1].value.ref).type);
175defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
176defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      json = '{"seq":0,"type":"request","command":"frame","arguments":{"number":0}}'
177defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
178defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      frame = response.body();
179defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(0, frame.index);
180defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("f", response.lookup(frame.func.ref).name);
181defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(31, frame.line);
182defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(3, frame.column);
183defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(2, frame.arguments.length);
184defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals('x', frame.arguments[0].name);
185defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals('number', response.lookup(frame.arguments[0].value.ref).type);
186defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(1, response.lookup(frame.arguments[0].value.ref).value);
187defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals('y', frame.arguments[1].name);
188defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals('undefined', response.lookup(frame.arguments[1].value.ref).type);
189defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
190defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      json = '{"seq":0,"type":"request","command":"frame","arguments":{"number":1}}'
191defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
192defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      frame = response.body();
193defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(1, frame.index);
194defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("", response.lookup(frame.func.ref).name);
195defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("m", response.lookup(frame.func.ref).inferredName);
196defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertFalse(frame.constructCall);
197defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(35, frame.line);
198030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org      assertEquals(6, frame.column);
199defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(0, frame.arguments.length);
200defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
201defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      json = '{"seq":0,"type":"request","command":"frame","arguments":{"number":3}}'
202defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
203defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      frame = response.body();
204defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(3, frame.index);
205defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("", response.lookup(frame.func.ref).name);
206defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
207defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      // Source slices for the individual frames (they all refer to this script).
208defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      json = '{"seq":0,"type":"request","command":"source",' +
209defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org              '"arguments":{"frame":0,"fromLine":30,"toLine":32}}'
210defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
211defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      source = response.body();
212defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("function f(x, y) {", source.source.substring(0, 18));
213defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(30, source.fromLine);
214defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(32, source.toLine);
215defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
216defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      json = '{"seq":0,"type":"request","command":"source",' +
217defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org              '"arguments":{"frame":1,"fromLine":31,"toLine":32}}'
218defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
219defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      source = response.body();
220defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("  a=1;", source.source.substring(0, 6));
221defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(31, source.fromLine);
222defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(32, source.toLine);
223defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
224defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      json = '{"seq":0,"type":"request","command":"source",' +
225defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org              '"arguments":{"frame":2,"fromLine":35,"toLine":36}}'
226defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
227defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      source = response.body();
228defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals("  new f(1);", source.source.substring(0, 11));
229defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(35, source.fromLine);
230defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(36, source.toLine);
231defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
232defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      // Test line interval way beyond this script will result in an error.
233defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      json = '{"seq":0,"type":"request","command":"source",' +
234defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org              '"arguments":{"frame":0,"fromLine":10000,"toLine":20000}}'
235defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
236defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertFalse(response.response().success);
237defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
238defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      // Test without arguments.
239defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      json = '{"seq":0,"type":"request","command":"source"}'
240defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
241defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      source = response.body();
242defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      assertEquals(Debug.findScript(f).source, source.source);
243defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
2449d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      // New copy of debug command processor in running state.
2459d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      dcp = exec_state.debugCommandProcessor(true);
2469d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      // Get the backtrace.
2479d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      json = '{"seq":0,"type":"request","command":"backtrace"}'
2489d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      resp = dcp.processDebugJSONRequest(json);
2499d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      response = new ParsedResponse(resp);
2509d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      // It might be argueable, but we expect response to have body when
2519d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      // not suspended
2529d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      assertTrue(!!response.body(), "response should be null");
2539d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      assertTrue(response.running(), "expected running");
2549d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
255defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org      listenerCalled = true;
2569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    }
2579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  } catch (e) {
2589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    exception = e
2599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  };
2609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com};
2619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Add the debug event listener.
263245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebug.setListener(listener);
2649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Set a break point and call to invoke the debug event listener.
2669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comDebug.setBreakPoint(f, 0, 0);
2679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comg();
2689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Make sure that the debug event listener vas invoked.
2709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertFalse(exception, "exception in listener");
2719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertTrue(listenerCalled);
272