1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2008 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch"use strict";
293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString.prototype.startsWith = function (str) {
313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (str.length > this.length) {
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return false;
333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.substr(0, str.length) == str;
353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction log10(num) {
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Math.log(num)/Math.log(10);
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction ToInspectableObject(obj) {
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!obj && typeof obj === 'object') {
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return void 0;
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return Object(obj);
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction GetCompletions(global, last, full) {
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var full_tokens = full.split();
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  full = full_tokens.pop();
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var parts = full.split('.');
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  parts.pop();
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var current = global;
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (var i = 0; i < parts.length; i++) {
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var part = parts[i];
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var next = current[part];
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!next) {
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return [];
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    current = next;
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var result = [];
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  current = ToInspectableObject(current);
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  while (typeof current !== 'undefined') {
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var mirror = new $debug.ObjectMirror(current);
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var properties = mirror.properties();
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (var i = 0; i < properties.length; i++) {
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var name = properties[i].name();
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (typeof name === 'string' && name.startsWith(last)) {
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result.push(name);
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    current = ToInspectableObject(current.__proto__);
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Global object holding debugger related constants and state.
813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar Debug = {};
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Debug events which can occour in the V8 JavaScript engine. These originate
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from the API include file v8-debug.h.
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.DebugEvent = { Break: 1,
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     Exception: 2,
88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     NewFunction: 3,
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     BeforeCompile: 4,
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     AfterCompile: 5 };
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The different types of scripts matching enum ScriptType in objects.h.
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.ScriptType = { Native: 0,
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     Extension: 1,
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     Normal: 2 };
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The different types of script compilations matching enum
100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Script::CompilationType in objects.h.
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.ScriptCompilationType = { Host: 0,
102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                Eval: 1,
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                JSON: 2 };
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The different types of scopes matching constants runtime.cc.
107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.ScopeType = { Global: 0,
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                    Local: 1,
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                    With: 2,
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                    Closure: 3,
11169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                    Catch: 4,
11269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                    Block: 5 };
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Current debug state.
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kNoFrame = -1;
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.State = {
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  currentFrame: kNoFrame,
119086aeeaae12517475c22695a200be45495516549Ben Murdoch  displaySourceStartLine: -1,
120086aeeaae12517475c22695a200be45495516549Ben Murdoch  displaySourceEndLine: -1,
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  currentSourceLine: -1
1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar trace_compile = false;  // Tracing all compile events?
124086aeeaae12517475c22695a200be45495516549Ben Murdochvar trace_debug_json = false; // Tracing all debug json packets?
1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar last_cmd = '';
126e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch//var lol_is_enabled;  // Set to true in d8.cc if LIVE_OBJECT_LIST is defined.
127e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvar lol_next_dump_index = 0;
1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kDefaultLolLinesToPrintAtATime = 10;
1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kMaxLolLinesToPrintAtATime = 1000;
130086aeeaae12517475c22695a200be45495516549Ben Murdochvar repeat_cmd_line = '';
131086aeeaae12517475c22695a200be45495516549Ben Murdochvar is_running = true;
1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Global variable used to store whether a handle was requested.
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar lookup_handle = null;
134086aeeaae12517475c22695a200be45495516549Ben Murdoch
135086aeeaae12517475c22695a200be45495516549Ben Murdoch// Copied from debug-delay.js.  This is needed below:
136086aeeaae12517475c22695a200be45495516549Ben Murdochfunction ScriptTypeFlag(type) {
137086aeeaae12517475c22695a200be45495516549Ben Murdoch  return (1 << type);
138086aeeaae12517475c22695a200be45495516549Ben Murdoch}
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Process a debugger JSON message into a display text and a running status.
142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// This function returns an object with properties "text" and "running" holding
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// this information.
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction DebugMessageDetails(message) {
145086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (trace_debug_json) {
146086aeeaae12517475c22695a200be45495516549Ben Murdoch    print("received: '" + message + "'");
147086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Convert the JSON string to an object.
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var response = new ProtocolPackage(message);
150086aeeaae12517475c22695a200be45495516549Ben Murdoch  is_running = response.running();
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (response.type() == 'event') {
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return DebugEventDetails(response);
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return DebugResponseDetails(response);
156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction DebugEventDetails(response) {
1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var details = {text:'', running:false};
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Get the running state.
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  details.running = response.running();
164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var body = response.body();
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var result = '';
167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (response.event()) {
168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'break':
169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (body.breakpoints) {
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += 'breakpoint';
171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (body.breakpoints.length > 1) {
172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += 's';
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += ' #';
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        for (var i = 0; i < body.breakpoints.length; i++) {
176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (i > 0) {
177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += ', #';
178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += body.breakpoints[i];
180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      } else {
182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += 'break';
183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += ' in ';
185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += body.invocationText;
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += ', ';
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += SourceInfo(body);
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '\n';
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += SourceUnderline(body.sourceLineText, body.sourceColumn);
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Debug.State.currentSourceLine = body.sourceLine;
191086aeeaae12517475c22695a200be45495516549Ben Murdoch      Debug.State.displaySourceStartLine = -1;
192086aeeaae12517475c22695a200be45495516549Ben Murdoch      Debug.State.displaySourceEndLine = -1;
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Debug.State.currentFrame = 0;
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      details.text = result;
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'exception':
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (body.uncaught) {
199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += 'Uncaught: ';
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      } else {
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += 'Exception: ';
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '"';
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += body.exception.text;
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '"';
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (body.sourceLine >= 0) {
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += ', ';
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += SourceInfo(body);
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += '\n';
210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += SourceUnderline(body.sourceLineText, body.sourceColumn);
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        Debug.State.currentSourceLine = body.sourceLine;
212086aeeaae12517475c22695a200be45495516549Ben Murdoch        Debug.State.displaySourceStartLine = -1;
213086aeeaae12517475c22695a200be45495516549Ben Murdoch        Debug.State.displaySourceEndLine = -1;
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        Debug.State.currentFrame = 0;
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      } else {
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += ' (empty stack)';
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        Debug.State.currentSourceLine = -1;
218086aeeaae12517475c22695a200be45495516549Ben Murdoch        Debug.State.displaySourceStartLine = -1;
219086aeeaae12517475c22695a200be45495516549Ben Murdoch        Debug.State.displaySourceEndLine = -1;
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        Debug.State.currentFrame = kNoFrame;
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      details.text = result;
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'afterCompile':
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (trace_compile) {
2273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        result = 'Source ' + body.script.name + ' compiled:\n';
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var source = body.script.source;
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (!(source[source.length - 1] == '\n')) {
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += source;
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        } else {
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += source.substring(0, source.length - 1);
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      details.text = result;
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
238086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'scriptCollected':
239086aeeaae12517475c22695a200be45495516549Ben Murdoch      details.text = result;
240086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
241086aeeaae12517475c22695a200be45495516549Ben Murdoch
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      details.text = 'Unknown debug event ' + response.event();
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return details;
2473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction SourceInfo(body) {
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var result = '';
2526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (body.script) {
254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (body.script.name) {
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += body.script.name;
256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '[unnamed]';
258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += ' line ';
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += body.sourceLine + 1;
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += ' column ';
263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += body.sourceColumn + 1;
2646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction SourceUnderline(source_text, position) {
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!source_text) {
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return;
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Create an underline with a caret pointing to the source position. If the
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // source contains a tab character the underline will have a tab character in
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // the same place otherwise the underline will have a space character.
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var underline = '';
278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (var i = 0; i < position; i++) {
279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (source_text[i] == '\t') {
280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      underline += '\t';
281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      underline += ' ';
283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  underline += '^';
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Return the source line text with the underline beneath.
288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return source_text + '\n' + underline;
2893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Converts a text command to a JSON request.
293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction DebugCommandToJSONRequest(cmd_line) {
294086aeeaae12517475c22695a200be45495516549Ben Murdoch  var result = new DebugRequest(cmd_line).JSONRequest();
295086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (trace_debug_json && result) {
296086aeeaae12517475c22695a200be45495516549Ben Murdoch    print("sending: '" + result + "'");
297086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
298086aeeaae12517475c22695a200be45495516549Ben Murdoch  return result;
2993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction DebugRequest(cmd_line) {
303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // If the very first character is a { assume that a JSON request have been
304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // entered as a command. Converting that to a JSON request is trivial.
305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (cmd_line && cmd_line.length > 0 && cmd_line.charAt(0) == '{') {
306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    this.request_ = cmd_line;
307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return;
308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
310086aeeaae12517475c22695a200be45495516549Ben Murdoch  // Check for a simple carriage return to repeat the last command:
311086aeeaae12517475c22695a200be45495516549Ben Murdoch  var is_repeating = false;
312086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (cmd_line == '\n') {
313086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (is_running) {
314086aeeaae12517475c22695a200be45495516549Ben Murdoch      cmd_line = 'break'; // Not in debugger mode, break with a frame request.
315086aeeaae12517475c22695a200be45495516549Ben Murdoch    } else {
316086aeeaae12517475c22695a200be45495516549Ben Murdoch      cmd_line = repeat_cmd_line; // use command to repeat.
317086aeeaae12517475c22695a200be45495516549Ben Murdoch      is_repeating = true;
318086aeeaae12517475c22695a200be45495516549Ben Murdoch    }
319086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
320086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!is_running) { // Only save the command if in debugger mode.
321086aeeaae12517475c22695a200be45495516549Ben Murdoch    repeat_cmd_line = cmd_line;   // save last command.
322086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
323086aeeaae12517475c22695a200be45495516549Ben Murdoch
324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Trim string for leading and trailing whitespace.
325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  cmd_line = cmd_line.replace(/^\s+|\s+$/g, '');
326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Find the command.
328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var pos = cmd_line.indexOf(' ');
329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var cmd;
330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var args;
331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (pos == -1) {
332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    cmd = cmd_line;
333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    args = '';
334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    cmd = cmd_line.slice(0, pos);
336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    args = cmd_line.slice(pos).replace(/^\s+|\s+$/g, '');
337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
339086aeeaae12517475c22695a200be45495516549Ben Murdoch  if ((cmd === undefined) || !cmd) {
340086aeeaae12517475c22695a200be45495516549Ben Murdoch    this.request_ = void 0;
341086aeeaae12517475c22695a200be45495516549Ben Murdoch    return;
342086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
343086aeeaae12517475c22695a200be45495516549Ben Murdoch
344086aeeaae12517475c22695a200be45495516549Ben Murdoch  last_cmd = cmd;
345086aeeaae12517475c22695a200be45495516549Ben Murdoch
346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Switch on command.
347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (cmd) {
348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'continue':
349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'c':
350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.continueCommandToJSONRequest_(args);
351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'step':
354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 's':
355086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.stepCommandToJSONRequest_(args, 'in');
356086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
357086aeeaae12517475c22695a200be45495516549Ben Murdoch
358086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'stepi':
359086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'si':
360086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.stepCommandToJSONRequest_(args, 'min');
361086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
362086aeeaae12517475c22695a200be45495516549Ben Murdoch
363086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'next':
364086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'n':
365086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.stepCommandToJSONRequest_(args, 'next');
366086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
367086aeeaae12517475c22695a200be45495516549Ben Murdoch
368086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'finish':
369086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'fin':
370086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.stepCommandToJSONRequest_(args, 'out');
371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'backtrace':
374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'bt':
375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.backtraceCommandToJSONRequest_(args);
376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
3776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'frame':
379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'f':
380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.frameCommandToJSONRequest_(args);
381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
3826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'scopes':
384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.scopesCommandToJSONRequest_(args);
385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
3866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'scope':
388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.scopeCommandToJSONRequest_(args);
389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
3906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
391086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'disconnect':
392086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'exit':
393086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'quit':
394086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.disconnectCommandToJSONRequest_(args);
395086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
396086aeeaae12517475c22695a200be45495516549Ben Murdoch
397086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'up':
398086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ =
399086aeeaae12517475c22695a200be45495516549Ben Murdoch          this.frameCommandToJSONRequest_('' +
400086aeeaae12517475c22695a200be45495516549Ben Murdoch                                          (Debug.State.currentFrame + 1));
401086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
40269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
403086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'down':
404086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'do':
405086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ =
406086aeeaae12517475c22695a200be45495516549Ben Murdoch          this.frameCommandToJSONRequest_('' +
407086aeeaae12517475c22695a200be45495516549Ben Murdoch                                          (Debug.State.currentFrame - 1));
408086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
40969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
410086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'set':
411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'print':
412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'p':
413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.printCommandToJSONRequest_(args);
414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'dir':
417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.dirCommandToJSONRequest_(args);
418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'references':
421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.referencesCommandToJSONRequest_(args);
422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'instances':
425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.instancesCommandToJSONRequest_(args);
426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
428086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'list':
429086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'l':
430086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.listCommandToJSONRequest_(args);
431086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'source':
433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.sourceCommandToJSONRequest_(args);
434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
4356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'scripts':
437086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'script':
438086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'scr':
439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.scriptsCommandToJSONRequest_(args);
440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
4416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'break':
443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'b':
444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.breakCommandToJSONRequest_(args);
445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
4466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
44725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    case 'breakpoints':
44825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    case 'bb':
44925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen      this.request_ = this.breakpointsCommandToJSONRequest_(args);
45025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen      break;
45125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'clear':
453086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'delete':
454086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'd':
455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.clearCommandToJSONRequest_(args);
456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'threads':
459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.threadsCommandToJSONRequest_(args);
460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
462086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'cond':
463086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.changeBreakpointCommandToJSONRequest_(args, 'cond');
464086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
465086aeeaae12517475c22695a200be45495516549Ben Murdoch
466086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'enable':
467086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'en':
468086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ =
469086aeeaae12517475c22695a200be45495516549Ben Murdoch          this.changeBreakpointCommandToJSONRequest_(args, 'enable');
470086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
471086aeeaae12517475c22695a200be45495516549Ben Murdoch
472086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'disable':
473086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'dis':
474086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ =
475086aeeaae12517475c22695a200be45495516549Ben Murdoch          this.changeBreakpointCommandToJSONRequest_(args, 'disable');
476086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
477086aeeaae12517475c22695a200be45495516549Ben Murdoch
478086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'ignore':
479086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ =
480086aeeaae12517475c22695a200be45495516549Ben Murdoch          this.changeBreakpointCommandToJSONRequest_(args, 'ignore');
481086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
482086aeeaae12517475c22695a200be45495516549Ben Murdoch
483086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'info':
484086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'inf':
485086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.infoCommandToJSONRequest_(args);
486086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
487086aeeaae12517475c22695a200be45495516549Ben Murdoch
488086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'flags':
489086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.v8FlagsToJSONRequest_(args);
490086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
491086aeeaae12517475c22695a200be45495516549Ben Murdoch
492086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'gc':
493086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.gcToJSONRequest_(args);
494086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
495086aeeaae12517475c22695a200be45495516549Ben Murdoch
496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'trace':
497086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'tr':
498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Return undefined to indicate command handled internally (no JSON).
499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = void 0;
500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.traceCommand_(args);
501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'help':
504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case '?':
505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.helpCommand_(args);
506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Return undefined to indicate command handled internally (no JSON).
507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = void 0;
508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
510e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'liveobjectlist':
511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'lol':
512e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (lol_is_enabled) {
513e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        this.request_ = this.lolToJSONRequest_(args, is_repeating);
514e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        break;
515e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      }
516e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      throw new Error('Unknown command "' + cmd + '"');
519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.JSONRequest = function() {
523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.request_;
5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction RequestPacket(command) {
528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.seq = 0;
529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.type = 'request';
530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.command = command;
531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockRequestPacket.prototype.toJSONProtocol = function() {
535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Encode the protocol header.
536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var json = '{';
537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  json += '"seq":' + this.seq;
538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  json += ',"type":"' + this.type + '"';
539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (this.command) {
540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    json += ',"command":' + StringToJSON_(this.command);
541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (this.arguments) {
543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    json += ',"arguments":';
544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Encode the arguments part.
545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (this.arguments.toJSONProtocol) {
5463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      json += this.arguments.toJSONProtocol();
547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json += SimpleObjectToJSON_(this.arguments);
549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  json += '}';
552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return json;
5533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.createRequest = function(command) {
557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return new RequestPacket(command);
558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
561e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// Note: we use detected command repetition as a signal for continuation here.
562e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugRequest.prototype.createLOLRequest = function(command,
563e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                                   start_index,
564e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                                   lines_to_dump,
565e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                                   is_continuation) {
566e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (is_continuation) {
567e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    start_index = lol_next_dump_index;
568e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
569e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
570e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (lines_to_dump) {
571e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    lines_to_dump = parseInt(lines_to_dump);
572e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else {
573e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    lines_to_dump = kDefaultLolLinesToPrintAtATime;
574e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
575e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (lines_to_dump > kMaxLolLinesToPrintAtATime) {
576e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    lines_to_dump = kMaxLolLinesToPrintAtATime;
577e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
578e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
579e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // Save the next start_index to dump from:
580e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  lol_next_dump_index = start_index + lines_to_dump;
581e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
582e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var request = this.createRequest(command);
583e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  request.arguments = {};
584e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  request.arguments.start = start_index;
585e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  request.arguments.count = lines_to_dump;
586e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
587e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return request;
588e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
589e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
590e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the evaluation command.
592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.makeEvaluateJSONRequest_ = function(expression) {
593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  lookup_handle = null;
594e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
595e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (lol_is_enabled) {
596e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Check if the expression is a obj id in the form @<obj id>.
597e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var obj_id_match = expression.match(/^@([0-9]+)$/);
598e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (obj_id_match) {
599e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      var obj_id = parseInt(obj_id_match[1]);
600e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      // Build a dump request.
601e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      var request = this.createRequest('getobj');
602e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      request.arguments = {};
603e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      request.arguments.obj_id = obj_id;
604e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      return request.toJSONProtocol();
605e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
606e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
607e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Check if the expression is a handle id in the form #<handle>#.
609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var handle_match = expression.match(/^#([0-9]*)#$/);
610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (handle_match) {
611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Remember the handle requested in a global variable.
612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    lookup_handle = parseInt(handle_match[1]);
613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Build a lookup request.
614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var request = this.createRequest('lookup');
615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.handles = [ lookup_handle ];
617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return request.toJSONProtocol();
618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Build an evaluate request.
620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var request = this.createRequest('evaluate');
621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.expression = expression;
623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Request a global evaluation if there is no current frame.
624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (Debug.State.currentFrame == kNoFrame) {
625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      request.arguments.global = true;
626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return request.toJSONProtocol();
628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the references/instances command.
633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.makeReferencesJSONRequest_ = function(handle, type) {
634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a references request.
635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var handle_match = handle.match(/^#([0-9]*)#$/);
636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (handle_match) {
637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var request = this.createRequest('references');
638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.type = type;
640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.handle = parseInt(handle_match[1]);
641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return request.toJSONProtocol();
642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Invalid object id.');
644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the continue command.
649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.continueCommandToJSONRequest_ = function(args) {
650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('continue');
651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the step command.
656086aeeaae12517475c22695a200be45495516549Ben MurdochDebugRequest.prototype.stepCommandToJSONRequest_ = function(args, type) {
657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Requesting a step is through the continue command with additional
658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // arguments.
659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('continue');
660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request.arguments = {};
661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Process arguments if any.
663086aeeaae12517475c22695a200be45495516549Ben Murdoch
664086aeeaae12517475c22695a200be45495516549Ben Murdoch  // Only process args if the command is 'step' which is indicated by type being
665086aeeaae12517475c22695a200be45495516549Ben Murdoch  // set to 'in'.  For all other commands, ignore the args.
666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args && args.length > 0) {
667086aeeaae12517475c22695a200be45495516549Ben Murdoch    args = args.split(/\s+/g);
668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (args.length > 2) {
670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      throw new Error('Invalid step arguments.');
671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (args.length > 0) {
674086aeeaae12517475c22695a200be45495516549Ben Murdoch      // Check if we have a gdb stype step command.  If so, the 1st arg would
675086aeeaae12517475c22695a200be45495516549Ben Murdoch      // be the step count.  If it's not a number, then assume that we're
676086aeeaae12517475c22695a200be45495516549Ben Murdoch      // parsing for the legacy v8 step command.
677086aeeaae12517475c22695a200be45495516549Ben Murdoch      var stepcount = Number(args[0]);
678086aeeaae12517475c22695a200be45495516549Ben Murdoch      if (stepcount == Number.NaN) {
679086aeeaae12517475c22695a200be45495516549Ben Murdoch        // No step count at arg 1.  Process as legacy d8 step command:
680086aeeaae12517475c22695a200be45495516549Ben Murdoch        if (args.length == 2) {
681086aeeaae12517475c22695a200be45495516549Ben Murdoch          var stepcount = parseInt(args[1]);
682086aeeaae12517475c22695a200be45495516549Ben Murdoch          if (isNaN(stepcount) || stepcount <= 0) {
683086aeeaae12517475c22695a200be45495516549Ben Murdoch            throw new Error('Invalid step count argument "' + args[0] + '".');
684086aeeaae12517475c22695a200be45495516549Ben Murdoch          }
685086aeeaae12517475c22695a200be45495516549Ben Murdoch          request.arguments.stepcount = stepcount;
686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
688086aeeaae12517475c22695a200be45495516549Ben Murdoch        // Get the step action.
689086aeeaae12517475c22695a200be45495516549Ben Murdoch        switch (args[0]) {
690086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'in':
691086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'i':
692086aeeaae12517475c22695a200be45495516549Ben Murdoch            request.arguments.stepaction = 'in';
693086aeeaae12517475c22695a200be45495516549Ben Murdoch            break;
6946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
695086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'min':
696086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'm':
697086aeeaae12517475c22695a200be45495516549Ben Murdoch            request.arguments.stepaction = 'min';
698086aeeaae12517475c22695a200be45495516549Ben Murdoch            break;
6996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
700086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'next':
701086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'n':
702086aeeaae12517475c22695a200be45495516549Ben Murdoch            request.arguments.stepaction = 'next';
703086aeeaae12517475c22695a200be45495516549Ben Murdoch            break;
7046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
705086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'out':
706086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'o':
707086aeeaae12517475c22695a200be45495516549Ben Murdoch            request.arguments.stepaction = 'out';
708086aeeaae12517475c22695a200be45495516549Ben Murdoch            break;
7096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
710086aeeaae12517475c22695a200be45495516549Ben Murdoch          default:
711086aeeaae12517475c22695a200be45495516549Ben Murdoch            throw new Error('Invalid step argument "' + args[0] + '".');
712086aeeaae12517475c22695a200be45495516549Ben Murdoch        }
713086aeeaae12517475c22695a200be45495516549Ben Murdoch
714086aeeaae12517475c22695a200be45495516549Ben Murdoch      } else {
715086aeeaae12517475c22695a200be45495516549Ben Murdoch        // gdb style step commands:
716086aeeaae12517475c22695a200be45495516549Ben Murdoch        request.arguments.stepaction = type;
717086aeeaae12517475c22695a200be45495516549Ben Murdoch        request.arguments.stepcount = stepcount;
718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
721086aeeaae12517475c22695a200be45495516549Ben Murdoch    // Default is step of the specified type.
722086aeeaae12517475c22695a200be45495516549Ben Murdoch    request.arguments.stepaction = type;
723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the backtrace command.
730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.backtraceCommandToJSONRequest_ = function(args) {
731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a backtrace request from the text command.
732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('backtrace');
7336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Default is to show top 10 frames.
735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request.arguments = {};
736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request.arguments.fromFrame = 0;
737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request.arguments.toFrame = 10;
738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  args = args.split(/\s*[ ]+\s*/g);
740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length == 1 && args[0].length > 0) {
741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var frameCount = parseInt(args[0]);
742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (frameCount > 0) {
743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Show top frames.
744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      request.arguments.fromFrame = 0;
745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      request.arguments.toFrame = frameCount;
746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Show bottom frames.
748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      request.arguments.fromFrame = 0;
749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      request.arguments.toFrame = -frameCount;
750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      request.arguments.bottom = true;
751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (args.length == 2) {
753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var fromFrame = parseInt(args[0]);
754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var toFrame = parseInt(args[1]);
755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (isNaN(fromFrame) || fromFrame < 0) {
756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      throw new Error('Invalid start frame argument "' + args[0] + '".');
757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (isNaN(toFrame) || toFrame < 0) {
759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      throw new Error('Invalid end frame argument "' + args[1] + '".');
760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (fromFrame > toFrame) {
762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      throw new Error('Invalid arguments start frame cannot be larger ' +
763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                      'than end frame.');
764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Show frame range.
766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.fromFrame = fromFrame;
767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.toFrame = toFrame + 1;
768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (args.length > 2) {
769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Invalid backtrace arguments.');
770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the frame command.
777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.frameCommandToJSONRequest_ = function(args) {
778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a frame request from the text command.
779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('frame');
780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  args = args.split(/\s*[ ]+\s*/g);
781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length > 0 && args[0].length > 0) {
782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.number = args[0];
784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the scopes command.
790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.scopesCommandToJSONRequest_ = function(args) {
791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a scopes request from the text command.
792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('scopes');
793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the scope command.
798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.scopeCommandToJSONRequest_ = function(args) {
799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a scope request from the text command.
800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('scope');
801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  args = args.split(/\s*[ ]+\s*/g);
802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length > 0 && args[0].length > 0) {
803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.number = args[0];
805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the print command.
811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.printCommandToJSONRequest_ = function(args) {
812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build an evaluate request from the text command.
813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length == 0) {
814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Missing expression.');
815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.makeEvaluateJSONRequest_(args);
817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the dir command.
821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.dirCommandToJSONRequest_ = function(args) {
822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build an evaluate request from the text command.
823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length == 0) {
824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Missing expression.');
825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.makeEvaluateJSONRequest_(args);
827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the references command.
831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.referencesCommandToJSONRequest_ = function(args) {
832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build an evaluate request from the text command.
833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length == 0) {
834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Missing object id.');
835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
8366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.makeReferencesJSONRequest_(args, 'referencedBy');
838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the instances command.
842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.instancesCommandToJSONRequest_ = function(args) {
843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build an evaluate request from the text command.
844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length == 0) {
845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Missing object id.');
846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
8476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a references request.
849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.makeReferencesJSONRequest_(args, 'constructedBy');
850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
853086aeeaae12517475c22695a200be45495516549Ben Murdoch// Create a JSON request for the list command.
854086aeeaae12517475c22695a200be45495516549Ben MurdochDebugRequest.prototype.listCommandToJSONRequest_ = function(args) {
855086aeeaae12517475c22695a200be45495516549Ben Murdoch
856086aeeaae12517475c22695a200be45495516549Ben Murdoch  // Default is ten lines starting five lines before the current location.
857086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (Debug.State.displaySourceEndLine == -1) {
858086aeeaae12517475c22695a200be45495516549Ben Murdoch    // If we list forwards, we will start listing after the last source end
859086aeeaae12517475c22695a200be45495516549Ben Murdoch    // line.  Set it to start from 5 lines before the current location.
860086aeeaae12517475c22695a200be45495516549Ben Murdoch    Debug.State.displaySourceEndLine = Debug.State.currentSourceLine - 5;
861086aeeaae12517475c22695a200be45495516549Ben Murdoch    // If we list backwards, we will start listing backwards from the last
862086aeeaae12517475c22695a200be45495516549Ben Murdoch    // source start line.  Set it to start from 1 lines before the current
863086aeeaae12517475c22695a200be45495516549Ben Murdoch    // location.
864086aeeaae12517475c22695a200be45495516549Ben Murdoch    Debug.State.displaySourceStartLine = Debug.State.currentSourceLine + 1;
865086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
866086aeeaae12517475c22695a200be45495516549Ben Murdoch
867086aeeaae12517475c22695a200be45495516549Ben Murdoch  var from = Debug.State.displaySourceEndLine + 1;
868086aeeaae12517475c22695a200be45495516549Ben Murdoch  var lines = 10;
869086aeeaae12517475c22695a200be45495516549Ben Murdoch
870086aeeaae12517475c22695a200be45495516549Ben Murdoch  // Parse the arguments.
871086aeeaae12517475c22695a200be45495516549Ben Murdoch  args = args.split(/\s*,\s*/g);
872086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (args == '') {
873086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else if ((args.length == 1) && (args[0] == '-')) {
874086aeeaae12517475c22695a200be45495516549Ben Murdoch    from = Debug.State.displaySourceStartLine - lines;
875086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else if (args.length == 2) {
876086aeeaae12517475c22695a200be45495516549Ben Murdoch    from = parseInt(args[0]);
877086aeeaae12517475c22695a200be45495516549Ben Murdoch    lines = parseInt(args[1]) - from + 1; // inclusive of the ending line.
878086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else {
879086aeeaae12517475c22695a200be45495516549Ben Murdoch    throw new Error('Invalid list arguments.');
880086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
881086aeeaae12517475c22695a200be45495516549Ben Murdoch  Debug.State.displaySourceStartLine = from;
882086aeeaae12517475c22695a200be45495516549Ben Murdoch  Debug.State.displaySourceEndLine = from + lines - 1;
883086aeeaae12517475c22695a200be45495516549Ben Murdoch  var sourceArgs = '' + from + ' ' + lines;
884086aeeaae12517475c22695a200be45495516549Ben Murdoch  return this.sourceCommandToJSONRequest_(sourceArgs);
885086aeeaae12517475c22695a200be45495516549Ben Murdoch};
886086aeeaae12517475c22695a200be45495516549Ben Murdoch
887086aeeaae12517475c22695a200be45495516549Ben Murdoch
888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the source command.
889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.sourceCommandToJSONRequest_ = function(args) {
890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a evaluate request from the text command.
891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('source');
892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Default is ten lines starting five lines before the current location.
894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var from = Debug.State.currentSourceLine - 5;
895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var lines = 10;
896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Parse the arguments.
898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  args = args.split(/\s*[ ]+\s*/g);
899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length > 1 && args[0].length > 0 && args[1].length > 0) {
900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    from = parseInt(args[0]) - 1;
901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    lines = parseInt(args[1]);
902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (args.length > 0 && args[0].length > 0) {
903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    from = parseInt(args[0]) - 1;
904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (from < 0) from = 0;
907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (lines < 0) lines = 10;
908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Request source arround current source location.
910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request.arguments = {};
911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request.arguments.fromLine = from;
912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request.arguments.toLine = from + lines;
913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the scripts command.
919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.scriptsCommandToJSONRequest_ = function(args) {
920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a evaluate request from the text command.
921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('scripts');
922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Process arguments if any.
924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args && args.length > 0) {
925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    args = args.split(/\s*[ ]+\s*/g);
926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (args.length > 1) {
928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      throw new Error('Invalid scripts arguments.');
929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    switch (args[0]) {
933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'natives':
934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        request.arguments.types = ScriptTypeFlag(Debug.ScriptType.Native);
935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
9366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'extensions':
938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        request.arguments.types = ScriptTypeFlag(Debug.ScriptType.Extension);
939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
9406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'all':
942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        request.arguments.types =
943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            ScriptTypeFlag(Debug.ScriptType.Normal) |
944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            ScriptTypeFlag(Debug.ScriptType.Native) |
945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            ScriptTypeFlag(Debug.ScriptType.Extension);
946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
9476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      default:
949086aeeaae12517475c22695a200be45495516549Ben Murdoch        // If the arg is not one of the know one aboves, then it must be a
950086aeeaae12517475c22695a200be45495516549Ben Murdoch        // filter used for filtering the results:
951086aeeaae12517475c22695a200be45495516549Ben Murdoch        request.arguments.filter = args[0];
952086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the break command.
961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.breakCommandToJSONRequest_ = function(args) {
962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a evaluate request from the text command.
963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Process arguments if any.
964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args && args.length > 0) {
965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var target = args;
966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var type = 'function';
967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var line;
968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var column;
969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var condition;
970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var pos;
971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
9726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    var request = this.createRequest('setbreakpoint');
9736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
974086aeeaae12517475c22695a200be45495516549Ben Murdoch    // Break the args into target spec and condition if appropriate.
975086aeeaae12517475c22695a200be45495516549Ben Murdoch
976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Check for breakpoint condition.
977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    pos = args.indexOf(' ');
978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (pos > 0) {
979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      target = args.substring(0, pos);
980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      condition = args.substring(pos + 1, args.length);
981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Check for script breakpoint (name:line[:column]). If no ':' in break
984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // specification it is considered a function break point.
985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    pos = target.indexOf(':');
986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (pos > 0) {
987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var tmp = target.substring(pos + 1, target.length);
988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      target = target.substring(0, pos);
9893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      if (target[0] == '/' && target[target.length - 1] == '/') {
9903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        type = 'scriptRegExp';
9913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        target = target.substring(1, target.length - 1);
9923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      } else {
9933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        type = 'script';
9943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      }
9956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Check for both line and column.
997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      pos = tmp.indexOf(':');
998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (pos > 0) {
999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        column = parseInt(tmp.substring(pos + 1, tmp.length)) - 1;
1000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        line = parseInt(tmp.substring(0, pos)) - 1;
1001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      } else {
1002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        line = parseInt(tmp) - 1;
1003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
1004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else if (target[0] == '#' && target[target.length - 1] == '#') {
1005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      type = 'handle';
1006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      target = target.substring(1, target.length - 1);
1007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
1008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      type = 'function';
1009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
10106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
1012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.type = type;
1013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.target = target;
1014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.line = line;
1015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.column = column;
1016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.condition = condition;
1017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
10186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    var request = this.createRequest('suspend');
1019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
1022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
1023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
102525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian MonsenDebugRequest.prototype.breakpointsCommandToJSONRequest_ = function(args) {
102625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  if (args && args.length > 0) {
102725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    throw new Error('Unexpected arguments.');
102825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  }
102925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  var request = this.createRequest('listbreakpoints');
103025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  return request.toJSONProtocol();
103125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen};
103225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
103325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
1034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the clear command.
1035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.clearCommandToJSONRequest_ = function(args) {
1036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a evaluate request from the text command.
1037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('clearbreakpoint');
1038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Process arguments if any.
1040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args && args.length > 0) {
1041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
1042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.breakpoint = parseInt(args);
1043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Invalid break arguments.');
1045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
1048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
1049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1051086aeeaae12517475c22695a200be45495516549Ben Murdoch// Create a JSON request for the change breakpoint command.
1052086aeeaae12517475c22695a200be45495516549Ben MurdochDebugRequest.prototype.changeBreakpointCommandToJSONRequest_ =
1053086aeeaae12517475c22695a200be45495516549Ben Murdoch    function(args, command) {
1054086aeeaae12517475c22695a200be45495516549Ben Murdoch
1055086aeeaae12517475c22695a200be45495516549Ben Murdoch  var request;
1056086aeeaae12517475c22695a200be45495516549Ben Murdoch
1057086aeeaae12517475c22695a200be45495516549Ben Murdoch  // Check for exception breaks first:
1058086aeeaae12517475c22695a200be45495516549Ben Murdoch  //   en[able] exc[eptions] [all|unc[aught]]
1059086aeeaae12517475c22695a200be45495516549Ben Murdoch  //   en[able] [all|unc[aught]] exc[eptions]
1060086aeeaae12517475c22695a200be45495516549Ben Murdoch  //   dis[able] exc[eptions] [all|unc[aught]]
1061086aeeaae12517475c22695a200be45495516549Ben Murdoch  //   dis[able] [all|unc[aught]] exc[eptions]
1062086aeeaae12517475c22695a200be45495516549Ben Murdoch  if ((command == 'enable' || command == 'disable') &&
1063086aeeaae12517475c22695a200be45495516549Ben Murdoch      args && args.length > 1) {
1064086aeeaae12517475c22695a200be45495516549Ben Murdoch    var nextPos = args.indexOf(' ');
1065086aeeaae12517475c22695a200be45495516549Ben Murdoch    var arg1 = (nextPos > 0) ? args.substring(0, nextPos) : args;
1066086aeeaae12517475c22695a200be45495516549Ben Murdoch    var excType = null;
1067086aeeaae12517475c22695a200be45495516549Ben Murdoch
1068086aeeaae12517475c22695a200be45495516549Ben Murdoch    // Check for:
1069086aeeaae12517475c22695a200be45495516549Ben Murdoch    //   en[able] exc[eptions] [all|unc[aught]]
1070086aeeaae12517475c22695a200be45495516549Ben Murdoch    //   dis[able] exc[eptions] [all|unc[aught]]
1071086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (arg1 == 'exc' || arg1 == 'exception' || arg1 == 'exceptions') {
1072086aeeaae12517475c22695a200be45495516549Ben Murdoch
1073086aeeaae12517475c22695a200be45495516549Ben Murdoch      var arg2 = (nextPos > 0) ?
1074086aeeaae12517475c22695a200be45495516549Ben Murdoch          args.substring(nextPos + 1, args.length) : 'all';
1075086aeeaae12517475c22695a200be45495516549Ben Murdoch      if (!arg2) {
1076086aeeaae12517475c22695a200be45495516549Ben Murdoch        arg2 = 'all'; // if unspecified, set for all.
1077086aeeaae12517475c22695a200be45495516549Ben Murdoch      } if (arg2 == 'unc') { // check for short cut.
1078086aeeaae12517475c22695a200be45495516549Ben Murdoch        arg2 = 'uncaught';
1079086aeeaae12517475c22695a200be45495516549Ben Murdoch      }
1080086aeeaae12517475c22695a200be45495516549Ben Murdoch      excType = arg2;
108169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1082086aeeaae12517475c22695a200be45495516549Ben Murdoch    // Check for:
1083086aeeaae12517475c22695a200be45495516549Ben Murdoch    //   en[able] [all|unc[aught]] exc[eptions]
1084086aeeaae12517475c22695a200be45495516549Ben Murdoch    //   dis[able] [all|unc[aught]] exc[eptions]
1085086aeeaae12517475c22695a200be45495516549Ben Murdoch    } else if (arg1 == 'all' || arg1 == 'unc' || arg1 == 'uncaught') {
1086086aeeaae12517475c22695a200be45495516549Ben Murdoch
1087086aeeaae12517475c22695a200be45495516549Ben Murdoch      var arg2 = (nextPos > 0) ?
1088086aeeaae12517475c22695a200be45495516549Ben Murdoch          args.substring(nextPos + 1, args.length) : null;
1089086aeeaae12517475c22695a200be45495516549Ben Murdoch      if (arg2 == 'exc' || arg1 == 'exception' || arg1 == 'exceptions') {
1090086aeeaae12517475c22695a200be45495516549Ben Murdoch        excType = arg1;
1091086aeeaae12517475c22695a200be45495516549Ben Murdoch        if (excType == 'unc') {
1092086aeeaae12517475c22695a200be45495516549Ben Murdoch          excType = 'uncaught';
1093086aeeaae12517475c22695a200be45495516549Ben Murdoch        }
1094086aeeaae12517475c22695a200be45495516549Ben Murdoch      }
1095086aeeaae12517475c22695a200be45495516549Ben Murdoch    }
1096086aeeaae12517475c22695a200be45495516549Ben Murdoch
1097086aeeaae12517475c22695a200be45495516549Ben Murdoch    // If we matched one of the command formats, then excType will be non-null:
1098086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (excType) {
1099086aeeaae12517475c22695a200be45495516549Ben Murdoch      // Build a evaluate request from the text command.
1100086aeeaae12517475c22695a200be45495516549Ben Murdoch      request = this.createRequest('setexceptionbreak');
1101086aeeaae12517475c22695a200be45495516549Ben Murdoch
1102086aeeaae12517475c22695a200be45495516549Ben Murdoch      request.arguments = {};
1103086aeeaae12517475c22695a200be45495516549Ben Murdoch      request.arguments.type = excType;
1104086aeeaae12517475c22695a200be45495516549Ben Murdoch      request.arguments.enabled = (command == 'enable');
1105086aeeaae12517475c22695a200be45495516549Ben Murdoch
1106086aeeaae12517475c22695a200be45495516549Ben Murdoch      return request.toJSONProtocol();
1107086aeeaae12517475c22695a200be45495516549Ben Murdoch    }
1108086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
1109086aeeaae12517475c22695a200be45495516549Ben Murdoch
1110086aeeaae12517475c22695a200be45495516549Ben Murdoch  // Build a evaluate request from the text command.
1111086aeeaae12517475c22695a200be45495516549Ben Murdoch  request = this.createRequest('changebreakpoint');
1112086aeeaae12517475c22695a200be45495516549Ben Murdoch
1113086aeeaae12517475c22695a200be45495516549Ben Murdoch  // Process arguments if any.
1114086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (args && args.length > 0) {
1115086aeeaae12517475c22695a200be45495516549Ben Murdoch    request.arguments = {};
1116086aeeaae12517475c22695a200be45495516549Ben Murdoch    var pos = args.indexOf(' ');
1117086aeeaae12517475c22695a200be45495516549Ben Murdoch    var breakpointArg = args;
1118086aeeaae12517475c22695a200be45495516549Ben Murdoch    var otherArgs;
1119086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (pos > 0) {
1120086aeeaae12517475c22695a200be45495516549Ben Murdoch      breakpointArg = args.substring(0, pos);
1121086aeeaae12517475c22695a200be45495516549Ben Murdoch      otherArgs = args.substring(pos + 1, args.length);
1122086aeeaae12517475c22695a200be45495516549Ben Murdoch    }
1123086aeeaae12517475c22695a200be45495516549Ben Murdoch
1124086aeeaae12517475c22695a200be45495516549Ben Murdoch    request.arguments.breakpoint = parseInt(breakpointArg);
1125086aeeaae12517475c22695a200be45495516549Ben Murdoch
1126086aeeaae12517475c22695a200be45495516549Ben Murdoch    switch(command) {
1127086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'cond':
1128086aeeaae12517475c22695a200be45495516549Ben Murdoch        request.arguments.condition = otherArgs ? otherArgs : null;
1129086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
1130086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'enable':
1131086aeeaae12517475c22695a200be45495516549Ben Murdoch        request.arguments.enabled = true;
1132086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
1133086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'disable':
1134086aeeaae12517475c22695a200be45495516549Ben Murdoch        request.arguments.enabled = false;
1135086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
1136086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'ignore':
1137086aeeaae12517475c22695a200be45495516549Ben Murdoch        request.arguments.ignoreCount = parseInt(otherArgs);
1138086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
1139086aeeaae12517475c22695a200be45495516549Ben Murdoch      default:
114069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        throw new Error('Invalid arguments.');
1141086aeeaae12517475c22695a200be45495516549Ben Murdoch    }
1142086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else {
1143086aeeaae12517475c22695a200be45495516549Ben Murdoch    throw new Error('Invalid arguments.');
1144086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
1145086aeeaae12517475c22695a200be45495516549Ben Murdoch
1146086aeeaae12517475c22695a200be45495516549Ben Murdoch  return request.toJSONProtocol();
1147086aeeaae12517475c22695a200be45495516549Ben Murdoch};
1148086aeeaae12517475c22695a200be45495516549Ben Murdoch
1149086aeeaae12517475c22695a200be45495516549Ben Murdoch
1150086aeeaae12517475c22695a200be45495516549Ben Murdoch// Create a JSON request for the disconnect command.
1151086aeeaae12517475c22695a200be45495516549Ben MurdochDebugRequest.prototype.disconnectCommandToJSONRequest_ = function(args) {
1152086aeeaae12517475c22695a200be45495516549Ben Murdoch  var request;
1153086aeeaae12517475c22695a200be45495516549Ben Murdoch  request = this.createRequest('disconnect');
1154086aeeaae12517475c22695a200be45495516549Ben Murdoch  return request.toJSONProtocol();
1155086aeeaae12517475c22695a200be45495516549Ben Murdoch};
1156086aeeaae12517475c22695a200be45495516549Ben Murdoch
1157086aeeaae12517475c22695a200be45495516549Ben Murdoch
1158086aeeaae12517475c22695a200be45495516549Ben Murdoch// Create a JSON request for the info command.
1159086aeeaae12517475c22695a200be45495516549Ben MurdochDebugRequest.prototype.infoCommandToJSONRequest_ = function(args) {
1160086aeeaae12517475c22695a200be45495516549Ben Murdoch  var request;
1161086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (args && (args == 'break' || args == 'br')) {
1162086aeeaae12517475c22695a200be45495516549Ben Murdoch    // Build a evaluate request from the text command.
1163086aeeaae12517475c22695a200be45495516549Ben Murdoch    request = this.createRequest('listbreakpoints');
1164086aeeaae12517475c22695a200be45495516549Ben Murdoch    last_cmd = 'info break';
1165086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else if (args && (args == 'locals' || args == 'lo')) {
1166086aeeaae12517475c22695a200be45495516549Ben Murdoch    // Build a evaluate request from the text command.
1167086aeeaae12517475c22695a200be45495516549Ben Murdoch    request = this.createRequest('frame');
1168086aeeaae12517475c22695a200be45495516549Ben Murdoch    last_cmd = 'info locals';
1169086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else if (args && (args == 'args' || args == 'ar')) {
1170086aeeaae12517475c22695a200be45495516549Ben Murdoch    // Build a evaluate request from the text command.
1171086aeeaae12517475c22695a200be45495516549Ben Murdoch    request = this.createRequest('frame');
1172086aeeaae12517475c22695a200be45495516549Ben Murdoch    last_cmd = 'info args';
1173e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else if (lol_is_enabled &&
1174e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch             args && (args == 'liveobjectlist' || args == 'lol')) {
1175e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Build a evaluate request from the text command.
1176e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return this.liveObjectListToJSONRequest_(null);
1177086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else {
1178086aeeaae12517475c22695a200be45495516549Ben Murdoch    throw new Error('Invalid info arguments.');
1179086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
1180086aeeaae12517475c22695a200be45495516549Ben Murdoch
1181086aeeaae12517475c22695a200be45495516549Ben Murdoch  return request.toJSONProtocol();
1182086aeeaae12517475c22695a200be45495516549Ben Murdoch};
1183086aeeaae12517475c22695a200be45495516549Ben Murdoch
1184086aeeaae12517475c22695a200be45495516549Ben Murdoch
1185086aeeaae12517475c22695a200be45495516549Ben MurdochDebugRequest.prototype.v8FlagsToJSONRequest_ = function(args) {
1186086aeeaae12517475c22695a200be45495516549Ben Murdoch  var request;
1187086aeeaae12517475c22695a200be45495516549Ben Murdoch  request = this.createRequest('v8flags');
1188086aeeaae12517475c22695a200be45495516549Ben Murdoch  request.arguments = {};
1189086aeeaae12517475c22695a200be45495516549Ben Murdoch  request.arguments.flags = args;
1190086aeeaae12517475c22695a200be45495516549Ben Murdoch  return request.toJSONProtocol();
1191086aeeaae12517475c22695a200be45495516549Ben Murdoch};
1192086aeeaae12517475c22695a200be45495516549Ben Murdoch
1193086aeeaae12517475c22695a200be45495516549Ben Murdoch
1194086aeeaae12517475c22695a200be45495516549Ben MurdochDebugRequest.prototype.gcToJSONRequest_ = function(args) {
1195086aeeaae12517475c22695a200be45495516549Ben Murdoch  var request;
1196086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!args) {
1197086aeeaae12517475c22695a200be45495516549Ben Murdoch    args = 'all';
1198086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
1199086aeeaae12517475c22695a200be45495516549Ben Murdoch  var args = args.split(/\s+/g);
1200086aeeaae12517475c22695a200be45495516549Ben Murdoch  var cmd = args[0];
1201086aeeaae12517475c22695a200be45495516549Ben Murdoch
1202086aeeaae12517475c22695a200be45495516549Ben Murdoch  switch(cmd) {
1203086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'all':
1204086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'quick':
1205086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'full':
1206086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'young':
1207086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'old':
1208086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'compact':
1209086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'sweep':
1210086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'scavenge': {
1211086aeeaae12517475c22695a200be45495516549Ben Murdoch      if (cmd == 'young') { cmd = 'quick'; }
1212086aeeaae12517475c22695a200be45495516549Ben Murdoch      else if (cmd == 'old') { cmd = 'full'; }
1213086aeeaae12517475c22695a200be45495516549Ben Murdoch
1214086aeeaae12517475c22695a200be45495516549Ben Murdoch      request = this.createRequest('gc');
1215086aeeaae12517475c22695a200be45495516549Ben Murdoch      request.arguments = {};
1216086aeeaae12517475c22695a200be45495516549Ben Murdoch      request.arguments.type = cmd;
1217086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
1218086aeeaae12517475c22695a200be45495516549Ben Murdoch    }
1219086aeeaae12517475c22695a200be45495516549Ben Murdoch      // Else fall thru to the default case below to report the error.
1220086aeeaae12517475c22695a200be45495516549Ben Murdoch    default:
1221086aeeaae12517475c22695a200be45495516549Ben Murdoch      throw new Error('Missing arguments after ' + cmd + '.');
1222086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
1223086aeeaae12517475c22695a200be45495516549Ben Murdoch  return request.toJSONProtocol();
1224086aeeaae12517475c22695a200be45495516549Ben Murdoch};
1225086aeeaae12517475c22695a200be45495516549Ben Murdoch
1226086aeeaae12517475c22695a200be45495516549Ben Murdoch
1227e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// Args: [v[erbose]] [<N>] [i[ndex] <i>] [t[ype] <type>] [sp[ace] <space>]
1228e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugRequest.prototype.lolMakeListRequest =
1229e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    function(cmd, args, first_arg_index, is_repeating) {
1230e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1231e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var request;
1232e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var start_index = 0;
1233e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var dump_limit = void 0;
1234e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var type_filter = void 0;
1235e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var space_filter = void 0;
1236e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var prop_filter = void 0;
1237e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var is_verbose = false;
1238e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var i;
1239e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1240e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  for (i = first_arg_index; i < args.length; i++) {
1241e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var arg = args[i];
1242e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Check for [v[erbose]]:
1243e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (arg === 'verbose' || arg === 'v') {
1244e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      // Nothing to do.  This is already implied by args.length > 3.
1245e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      is_verbose = true;
1246e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1247e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Check for [<N>]:
1248e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    } else if (arg.match(/^[0-9]+$/)) {
1249e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      dump_limit = arg;
1250e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      is_verbose = true;
1251e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1252e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Check for i[ndex] <i>:
1253e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    } else if (arg === 'index' || arg === 'i') {
1254e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      i++;
1255e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (args.length < i) {
1256e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        throw new Error('Missing index after ' + arg + '.');
1257e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      }
1258e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      start_index = parseInt(args[i]);
1259e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      // The user input start index starts at 1:
1260e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (start_index <= 0) {
126169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        throw new Error('Invalid index ' + args[i] + '.');
1262e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      }
1263e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      start_index -= 1;
1264e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      is_verbose = true;
1265e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1266e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Check for t[ype] <type>:
1267e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    } else if (arg === 'type' || arg === 't') {
1268e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      i++;
1269e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (args.length < i) {
1270e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        throw new Error('Missing type after ' + arg + '.');
1271e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      }
1272e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      type_filter = args[i];
1273e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1274e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Check for space <heap space name>:
1275e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    } else if (arg === 'space' || arg === 'sp') {
1276e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      i++;
1277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (args.length < i) {
1278e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        throw new Error('Missing space name after ' + arg + '.');
1279e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      }
1280e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      space_filter = args[i];
1281e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1282e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Check for property <prop name>:
1283e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    } else if (arg === 'property' || arg === 'prop') {
1284e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      i++;
1285e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (args.length < i) {
1286e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        throw new Error('Missing property name after ' + arg + '.');
1287e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      }
1288e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      prop_filter = args[i];
1289e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1290e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    } else {
1291e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      throw new Error('Unknown args at ' + arg + '.');
1292e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1293e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1294e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1295e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // Build the verbose request:
1296e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (is_verbose) {
1297e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    request = this.createLOLRequest('lol-'+cmd,
1298e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                    start_index,
1299e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                    dump_limit,
1300e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                    is_repeating);
1301e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    request.arguments.verbose = true;
1302e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else {
1303e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    request = this.createRequest('lol-'+cmd);
1304e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    request.arguments = {};
1305e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1306e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1307e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  request.arguments.filter = {};
1308e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (type_filter) {
1309e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    request.arguments.filter.type = type_filter;
1310e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1311e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (space_filter) {
1312e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    request.arguments.filter.space = space_filter;
1313e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1314e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (prop_filter) {
1315e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    request.arguments.filter.prop = prop_filter;
1316e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1317e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1318e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return request;
13193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1320e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1321e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1322e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochfunction extractObjId(args) {
1323e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var id = args;
1324e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  id = id.match(/^@([0-9]+)$/);
1325e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (id) {
1326e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    id = id[1];
1327e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else {
1328e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    throw new Error('Invalid obj id ' + args + '.');
1329e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1330e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return parseInt(id);
1331e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1332e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1333e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1334e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugRequest.prototype.lolToJSONRequest_ = function(args, is_repeating) {
1335e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var request;
1336e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // Use default command if one is not specified:
1337e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (!args) {
1338e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    args = 'info';
1339e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1340e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1341e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var orig_args = args;
1342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var first_arg_index;
1343e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1344e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var arg, i;
1345e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var args = args.split(/\s+/g);
1346e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var cmd = args[0];
1347e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var id;
1348e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1349e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // Command: <id> [v[erbose]] ...
1350e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (cmd.match(/^[0-9]+$/)) {
1351e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Convert to the padded list command:
1352e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Command: l[ist] <dummy> <id> [v[erbose]] ...
1353e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1354e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Insert the implicit 'list' in front and process as normal:
1355e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    cmd = 'list';
1356e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    args.unshift(cmd);
1357e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1358e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1359e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  switch(cmd) {
1360e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Command: c[apture]
1361e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'capture':
1362e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'c':
1363e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      request = this.createRequest('lol-capture');
1364e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      break;
1365e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1366e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Command: clear|d[elete] <id>|all
1367e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'clear':
1368e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'delete':
1369e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'del': {
1370e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (args.length < 2) {
1371e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        throw new Error('Missing argument after ' + cmd + '.');
1372e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      } else if (args.length > 2) {
1373e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        throw new Error('Too many arguments after ' + cmd + '.');
1374e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      }
1375e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      id = args[1];
1376e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (id.match(/^[0-9]+$/)) {
1377e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        // Delete a specific lol record:
1378e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        request = this.createRequest('lol-delete');
1379e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        request.arguments = {};
1380e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        request.arguments.id = parseInt(id);
1381e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      } else if (id === 'all') {
1382e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        // Delete all:
1383e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        request = this.createRequest('lol-reset');
1384e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      } else {
1385e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        throw new Error('Invalid argument after ' + cmd + '.');
1386e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      }
1387e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      break;
1388e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1389e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1390e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Command: diff <id1> <id2> [<dump options>]
1391e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'diff':
1392e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      first_arg_index = 3;
1393e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1394e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Command: list <dummy> <id> [<dump options>]
1395e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'list':
1396e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1397e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Command: ret[ainers] <obj id> [<dump options>]
1398e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'retainers':
1399e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'ret':
1400e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'retaining-paths':
1401e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'rp': {
1402e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (cmd === 'ret') cmd = 'retainers';
1403e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      else if (cmd === 'rp') cmd = 'retaining-paths';
1404e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1405e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (!first_arg_index) first_arg_index = 2;
1406e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1407e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (args.length < first_arg_index) {
1408e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        throw new Error('Too few arguments after ' + cmd + '.');
1409e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      }
1410e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1411e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      var request_cmd = (cmd === 'list') ? 'diff':cmd;
1412e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      request = this.lolMakeListRequest(request_cmd,
1413e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                        args,
1414e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                        first_arg_index,
1415e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                        is_repeating);
1416e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1417e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (cmd === 'diff') {
1418e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        request.arguments.id1 = parseInt(args[1]);
1419e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        request.arguments.id2 = parseInt(args[2]);
1420e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      } else if (cmd == 'list') {
1421e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        request.arguments.id1 = 0;
1422e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        request.arguments.id2 = parseInt(args[1]);
1423e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      } else {
1424e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        request.arguments.id = extractObjId(args[1]);
1425e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      }
1426e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      break;
1427e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1428e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1429e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Command: getid
1430e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'getid': {
1431e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      request = this.createRequest('lol-getid');
1432e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      request.arguments = {};
1433e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      request.arguments.address = args[1];
1434e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      break;
1435e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1436e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1437e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Command: inf[o] [<N>]
1438e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'info':
1439e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'inf': {
1440e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (args.length > 2) {
1441e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        throw new Error('Too many arguments after ' + cmd + '.');
1442e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      }
1443e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      // Built the info request:
1444e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      request = this.createLOLRequest('lol-info', 0, args[1], is_repeating);
1445e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      break;
1446e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1447e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1448e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Command: path <obj id 1> <obj id 2>
1449e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'path': {
1450e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      request = this.createRequest('lol-path');
1451e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      request.arguments = {};
1452e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (args.length > 2) {
1453e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        request.arguments.id1 = extractObjId(args[1]);
1454e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        request.arguments.id2 = extractObjId(args[2]);
1455e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      } else {
1456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        request.arguments.id1 = 0;
1457e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        request.arguments.id2 = extractObjId(args[1]);
1458e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      }
1459e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      break;
1460e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1461e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1462e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Command: print
1463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'print': {
1464e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      request = this.createRequest('lol-print');
1465e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      request.arguments = {};
1466e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      request.arguments.id = extractObjId(args[1]);
1467e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      break;
1468e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1469e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1470e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Command: reset
1471e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case 'reset': {
1472e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      request = this.createRequest('lol-reset');
1473e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      break;
1474e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1475e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    default:
1477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      throw new Error('Invalid arguments.');
1478e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1479e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return request.toJSONProtocol();
1480e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
1481e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1482e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the threads command.
1484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.threadsCommandToJSONRequest_ = function(args) {
1485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a threads request from the text command.
1486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('threads');
1487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
1488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
1489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Handle the trace command.
1492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.traceCommand_ = function(args) {
1493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Process arguments.
1494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args && args.length > 0) {
1495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (args == 'compile') {
1496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      trace_compile = !trace_compile;
1497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      print('Tracing of compiled scripts ' + (trace_compile ? 'on' : 'off'));
1498086aeeaae12517475c22695a200be45495516549Ben Murdoch    } else if (args === 'debug json' || args === 'json' || args === 'packets') {
1499086aeeaae12517475c22695a200be45495516549Ben Murdoch      trace_debug_json = !trace_debug_json;
1500086aeeaae12517475c22695a200be45495516549Ben Murdoch      print('Tracing of debug json packets ' +
1501086aeeaae12517475c22695a200be45495516549Ben Murdoch            (trace_debug_json ? 'on' : 'off'));
1502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
1503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      throw new Error('Invalid trace arguments.');
1504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Invalid trace arguments.');
1507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
15083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Handle the help command.
1511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.helpCommand_ = function(args) {
1512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Help os quite simple.
1513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args && args.length > 0) {
1514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    print('warning: arguments to \'help\' are ignored');
1515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1517086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('Note: <> denotes symbollic values to be replaced with real values.');
1518086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('Note: [] denotes optional parts of commands, or optional options / arguments.');
1519086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('      e.g. d[elete] - you get the same command if you type d or delete.');
1520086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1521086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('[break] - break as soon as possible');
1522086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('b[reak] location [condition]');
1523086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('        - break on named function: location is a function name');
1524086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('        - break on function: location is #<id>#');
1525086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('        - break on script position: location is name:line[:column]');
1526086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1527086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('clear <breakpoint #>       - deletes the specified user defined breakpoint');
1528086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('d[elete]  <breakpoint #>   - deletes the specified user defined breakpoint');
1529086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('dis[able] <breakpoint #>   - disables the specified user defined breakpoint');
1530086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('dis[able] exc[eptions] [[all] | unc[aught]]');
1531086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('                           - disables breaking on exceptions');
1532086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('en[able]  <breakpoint #>   - enables the specified user defined breakpoint');
1533086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('en[able]  exc[eptions] [[all] | unc[aught]]');
1534086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('                           - enables breaking on exceptions');
1535086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1536086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('b[ack]t[race] [n] | [-n] | [from to]');
1537086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('                           - prints the stack back trace');
1538086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('f[rame]                    - prints info about the current frame context');
1539086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('f[rame] <frame #>          - set context to specified frame #');
1540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  print('scopes');
1541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  print('scope <scope #>');
1542086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1543086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('up                         - set context to caller of current frame');
1544086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('do[wn]                     - set context to callee of current frame');
1545086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('inf[o] br[eak]             - prints info about breakpoints in use');
1546086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('inf[o] ar[gs]              - prints info about arguments of the current function');
1547086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('inf[o] lo[cals]            - prints info about locals in the current function');
1548086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('inf[o] liveobjectlist|lol  - same as \'lol info\'');
1549086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  print('step [in | next | out| min [step count]]');
1551086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('c[ontinue]                 - continue executing after a breakpoint');
1552086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('s[tep]   [<N>]             - step into the next N callees (default N is 1)');
1553086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('s[tep]i  [<N>]             - step into the next N callees (default N is 1)');
1554086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('n[ext]   [<N>]             - step over the next N callees (default N is 1)');
1555086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('fin[ish] [<N>]             - step out of N frames (default N is 1)');
1556086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1557086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('p[rint] <expression>       - prints the result of the specified expression');
1558086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('dir <expression>           - prints the object structure of the result');
1559086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('set <var> = <expression>   - executes the specified statement');
1560086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1561086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('l[ist]                     - list the source code around for the current pc');
1562086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('l[ist] [- | <start>,<end>] - list the specified range of source code');
1563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  print('source [from line [num lines]]');
1564086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('scr[ipts] [native|extensions|all]');
1565086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('scr[ipts] [<filter text>]  - list scripts with the specified text in its description');
1566086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1567086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('gc                         - runs the garbage collector');
1568086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1569e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1570e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (lol_is_enabled) {
1571e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('liveobjectlist|lol <command> - live object list tracking.');
1572e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('  where <command> can be:');
1573e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('  c[apture]               - captures a LOL list.');
1574e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('  clear|del[ete] <id>|all - clears LOL of id <id>.');
1575e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('                            If \'all\' is unspecified instead, will clear all.');
1576e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('  diff <id1> <id2> [<dump options>]');
1577e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('                          - prints the diff between LOLs id1 and id2.');
1578e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('                          - also see <dump options> below.');
1579e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('  getid <address>         - gets the obj id for the specified address if available.');
1580e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('                            The address must be in hex form prefixed with 0x.');
1581e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('  inf[o] [<N>]            - lists summary info of all LOL lists.');
1582e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('                            If N is specified, will print N items at a time.');
1583e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('  [l[ist]] <id> [<dump options>]');
1584e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('                          - prints the listing of objects in LOL id.');
1585e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('                          - also see <dump options> below.');
1586e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('  reset                   - clears all LOL lists.');
1587e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('  ret[ainers] <id> [<dump options>]');
1588e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('                          - prints the list of retainers of obj id.');
1589e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('                          - also see <dump options> below.');
1590e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('  path <id1> <id2>        - prints the retaining path from obj id1 to id2.');
1591e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('                            If only one id is specified, will print the path from');
1592e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('                            roots to the specified object if available.');
1593e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('  print <id>              - prints the obj for the specified obj id if available.');
1594e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('');
1595e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('  <dump options> includes:');
1596e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('     [v[erbose]]            - do verbose dump.');
1597e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('     [<N>]                  - dump N items at a time.  Implies verbose dump.');
1598e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('                             If unspecified, N will default to '+
1599e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch          kDefaultLolLinesToPrintAtATime+'.  Max N is '+
1600e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch          kMaxLolLinesToPrintAtATime+'.');
1601e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('     [i[ndex] <i>]          - start dump from index i.  Implies verbose dump.');
1602e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('     [t[ype] <type>]        - filter by type.');
1603e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('     [sp[ace] <space name>] - filter by heap space where <space name> is one of');
1604e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('                              { cell, code, lo, map, new, old-data, old-pointer }.');
1605e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('');
1606e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('     If the verbose option, or an option that implies a verbose dump');
1607e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('     is specified, then a verbose dump will requested.  Else, a summary dump');
1608e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('     will be requested.');
1609e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    print('');
1610e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1611e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  print('trace compile');
1613086aeeaae12517475c22695a200be45495516549Ben Murdoch  // hidden command: trace debug json - toggles tracing of debug json packets
1614086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1615086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('disconnect|exit|quit       - disconnects and quits the debugger');
1616086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('help                       - prints this help information');
16173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction formatHandleReference_(value) {
1621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (value.handle() >= 0) {
1622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return '#' + value.handle() + '#';
1623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return '#Transient#';
1625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction formatObject_(value, include_properties) {
1630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var result = '';
1631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += formatHandleReference_(value);
16323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  result += ', type: object';
1633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += ', constructor ';
1634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var ctor = value.constructorFunctionValue();
1635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += formatHandleReference_(ctor);
1636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += ', __proto__ ';
1637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var proto = value.protoObjectValue();
1638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += formatHandleReference_(proto);
1639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += ', ';
1640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += value.propertyCount();
1641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result +=  ' properties.';
1642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (include_properties) {
1643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    result +=  '\n';
1644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (var i = 0; i < value.propertyCount(); i++) {
1645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '  ';
1646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += value.propertyName(i);
1647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += ': ';
1648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var property_value = value.propertyValue(i);
1649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (property_value instanceof ProtocolReference) {
1650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += '<no type>';
1651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      } else {
1652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (property_value && property_value.type()) {
1653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += property_value.type();
1654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        } else {
1655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += '<no type>';
1656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
1657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
1658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += ' ';
1659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += formatHandleReference_(property_value);
1660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '\n';
1661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
1664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction formatScope_(scope) {
1668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var result = '';
1669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var index = scope.index;
1670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += '#' + (index <= 9 ? '0' : '') + index;
1671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += ' ';
1672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (scope.type) {
1673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case Debug.ScopeType.Global:
1674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += 'Global, ';
1675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '#' + scope.object.ref + '#';
1676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case Debug.ScopeType.Local:
1678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += 'Local';
1679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case Debug.ScopeType.With:
1681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += 'With, ';
1682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '#' + scope.object.ref + '#';
1683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case Debug.ScopeType.Catch:
1685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += 'Catch, ';
1686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '#' + scope.object.ref + '#';
1687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case Debug.ScopeType.Closure:
1689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += 'Closure';
1690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
1692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += 'UNKNOWN';
1693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
1695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1698086aeeaae12517475c22695a200be45495516549Ben Murdochfunction refObjectToString_(protocolPackage, handle) {
1699086aeeaae12517475c22695a200be45495516549Ben Murdoch  var value = protocolPackage.lookup(handle);
1700086aeeaae12517475c22695a200be45495516549Ben Murdoch  var result = '';
1701086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (value.isString()) {
1702086aeeaae12517475c22695a200be45495516549Ben Murdoch    result = '"' + value.value() + '"';
1703086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else if (value.isPrimitive()) {
1704086aeeaae12517475c22695a200be45495516549Ben Murdoch    result = value.valueString();
1705086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else if (value.isObject()) {
1706086aeeaae12517475c22695a200be45495516549Ben Murdoch    result += formatObject_(value, true);
1707086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
1708086aeeaae12517475c22695a200be45495516549Ben Murdoch  return result;
1709086aeeaae12517475c22695a200be45495516549Ben Murdoch}
1710086aeeaae12517475c22695a200be45495516549Ben Murdoch
1711086aeeaae12517475c22695a200be45495516549Ben Murdoch
1712e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochfunction decodeLolCaptureResponse(body) {
1713e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var result;
1714e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  result = 'Captured live object list '+ body.id +
1715e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch           ': count '+ body.count + ' size ' + body.size;
1716e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return result;
1717e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1718e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1719e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1720e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochfunction decodeLolDeleteResponse(body) {
1721e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var result;
1722e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  result = 'Deleted live object list '+ body.id;
1723e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return result;
1724e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1725e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1726e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1727e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochfunction digitsIn(value) {
1728e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var digits = 0;
1729e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (value === 0) value = 1;
1730e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  while (value >= 1) {
1731e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    digits++;
1732e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    value /= 10;
1733e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1734e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return digits;
1735e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1736e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1737e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1738e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochfunction padding(value, max_digits) {
1739e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var padding_digits = max_digits - digitsIn(value);
1740e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var padding = '';
1741e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  while (padding_digits > 0) {
1742e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    padding += ' ';
1743e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    padding_digits--;
1744e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1745e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return padding;
1746e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1747e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1748e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1749e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochfunction decodeLolInfoResponse(body) {
1750e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var result;
1751e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var lists = body.lists;
1752e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var length = lists.length;
1753e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var first_index = body.first_index + 1;
1754e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var has_more = ((first_index + length) <= body.count);
1755e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  result = 'captured live object lists';
1756e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (has_more || (first_index != 1)) {
1757e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    result += ' ['+ length +' of '+ body.count +
1758e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch              ': starting from '+ first_index +']';
1759e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1760e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  result += ':\n';
1761e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var max_digits = digitsIn(body.count);
1762e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var last_count = 0;
1763e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var last_size = 0;
1764e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  for (var i = 0; i < length; i++) {
1765e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var entry = lists[i];
1766e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var count = entry.count;
1767e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var size = entry.size;
1768e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var index = first_index + i;
1769e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    result += '  [' + padding(index, max_digits) + index + '] id '+ entry.id +
1770e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch              ': count '+ count;
1771e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (last_count > 0) {
1772e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      result += '(+' + (count - last_count) + ')';
1773e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1774e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    result += ' size '+ size;
1775e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (last_size > 0) {
1776e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      result += '(+' + (size - last_size) + ')';
1777e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1778e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    result += '\n';
1779e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    last_count = count;
1780e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    last_size = size;
1781e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1782e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  result += '  total: '+length+' lists\n';
1783e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (has_more) {
1784e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    result += '  -- press <enter> for more --\n';
1785e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else {
1786e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    repeat_cmd_line = '';
1787e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1788e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (length === 0) result += '  none\n';
1789e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1790e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return result;
1791e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1792e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1793e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1794e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochfunction decodeLolListResponse(body, title) {
1795589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
1796e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var result;
1797e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var total_count = body.count;
1798e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var total_size = body.size;
1799e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var length;
1800e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var max_digits;
1801e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var i;
1802e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var entry;
1803e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var index;
1804e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1805e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var max_count_digits = digitsIn(total_count);
1806e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var max_size_digits;
1807e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1808e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var summary = body.summary;
1809e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (summary) {
1810e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1811e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var roots_count = 0;
1812e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var found_root = body.found_root || 0;
1813e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var found_weak_root = body.found_weak_root || 0;
1814e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1815e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Print the summary result:
1816e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    result = 'summary of objects:\n';
1817e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    length = summary.length;
1818e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (found_root !== 0) {
1819e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      roots_count++;
1820e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1821e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (found_weak_root !== 0) {
1822e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      roots_count++;
1823e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1824e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    max_digits = digitsIn(length + roots_count);
1825e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    max_size_digits = digitsIn(total_size);
1826e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1827e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    index = 1;
1828e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (found_root !== 0) {
1829e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      result += '  [' + padding(index, max_digits) + index + '] ' +
1830e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                ' count '+ 1 + padding(0, max_count_digits) +
1831e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                '      '+ padding(0, max_size_digits+1) +
1832e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                ' : <root>\n';
1833e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      index++;
1834e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1835e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (found_weak_root !== 0) {
1836e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      result += '  [' + padding(index, max_digits) + index + '] ' +
1837e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                ' count '+ 1 + padding(0, max_count_digits) +
1838e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                '      '+ padding(0, max_size_digits+1) +
1839e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                ' : <weak root>\n';
1840e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      index++;
1841e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1842e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1843e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    for (i = 0; i < length; i++) {
1844e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      entry = summary[i];
1845e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      var count = entry.count;
1846e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      var size = entry.size;
1847e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      result += '  [' + padding(index, max_digits) + index + '] ' +
1848e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                ' count '+ count + padding(count, max_count_digits) +
1849e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                ' size '+ size + padding(size, max_size_digits) +
1850e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                ' : <' + entry.desc + '>\n';
1851e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      index++;
1852e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1853e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    result += '\n  total count: '+(total_count+roots_count)+'\n';
1854e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (body.size) {
1855e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      result += '  total size:  '+body.size+'\n';
1856e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1857e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1858e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else {
1859e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Print the full dump result:
1860e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var first_index = body.first_index + 1;
1861e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var elements = body.elements;
1862e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    length = elements.length;
1863e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var has_more = ((first_index + length) <= total_count);
1864e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    result = title;
1865e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (has_more || (first_index != 1)) {
1866e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      result += ' ['+ length +' of '+ total_count +
1867e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                ': starting from '+ first_index +']';
1868e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1869e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    result += ':\n';
1870e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (length === 0) result += '  none\n';
1871e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    max_digits = digitsIn(length);
1872e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1873e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var max_id = 0;
1874e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var max_size = 0;
1875e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    for (i = 0; i < length; i++) {
1876e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      entry = elements[i];
1877e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (entry.id > max_id) max_id = entry.id;
1878e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (entry.size > max_size) max_size = entry.size;
1879e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1880e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    var max_id_digits = digitsIn(max_id);
1881e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    max_size_digits = digitsIn(max_size);
1882e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1883e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    for (i = 0; i < length; i++) {
1884e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      entry = elements[i];
1885e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      index = first_index + i;
1886e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      result += '  ['+ padding(index, max_digits) + index +']';
1887e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      if (entry.id !== 0) {
1888e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        result += ' @' + entry.id + padding(entry.id, max_id_digits) +
1889e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                  ': size ' + entry.size + ', ' +
1890e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                  padding(entry.size, max_size_digits) +  entry.desc + '\n';
1891e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      } else {
1892e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        // Must be a root or weak root:
1893e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        result += ' ' + entry.desc + '\n';
1894e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      }
1895e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1896e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (has_more) {
1897e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      result += '  -- press <enter> for more --\n';
1898e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    } else {
1899e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      repeat_cmd_line = '';
1900e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1901e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (length === 0) result += '  none\n';
1902e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1903e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1904e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return result;
1905e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1906e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1907e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1908e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochfunction decodeLolDiffResponse(body) {
1909e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var title = 'objects';
1910e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return decodeLolListResponse(body, title);
1911e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1912e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1913e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1914e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochfunction decodeLolRetainersResponse(body) {
1915e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  var title = 'retainers for @' + body.id;
1916e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return decodeLolListResponse(body, title);
1917e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1918e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1919e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1920e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochfunction decodeLolPathResponse(body) {
1921e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return body.path;
1922e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1923e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1924e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1925e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochfunction decodeLolResetResponse(body) {
1926e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return 'Reset all live object lists.';
1927e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1928e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1929e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1930e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochfunction decodeLolGetIdResponse(body) {
1931e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (body.id == 0) {
1932e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return 'Address is invalid, or object has been moved or collected';
1933e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1934e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return 'obj id is @' + body.id;
1935e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1936e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1937e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1938e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochfunction decodeLolPrintResponse(body) {
1939e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return body.dump;
1940e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1941e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1942e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1943086aeeaae12517475c22695a200be45495516549Ben Murdoch// Rounds number 'num' to 'length' decimal places.
1944086aeeaae12517475c22695a200be45495516549Ben Murdochfunction roundNumber(num, length) {
1945086aeeaae12517475c22695a200be45495516549Ben Murdoch  var factor = Math.pow(10, length);
1946086aeeaae12517475c22695a200be45495516549Ben Murdoch  return Math.round(num * factor) / factor;
1947086aeeaae12517475c22695a200be45495516549Ben Murdoch}
1948086aeeaae12517475c22695a200be45495516549Ben Murdoch
1949086aeeaae12517475c22695a200be45495516549Ben Murdoch
1950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Convert a JSON response to text for display in a text based debugger.
1951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction DebugResponseDetails(response) {
19523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var details = { text: '', running: false };
1953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  try {
1955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (!response.success()) {
1956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      details.text = response.message();
1957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return details;
1958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Get the running state.
1961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    details.running = response.running();
1962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var body = response.body();
1964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var result = '';
1965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    switch (response.command()) {
19666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      case 'suspend':
19676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block        details.text = 'stopped';
19686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block        break;
1969f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
1970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'setbreakpoint':
1971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result = 'set breakpoint #';
1972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += body.breakpoint;
1973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
1974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
19756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'clearbreakpoint':
1977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result = 'cleared breakpoint #';
1978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += body.breakpoint;
1979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
1980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
1981f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
1982086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'changebreakpoint':
1983086aeeaae12517475c22695a200be45495516549Ben Murdoch        result = 'successfully changed breakpoint';
1984086aeeaae12517475c22695a200be45495516549Ben Murdoch        details.text = result;
1985086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
1986086aeeaae12517475c22695a200be45495516549Ben Murdoch
198725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen      case 'listbreakpoints':
198825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen        result = 'breakpoints: (' + body.breakpoints.length + ')';
198925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen        for (var i = 0; i < body.breakpoints.length; i++) {
199025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          var breakpoint = body.breakpoints[i];
199125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          result += '\n id=' + breakpoint.number;
199225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          result += ' type=' + breakpoint.type;
199325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          if (breakpoint.script_id) {
199425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen              result += ' script_id=' + breakpoint.script_id;
199525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          }
199625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          if (breakpoint.script_name) {
199725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen              result += ' script_name=' + breakpoint.script_name;
199825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          }
19993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          if (breakpoint.script_regexp) {
20003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch              result += ' script_regexp=' + breakpoint.script_regexp;
20013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          }
2002086aeeaae12517475c22695a200be45495516549Ben Murdoch          result += ' line=' + (breakpoint.line + 1);
200325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          if (breakpoint.column != null) {
2004086aeeaae12517475c22695a200be45495516549Ben Murdoch            result += ' column=' + (breakpoint.column + 1);
200525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          }
200625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          if (breakpoint.groupId) {
200725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen            result += ' groupId=' + breakpoint.groupId;
200825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          }
200925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          if (breakpoint.ignoreCount) {
201025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen              result += ' ignoreCount=' + breakpoint.ignoreCount;
201125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          }
201225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          if (breakpoint.active === false) {
201325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen            result += ' inactive';
201425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          }
201525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          if (breakpoint.condition) {
201625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen            result += ' condition=' + breakpoint.condition;
201725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          }
201825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          result += ' hit_count=' + breakpoint.hit_count;
201925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen        }
2020086aeeaae12517475c22695a200be45495516549Ben Murdoch        if (body.breakpoints.length === 0) {
2021086aeeaae12517475c22695a200be45495516549Ben Murdoch          result = "No user defined breakpoints\n";
2022086aeeaae12517475c22695a200be45495516549Ben Murdoch        } else {
2023086aeeaae12517475c22695a200be45495516549Ben Murdoch          result += '\n';
2024086aeeaae12517475c22695a200be45495516549Ben Murdoch        }
2025086aeeaae12517475c22695a200be45495516549Ben Murdoch        if (body.breakOnExceptions) {
2026086aeeaae12517475c22695a200be45495516549Ben Murdoch          result += '* breaking on ALL exceptions is enabled\n';
2027086aeeaae12517475c22695a200be45495516549Ben Murdoch        } else if (body.breakOnUncaughtExceptions) {
2028086aeeaae12517475c22695a200be45495516549Ben Murdoch          result += '* breaking on UNCAUGHT exceptions is enabled\n';
2029086aeeaae12517475c22695a200be45495516549Ben Murdoch        } else {
203069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch          result += '* all exception breakpoints are disabled\n';
2031086aeeaae12517475c22695a200be45495516549Ben Murdoch        }
2032086aeeaae12517475c22695a200be45495516549Ben Murdoch        details.text = result;
2033086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
2034086aeeaae12517475c22695a200be45495516549Ben Murdoch
2035086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'setexceptionbreak':
2036086aeeaae12517475c22695a200be45495516549Ben Murdoch        result = 'Break on ' + body.type + ' exceptions: ';
2037086aeeaae12517475c22695a200be45495516549Ben Murdoch        result += body.enabled ? 'enabled' : 'disabled';
203825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen        details.text = result;
203925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen        break;
20406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'backtrace':
2042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (body.totalFrames == 0) {
2043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result = '(empty stack)';
2044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        } else {
2045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          var result = 'Frames #' + body.fromFrame + ' to #' +
2046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              (body.toFrame - 1) + ' of ' + body.totalFrames + '\n';
2047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          for (i = 0; i < body.frames.length; i++) {
2048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            if (i != 0) result += '\n';
2049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += body.frames[i].text;
2050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
2051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
2052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
2053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
20546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'frame':
2056086aeeaae12517475c22695a200be45495516549Ben Murdoch        if (last_cmd === 'info locals') {
2057086aeeaae12517475c22695a200be45495516549Ben Murdoch          var locals = body.locals;
2058086aeeaae12517475c22695a200be45495516549Ben Murdoch          if (locals.length === 0) {
2059086aeeaae12517475c22695a200be45495516549Ben Murdoch            result = 'No locals';
2060086aeeaae12517475c22695a200be45495516549Ben Murdoch          } else {
2061086aeeaae12517475c22695a200be45495516549Ben Murdoch            for (var i = 0; i < locals.length; i++) {
2062086aeeaae12517475c22695a200be45495516549Ben Murdoch              var local = locals[i];
2063086aeeaae12517475c22695a200be45495516549Ben Murdoch              result += local.name + ' = ';
2064086aeeaae12517475c22695a200be45495516549Ben Murdoch              result += refObjectToString_(response, local.value.ref);
2065086aeeaae12517475c22695a200be45495516549Ben Murdoch              result += '\n';
2066086aeeaae12517475c22695a200be45495516549Ben Murdoch            }
2067086aeeaae12517475c22695a200be45495516549Ben Murdoch          }
2068086aeeaae12517475c22695a200be45495516549Ben Murdoch        } else if (last_cmd === 'info args') {
2069086aeeaae12517475c22695a200be45495516549Ben Murdoch          var args = body.arguments;
2070086aeeaae12517475c22695a200be45495516549Ben Murdoch          if (args.length === 0) {
2071086aeeaae12517475c22695a200be45495516549Ben Murdoch            result = 'No arguments';
2072086aeeaae12517475c22695a200be45495516549Ben Murdoch          } else {
2073086aeeaae12517475c22695a200be45495516549Ben Murdoch            for (var i = 0; i < args.length; i++) {
2074086aeeaae12517475c22695a200be45495516549Ben Murdoch              var arg = args[i];
2075086aeeaae12517475c22695a200be45495516549Ben Murdoch              result += arg.name + ' = ';
2076086aeeaae12517475c22695a200be45495516549Ben Murdoch              result += refObjectToString_(response, arg.value.ref);
2077086aeeaae12517475c22695a200be45495516549Ben Murdoch              result += '\n';
2078086aeeaae12517475c22695a200be45495516549Ben Murdoch            }
2079086aeeaae12517475c22695a200be45495516549Ben Murdoch          }
2080086aeeaae12517475c22695a200be45495516549Ben Murdoch        } else {
2081086aeeaae12517475c22695a200be45495516549Ben Murdoch          result = SourceUnderline(body.sourceLineText,
2082086aeeaae12517475c22695a200be45495516549Ben Murdoch                                   body.column);
2083086aeeaae12517475c22695a200be45495516549Ben Murdoch          Debug.State.currentSourceLine = body.line;
2084086aeeaae12517475c22695a200be45495516549Ben Murdoch          Debug.State.currentFrame = body.index;
2085086aeeaae12517475c22695a200be45495516549Ben Murdoch          Debug.State.displaySourceStartLine = -1;
2086086aeeaae12517475c22695a200be45495516549Ben Murdoch          Debug.State.displaySourceEndLine = -1;
2087086aeeaae12517475c22695a200be45495516549Ben Murdoch        }
2088086aeeaae12517475c22695a200be45495516549Ben Murdoch        details.text = result;
2089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
20906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'scopes':
2092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (body.totalScopes == 0) {
2093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result = '(no scopes)';
2094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        } else {
2095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result = 'Scopes #' + body.fromScope + ' to #' +
2096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   (body.toScope - 1) + ' of ' + body.totalScopes + '\n';
2097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          for (i = 0; i < body.scopes.length; i++) {
2098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            if (i != 0) {
2099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += '\n';
2100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            }
2101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += formatScope_(body.scopes[i]);
2102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
2103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
2104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
2105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
2106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'scope':
2108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += formatScope_(body);
2109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += '\n';
2110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var scope_object_value = response.lookup(body.object.ref);
2111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += formatObject_(scope_object_value, true);
2112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
2113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
21146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'evaluate':
2116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'lookup':
2117e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case 'getobj':
2118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (last_cmd == 'p' || last_cmd == 'print') {
2119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result = body.text;
2120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        } else {
2121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          var value;
2122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (lookup_handle) {
2123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            value = response.bodyValue(lookup_handle);
2124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          } else {
2125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            value = response.bodyValue();
2126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
2127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (value.isObject()) {
2128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += formatObject_(value, true);
2129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          } else {
2130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += 'type: ';
2131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += value.type();
2132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            if (!value.isUndefined() && !value.isNull()) {
2133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += ', ';
2134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              if (value.isString()) {
2135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                result += '"';
2136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              }
2137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += value.value();
2138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              if (value.isString()) {
2139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                result += '"';
2140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              }
2141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            }
2142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += '\n';
2143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
2144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
2145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
2146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
2147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'references':
2149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var count = body.length;
2150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += 'found ' + count + ' objects';
2151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += '\n';
2152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        for (var i = 0; i < count; i++) {
2153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          var value = response.bodyValue(i);
2154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += formatObject_(value, false);
2155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += '\n';
2156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
2157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
2158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
21596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'source':
2161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        // Get the source from the response.
2162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var source = body.source;
2163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var from_line = body.fromLine + 1;
2164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var lines = source.split('\n');
2165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var maxdigits = 1 + Math.floor(log10(from_line + lines.length));
2166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (maxdigits < 3) {
2167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          maxdigits = 3;
2168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
2169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var result = '';
2170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        for (var num = 0; num < lines.length; num++) {
2171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          // Check if there's an extra newline at the end.
2172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (num == (lines.length - 1) && lines[num].length == 0) {
2173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            break;
2174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
2175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          var current_line = from_line + num;
2177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          spacer = maxdigits - (1 + Math.floor(log10(current_line)));
2178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (current_line == Debug.State.currentSourceLine + 1) {
2179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            for (var i = 0; i < maxdigits; i++) {
2180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += '>';
2181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            }
2182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += '  ';
2183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          } else {
2184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            for (var i = 0; i < spacer; i++) {
2185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += ' ';
2186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            }
2187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += current_line + ': ';
2188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
2189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += lines[num];
2190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += '\n';
2191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
2192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
2193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
21946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'scripts':
2196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var result = '';
2197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        for (i = 0; i < body.length; i++) {
2198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (i != 0) result += '\n';
2199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (body[i].id) {
2200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += body[i].id;
2201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          } else {
2202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += '[no id]';
2203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
2204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += ', ';
2205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (body[i].name) {
2206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += body[i].name;
2207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          } else {
2208086aeeaae12517475c22695a200be45495516549Ben Murdoch            if (body[i].compilationType == Debug.ScriptCompilationType.Eval
2209086aeeaae12517475c22695a200be45495516549Ben Murdoch                && body[i].evalFromScript
2210086aeeaae12517475c22695a200be45495516549Ben Murdoch                ) {
2211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += 'eval from ';
2212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              var script_value = response.lookup(body[i].evalFromScript.ref);
2213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += ' ' + script_value.field('name');
2214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += ':' + (body[i].evalFromLocation.line + 1);
2215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += ':' + body[i].evalFromLocation.column;
2216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            } else if (body[i].compilationType ==
2217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                       Debug.ScriptCompilationType.JSON) {
2218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += 'JSON ';
2219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            } else {  // body[i].compilation == Debug.ScriptCompilationType.Host
2220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += '[unnamed] ';
2221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            }
2222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
2223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += ' (lines: ';
2224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += body[i].lineCount;
2225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += ', length: ';
2226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += body[i].sourceLength;
2227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (body[i].type == Debug.ScriptType.Native) {
2228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += ', native';
2229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          } else if (body[i].type == Debug.ScriptType.Extension) {
2230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += ', extension';
2231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
2232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += '), [';
2233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          var sourceStart = body[i].sourceStart;
2234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (sourceStart.length > 40) {
2235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            sourceStart = sourceStart.substring(0, 37) + '...';
2236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
2237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += sourceStart;
2238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += ']';
2239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
2240086aeeaae12517475c22695a200be45495516549Ben Murdoch        if (body.length == 0) {
2241086aeeaae12517475c22695a200be45495516549Ben Murdoch          result = "no matching scripts found";
2242086aeeaae12517475c22695a200be45495516549Ben Murdoch        }
2243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
2244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
2245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'threads':
2247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var result = 'Active V8 threads: ' + body.totalThreads + '\n';
2248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        body.threads.sort(function(a, b) { return a.id - b.id; });
2249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        for (i = 0; i < body.threads.length; i++) {
2250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += body.threads[i].current ? '*' : ' ';
2251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += ' ';
2252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += body.threads[i].id;
2253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += '\n';
2254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
2255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
2256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
2257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'continue':
2259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = "(running)";
2260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
22616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2262086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'v8flags':
2263086aeeaae12517475c22695a200be45495516549Ben Murdoch        details.text = "flags set";
2264086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
2265086aeeaae12517475c22695a200be45495516549Ben Murdoch
2266086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'gc':
2267086aeeaae12517475c22695a200be45495516549Ben Murdoch        details.text = "GC " + body.before + " => " + body.after;
2268086aeeaae12517475c22695a200be45495516549Ben Murdoch        if (body.after > (1024*1024)) {
2269086aeeaae12517475c22695a200be45495516549Ben Murdoch          details.text +=
2270086aeeaae12517475c22695a200be45495516549Ben Murdoch              " (" + roundNumber(body.before/(1024*1024), 1) + "M => " +
2271086aeeaae12517475c22695a200be45495516549Ben Murdoch                     roundNumber(body.after/(1024*1024), 1) + "M)";
2272086aeeaae12517475c22695a200be45495516549Ben Murdoch        } else if (body.after > 1024) {
2273086aeeaae12517475c22695a200be45495516549Ben Murdoch          details.text +=
2274086aeeaae12517475c22695a200be45495516549Ben Murdoch              " (" + roundNumber(body.before/1024, 1) + "K => " +
2275086aeeaae12517475c22695a200be45495516549Ben Murdoch                     roundNumber(body.after/1024, 1) + "K)";
2276086aeeaae12517475c22695a200be45495516549Ben Murdoch        }
2277086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
2278086aeeaae12517475c22695a200be45495516549Ben Murdoch
2279e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case 'lol-capture':
2280e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        details.text = decodeLolCaptureResponse(body);
2281e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        break;
2282e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case 'lol-delete':
2283e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        details.text = decodeLolDeleteResponse(body);
2284e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        break;
2285e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case 'lol-diff':
2286e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        details.text = decodeLolDiffResponse(body);
2287e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        break;
2288e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case 'lol-getid':
2289e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        details.text = decodeLolGetIdResponse(body);
2290e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        break;
2291e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case 'lol-info':
2292e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        details.text = decodeLolInfoResponse(body);
2293e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        break;
2294e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case 'lol-print':
2295e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        details.text = decodeLolPrintResponse(body);
2296e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        break;
2297e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case 'lol-reset':
2298e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        details.text = decodeLolResetResponse(body);
2299e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        break;
2300e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case 'lol-retainers':
2301e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        details.text = decodeLolRetainersResponse(body);
2302e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        break;
2303e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case 'lol-path':
2304e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        details.text = decodeLolPathResponse(body);
2305e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        break;
2306e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      default:
2308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text =
230925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen            'Response for unknown command \'' + response.command() + '\'' +
231025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen            ' (' + response.raw_json() + ')';
2311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
2312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } catch (e) {
2313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    details.text = 'Error: "' + e + '" formatting response';
2314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
23156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return details;
23173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Protocol packages send from the debugger.
2322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @param {string} json - raw protocol packet as JSON string.
2323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @constructor
2324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction ProtocolPackage(json) {
232625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  this.raw_json_ = json;
2327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.packet_ = JSON.parse(json);
2328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.refs_ = [];
2329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (this.packet_.refs) {
2330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (var i = 0; i < this.packet_.refs.length; i++) {
2331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.refs_[this.packet_.refs[i].handle] = this.packet_.refs[i];
2332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
2333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the packet type.
2339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {String} the packet type
2340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.type = function() {
2342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.type;
23433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the packet event.
2348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {Object} the packet event
2349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.event = function() {
2351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.event;
23523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the packet request sequence.
2357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {number} the packet request sequence
2358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.requestSeq = function() {
2360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.request_seq;
23613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the packet request sequence.
2366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {number} the packet request sequence
2367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.running = function() {
2369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.running ? true : false;
23703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.success = function() {
2374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.success ? true : false;
23753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.message = function() {
2379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.message;
23803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.command = function() {
2384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.command;
23853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.body = function() {
2389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.body;
23903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.bodyValue = function(index) {
2394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (index != null) {
2395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return new ProtocolValue(this.packet_.body[index], this);
2396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
2397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return new ProtocolValue(this.packet_.body, this);
2398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
23993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.body = function() {
2403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.body;
24043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.lookup = function(handle) {
2408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var value = this.refs_[handle];
2409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (value) {
2410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return new ProtocolValue(value, this);
2411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
2412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return new ProtocolReference(handle);
2413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
24143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
241725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian MonsenProtocolPackage.prototype.raw_json = function() {
241825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  return this.raw_json_;
24193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
242025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
242125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
2422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction ProtocolValue(value, packet) {
2423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.value_ = value;
2424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.packet_ = packet;
2425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the value type.
2430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {String} the value type
2431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.type = function() {
2433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.type;
24343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
24386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * Get a metadata field from a protocol value.
2439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {Object} the metadata field value
2440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.field = function(name) {
2442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_[name];
24433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is a primitive value.
2448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is primitive
2449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.isPrimitive = function() {
2451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.isUndefined() || this.isNull() || this.isBoolean() ||
2452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         this.isNumber() || this.isString();
24533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the object handle.
2458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {number} the value handle
2459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.handle = function() {
2461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.handle;
24623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is undefined.
2467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is undefined
2468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.isUndefined = function() {
2470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.type == 'undefined';
24713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is null.
2476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is null
2477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.isNull = function() {
2479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.type == 'null';
24803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is a boolean.
2485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is a boolean
2486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.isBoolean = function() {
2488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.type == 'boolean';
24893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is a number.
2494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is a number
2495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.isNumber = function() {
2497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.type == 'number';
24983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is a string.
2503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is a string
2504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.isString = function() {
2506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.type == 'string';
25073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is an object.
2512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is an object
2513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.isObject = function() {
2515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.type == 'object' || this.value_.type == 'function' ||
2516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         this.value_.type == 'error' || this.value_.type == 'regexp';
25173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the constructor function
2522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {ProtocolValue} constructor function
2523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.constructorFunctionValue = function() {
2525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var ctor = this.value_.constructorFunction;
2526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.lookup(ctor.ref);
25273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the __proto__ value
2532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {ProtocolValue} __proto__ value
2533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.protoObjectValue = function() {
2535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var proto = this.value_.protoObject;
2536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.lookup(proto.ref);
25373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the number og properties.
2542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {number} the number of properties
2543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.propertyCount = function() {
2545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.properties ? this.value_.properties.length : 0;
25463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the specified property name.
2551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {string} property name
2552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.propertyName = function(index) {
2554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var property = this.value_.properties[index];
2555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return property.name;
25563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Return index for the property name.
2561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @param name The property name to look for
2562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {number} index for the property name
2563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.propertyIndex = function(name) {
2565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (var i = 0; i < this.propertyCount(); i++) {
2566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (this.value_.properties[i].name == name) {
2567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return i;
2568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
2569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return null;
25713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the specified property value.
2576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {ProtocolValue} property value
2577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.propertyValue = function(index) {
2579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var property = this.value_.properties[index];
2580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.lookup(property.ref);
25813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is a string.
2586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is a string
2587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.value = function() {
2589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.value;
25903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2593086aeeaae12517475c22695a200be45495516549Ben MurdochProtocolValue.prototype.valueString = function() {
2594086aeeaae12517475c22695a200be45495516549Ben Murdoch  return this.value_.text;
25953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2596086aeeaae12517475c22695a200be45495516549Ben Murdoch
2597086aeeaae12517475c22695a200be45495516549Ben Murdoch
2598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction ProtocolReference(handle) {
2599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.handle_ = handle;
2600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolReference.prototype.handle = function() {
2604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.handle_;
26053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
2606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MakeJSONPair_(name, value) {
2609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return '"' + name + '":' + value;
2610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction ArrayToJSONObject_(content) {
2614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return '{' + content.join(',') + '}';
2615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction ArrayToJSONArray_(content) {
2619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return '[' + content.join(',') + ']';
2620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction BooleanToJSON_(value) {
26246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return String(value);
2625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction NumberToJSON_(value) {
26296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return String(value);
2630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Mapping of some control characters to avoid the \uXXXX syntax for most
2634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// commonly used control cahracters.
26353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar ctrlCharMap_ = {
2636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  '\b': '\\b',
2637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  '\t': '\\t',
2638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  '\n': '\\n',
2639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  '\f': '\\f',
2640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  '\r': '\\r',
2641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  '"' : '\\"',
2642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  '\\': '\\\\'
2643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
2644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Regular expression testing for ", \ and control characters (0x00 - 0x1F).
26473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar ctrlCharTest_ = new RegExp('["\\\\\x00-\x1F]');
2648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Regular expression matching ", \ and control characters (0x00 - 0x1F)
2651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// globally.
26523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar ctrlCharMatch_ = new RegExp('["\\\\\x00-\x1F]', 'g');
2653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Convert a String to its JSON representation (see http://www.json.org/). To
2657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * avoid depending on the String object this method calls the functions in
2658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * string.js directly and not through the value.
2659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @param {String} value The String value to format as JSON
2660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {string} JSON formatted String value
2661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction StringToJSON_(value) {
2663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Check for" , \ and control characters (0x00 - 0x1F). No need to call
2664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // RegExpTest as ctrlchar is constructed using RegExp.
2665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (ctrlCharTest_.test(value)) {
2666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Replace ", \ and control characters (0x00 - 0x1F).
2667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return '"' +
2668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      value.replace(ctrlCharMatch_, function (char) {
2669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        // Use charmap if possible.
2670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var mapped = ctrlCharMap_[char];
2671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (mapped) return mapped;
2672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        mapped = char.charCodeAt();
2673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        // Convert control character to unicode escape sequence.
2674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        return '\\u00' +
2675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          '0' + // TODO %NumberToRadixString(Math.floor(mapped / 16), 16) +
26763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          '0'; // TODO %NumberToRadixString(mapped % 16, 16)
2677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      })
2678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    + '"';
2679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Simple string with no special characters.
2682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return '"' + value + '"';
2683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Convert a Date to ISO 8601 format. To avoid depending on the Date object
2688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * this method calls the functions in date.js directly and not through the
2689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * value.
2690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @param {Date} value The Date value to format as JSON
2691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {string} JSON formatted Date value
2692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction DateToISO8601_(value) {
26943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var f = function(n) {
2695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return n < 10 ? '0' + n : n;
26963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  };
26973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var g = function(n) {
2698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return n < 10 ? '00' + n : n < 100 ? '0' + n : n;
26993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  };
2700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return builtins.GetUTCFullYearFrom(value)         + '-' +
2701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          f(builtins.GetUTCMonthFrom(value) + 1)    + '-' +
2702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          f(builtins.GetUTCDateFrom(value))         + 'T' +
2703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          f(builtins.GetUTCHoursFrom(value))        + ':' +
2704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          f(builtins.GetUTCMinutesFrom(value))      + ':' +
2705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          f(builtins.GetUTCSecondsFrom(value))      + '.' +
2706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          g(builtins.GetUTCMillisecondsFrom(value)) + 'Z';
2707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Convert a Date to ISO 8601 format. To avoid depending on the Date object
2712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * this method calls the functions in date.js directly and not through the
2713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * value.
2714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @param {Date} value The Date value to format as JSON
2715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {string} JSON formatted Date value
2716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction DateToJSON_(value) {
2718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return '"' + DateToISO8601_(value) + '"';
2719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Convert an Object to its JSON representation (see http://www.json.org/).
2724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * This implementation simply runs through all string property names and adds
2725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * each property to the JSON representation for some predefined types. For type
2726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * "object" the function calls itself recursively unless the object has the
2727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * function property "toJSONProtocol" in which case that is used. This is not
2728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * a general implementation but sufficient for the debugger. Note that circular
2729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * structures will cause infinite recursion.
2730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @param {Object} object The object to format as JSON
2731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {string} JSON formatted object value
2732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction SimpleObjectToJSON_(object) {
2734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var content = [];
2735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (var key in object) {
2736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Only consider string keys.
2737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (typeof key == 'string') {
2738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var property_value = object[key];
2739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Format the value based on its type.
2741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var property_value_json;
2742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      switch (typeof property_value) {
2743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        case 'object':
2744086aeeaae12517475c22695a200be45495516549Ben Murdoch          if (property_value === null) {
2745086aeeaae12517475c22695a200be45495516549Ben Murdoch            property_value_json = 'null';
2746086aeeaae12517475c22695a200be45495516549Ben Murdoch          } else if (typeof property_value.toJSONProtocol == 'function') {
27473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            property_value_json = property_value.toJSONProtocol(true);
2748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          } else if (property_value.constructor.name == 'Array'){
2749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            property_value_json = SimpleArrayToJSON_(property_value);
2750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          } else {
2751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            property_value_json = SimpleObjectToJSON_(property_value);
2752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
2753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          break;
2754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        case 'boolean':
2756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          property_value_json = BooleanToJSON_(property_value);
2757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          break;
2758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        case 'number':
2760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          property_value_json = NumberToJSON_(property_value);
2761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          break;
2762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        case 'string':
2764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          property_value_json = StringToJSON_(property_value);
2765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          break;
2766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        default:
2768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          property_value_json = null;
2769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
2770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Add the property if relevant.
2772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (property_value_json) {
2773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        content.push(StringToJSON_(key) + ':' + property_value_json);
2774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
2775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
2776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Make JSON object representation.
2779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return '{' + content.join(',') + '}';
2780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
2784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Convert an array to its JSON representation. This is a VERY simple
2785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * implementation just to support what is needed for the debugger.
2786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @param {Array} arrya The array to format as JSON
2787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {string} JSON formatted array value
2788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
2789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction SimpleArrayToJSON_(array) {
2790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Make JSON array representation.
2791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var json = '[';
2792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (var i = 0; i < array.length; i++) {
2793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (i != 0) {
2794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json += ',';
2795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
2796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var elem = array[i];
2797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (elem.toJSONProtocol) {
27983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      json += elem.toJSONProtocol(true);
2799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else if (typeof(elem) === 'object')  {
2800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json += SimpleObjectToJSON_(elem);
2801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else if (typeof(elem) === 'boolean')  {
2802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json += BooleanToJSON_(elem);
2803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else if (typeof(elem) === 'number')  {
2804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json += NumberToJSON_(elem);
2805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else if (typeof(elem) === 'string')  {
2806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json += StringToJSON_(elem);
2807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
2808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json += elem;
2809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
2810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  json += ']';
2812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return json;
2813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2814