1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2008 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
53ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch"use strict";
63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString.prototype.startsWith = function (str) {
83ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (str.length > this.length) {
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return false;
103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.substr(0, str.length) == str;
123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction log10(num) {
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Math.log(num)/Math.log(10);
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction ToInspectableObject(obj) {
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!obj && typeof obj === 'object') {
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return UNDEFINED;
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return Object(obj);
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction GetCompletions(global, last, full) {
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var full_tokens = full.split();
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  full = full_tokens.pop();
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var parts = full.split('.');
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  parts.pop();
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var current = global;
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (var i = 0; i < parts.length; i++) {
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var part = parts[i];
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var next = current[part];
353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!next) {
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return [];
373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    current = next;
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var result = [];
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  current = ToInspectableObject(current);
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  while (typeof current !== 'undefined') {
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var mirror = new $debug.ObjectMirror(current);
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var properties = mirror.properties();
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (var i = 0; i < properties.length; i++) {
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var name = properties[i].name();
473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (typeof name === 'string' && name.startsWith(last)) {
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result.push(name);
493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    current = ToInspectableObject(Object.getPrototypeOf(current));
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Global object holding debugger related constants and state.
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar Debug = {};
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Debug events which can occour in the V8 JavaScript engine. These originate
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from the API include file v8-debug.h.
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.DebugEvent = { Break: 1,
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     Exception: 2,
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     NewFunction: 3,
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     BeforeCompile: 4,
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     AfterCompile: 5 };
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The different types of scripts matching enum ScriptType in objects.h.
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.ScriptType = { Native: 0,
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     Extension: 1,
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     Normal: 2 };
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The different types of script compilations matching enum
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Script::CompilationType in objects.h.
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.ScriptCompilationType = { Host: 0,
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                Eval: 1,
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                JSON: 2 };
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The different types of scopes matching constants runtime.cc.
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.ScopeType = { Global: 0,
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                    Local: 1,
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                    With: 2,
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                    Closure: 3,
8869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                    Catch: 4,
8969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                    Block: 5 };
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Current debug state.
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kNoFrame = -1;
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.State = {
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  currentFrame: kNoFrame,
96086aeeaae12517475c22695a200be45495516549Ben Murdoch  displaySourceStartLine: -1,
97086aeeaae12517475c22695a200be45495516549Ben Murdoch  displaySourceEndLine: -1,
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  currentSourceLine: -1
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar trace_compile = false;  // Tracing all compile events?
101086aeeaae12517475c22695a200be45495516549Ben Murdochvar trace_debug_json = false; // Tracing all debug json packets?
1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar last_cmd = '';
103086aeeaae12517475c22695a200be45495516549Ben Murdochvar repeat_cmd_line = '';
104086aeeaae12517475c22695a200be45495516549Ben Murdochvar is_running = true;
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Global variable used to store whether a handle was requested.
1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar lookup_handle = null;
107086aeeaae12517475c22695a200be45495516549Ben Murdoch
108086aeeaae12517475c22695a200be45495516549Ben Murdoch// Copied from debug-delay.js.  This is needed below:
109086aeeaae12517475c22695a200be45495516549Ben Murdochfunction ScriptTypeFlag(type) {
110086aeeaae12517475c22695a200be45495516549Ben Murdoch  return (1 << type);
111086aeeaae12517475c22695a200be45495516549Ben Murdoch}
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Process a debugger JSON message into a display text and a running status.
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// This function returns an object with properties "text" and "running" holding
116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// this information.
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction DebugMessageDetails(message) {
118086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (trace_debug_json) {
119086aeeaae12517475c22695a200be45495516549Ben Murdoch    print("received: '" + message + "'");
120086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Convert the JSON string to an object.
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var response = new ProtocolPackage(message);
123086aeeaae12517475c22695a200be45495516549Ben Murdoch  is_running = response.running();
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (response.type() == 'event') {
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return DebugEventDetails(response);
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return DebugResponseDetails(response);
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction DebugEventDetails(response) {
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var details = {text:'', running:false};
134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Get the running state.
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  details.running = response.running();
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var body = response.body();
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var result = '';
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (response.event()) {
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'break':
142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (body.breakpoints) {
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += 'breakpoint';
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (body.breakpoints.length > 1) {
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += 's';
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += ' #';
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        for (var i = 0; i < body.breakpoints.length; i++) {
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (i > 0) {
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += ', #';
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += body.breakpoints[i];
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      } else {
155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += 'break';
156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += ' in ';
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += body.invocationText;
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += ', ';
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += SourceInfo(body);
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '\n';
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += SourceUnderline(body.sourceLineText, body.sourceColumn);
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Debug.State.currentSourceLine = body.sourceLine;
164086aeeaae12517475c22695a200be45495516549Ben Murdoch      Debug.State.displaySourceStartLine = -1;
165086aeeaae12517475c22695a200be45495516549Ben Murdoch      Debug.State.displaySourceEndLine = -1;
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Debug.State.currentFrame = 0;
167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      details.text = result;
168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'exception':
171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (body.uncaught) {
172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += 'Uncaught: ';
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      } else {
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += 'Exception: ';
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '"';
177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += body.exception.text;
178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '"';
179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (body.sourceLine >= 0) {
180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += ', ';
181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += SourceInfo(body);
182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += '\n';
183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += SourceUnderline(body.sourceLineText, body.sourceColumn);
184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        Debug.State.currentSourceLine = body.sourceLine;
185086aeeaae12517475c22695a200be45495516549Ben Murdoch        Debug.State.displaySourceStartLine = -1;
186086aeeaae12517475c22695a200be45495516549Ben Murdoch        Debug.State.displaySourceEndLine = -1;
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        Debug.State.currentFrame = 0;
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      } else {
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += ' (empty stack)';
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        Debug.State.currentSourceLine = -1;
191086aeeaae12517475c22695a200be45495516549Ben Murdoch        Debug.State.displaySourceStartLine = -1;
192086aeeaae12517475c22695a200be45495516549Ben Murdoch        Debug.State.displaySourceEndLine = -1;
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        Debug.State.currentFrame = kNoFrame;
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      details.text = result;
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'afterCompile':
199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (trace_compile) {
2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        result = 'Source ' + body.script.name + ' compiled:\n';
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var source = body.script.source;
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (!(source[source.length - 1] == '\n')) {
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += source;
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        } else {
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += source.substring(0, source.length - 1);
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      details.text = result;
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      details.text = 'Unknown debug event ' + response.event();
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return details;
2163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction SourceInfo(body) {
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var result = '';
2216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (body.script) {
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (body.script.name) {
224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += body.script.name;
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '[unnamed]';
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += ' line ';
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += body.sourceLine + 1;
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += ' column ';
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += body.sourceColumn + 1;
2336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction SourceUnderline(source_text, position) {
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!source_text) {
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return;
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Create an underline with a caret pointing to the source position. If the
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // source contains a tab character the underline will have a tab character in
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // the same place otherwise the underline will have a space character.
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var underline = '';
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (var i = 0; i < position; i++) {
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (source_text[i] == '\t') {
249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      underline += '\t';
250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      underline += ' ';
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  underline += '^';
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Return the source line text with the underline beneath.
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return source_text + '\n' + underline;
2583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Converts a text command to a JSON request.
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction DebugCommandToJSONRequest(cmd_line) {
263086aeeaae12517475c22695a200be45495516549Ben Murdoch  var result = new DebugRequest(cmd_line).JSONRequest();
264086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (trace_debug_json && result) {
265086aeeaae12517475c22695a200be45495516549Ben Murdoch    print("sending: '" + result + "'");
266086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
267086aeeaae12517475c22695a200be45495516549Ben Murdoch  return result;
2683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction DebugRequest(cmd_line) {
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // If the very first character is a { assume that a JSON request have been
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // entered as a command. Converting that to a JSON request is trivial.
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (cmd_line && cmd_line.length > 0 && cmd_line.charAt(0) == '{') {
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    this.request_ = cmd_line;
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return;
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
279086aeeaae12517475c22695a200be45495516549Ben Murdoch  // Check for a simple carriage return to repeat the last command:
280086aeeaae12517475c22695a200be45495516549Ben Murdoch  var is_repeating = false;
281086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (cmd_line == '\n') {
282086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (is_running) {
283086aeeaae12517475c22695a200be45495516549Ben Murdoch      cmd_line = 'break'; // Not in debugger mode, break with a frame request.
284086aeeaae12517475c22695a200be45495516549Ben Murdoch    } else {
285086aeeaae12517475c22695a200be45495516549Ben Murdoch      cmd_line = repeat_cmd_line; // use command to repeat.
286086aeeaae12517475c22695a200be45495516549Ben Murdoch      is_repeating = true;
287086aeeaae12517475c22695a200be45495516549Ben Murdoch    }
288086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
289086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!is_running) { // Only save the command if in debugger mode.
290086aeeaae12517475c22695a200be45495516549Ben Murdoch    repeat_cmd_line = cmd_line;   // save last command.
291086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
292086aeeaae12517475c22695a200be45495516549Ben Murdoch
293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Trim string for leading and trailing whitespace.
294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  cmd_line = cmd_line.replace(/^\s+|\s+$/g, '');
295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Find the command.
297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var pos = cmd_line.indexOf(' ');
298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var cmd;
299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var args;
300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (pos == -1) {
301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    cmd = cmd_line;
302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    args = '';
303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    cmd = cmd_line.slice(0, pos);
305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    args = cmd_line.slice(pos).replace(/^\s+|\s+$/g, '');
306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
308086aeeaae12517475c22695a200be45495516549Ben Murdoch  if ((cmd === undefined) || !cmd) {
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this.request_ = UNDEFINED;
310086aeeaae12517475c22695a200be45495516549Ben Murdoch    return;
311086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
312086aeeaae12517475c22695a200be45495516549Ben Murdoch
313086aeeaae12517475c22695a200be45495516549Ben Murdoch  last_cmd = cmd;
314086aeeaae12517475c22695a200be45495516549Ben Murdoch
315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Switch on command.
316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (cmd) {
317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'continue':
318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'c':
319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.continueCommandToJSONRequest_(args);
320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'step':
323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 's':
324086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.stepCommandToJSONRequest_(args, 'in');
325086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
326086aeeaae12517475c22695a200be45495516549Ben Murdoch
327086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'stepi':
328086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'si':
329086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.stepCommandToJSONRequest_(args, 'min');
330086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
331086aeeaae12517475c22695a200be45495516549Ben Murdoch
332086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'next':
333086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'n':
334086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.stepCommandToJSONRequest_(args, 'next');
335086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
336086aeeaae12517475c22695a200be45495516549Ben Murdoch
337086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'finish':
338086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'fin':
339086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.stepCommandToJSONRequest_(args, 'out');
340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'backtrace':
343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'bt':
344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.backtraceCommandToJSONRequest_(args);
345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
3466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'frame':
348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'f':
349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.frameCommandToJSONRequest_(args);
350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
3516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'scopes':
353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.scopesCommandToJSONRequest_(args);
354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
3556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'scope':
357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.scopeCommandToJSONRequest_(args);
358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
3596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
360086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'disconnect':
361086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'exit':
362086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'quit':
363086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.disconnectCommandToJSONRequest_(args);
364086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
365086aeeaae12517475c22695a200be45495516549Ben Murdoch
366086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'up':
367086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ =
368086aeeaae12517475c22695a200be45495516549Ben Murdoch          this.frameCommandToJSONRequest_('' +
369086aeeaae12517475c22695a200be45495516549Ben Murdoch                                          (Debug.State.currentFrame + 1));
370086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
37169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
372086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'down':
373086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'do':
374086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ =
375086aeeaae12517475c22695a200be45495516549Ben Murdoch          this.frameCommandToJSONRequest_('' +
376086aeeaae12517475c22695a200be45495516549Ben Murdoch                                          (Debug.State.currentFrame - 1));
377086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
37869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
379086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'set':
380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'print':
381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'p':
382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.printCommandToJSONRequest_(args);
383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'dir':
386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.dirCommandToJSONRequest_(args);
387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'references':
390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.referencesCommandToJSONRequest_(args);
391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'instances':
394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.instancesCommandToJSONRequest_(args);
395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
397086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'list':
398086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'l':
399086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.listCommandToJSONRequest_(args);
400086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'source':
402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.sourceCommandToJSONRequest_(args);
403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
4046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'scripts':
406086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'script':
407086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'scr':
408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.scriptsCommandToJSONRequest_(args);
409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
4106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'break':
412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'b':
413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.breakCommandToJSONRequest_(args);
414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
4156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
41625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    case 'breakpoints':
41725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    case 'bb':
41825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen      this.request_ = this.breakpointsCommandToJSONRequest_(args);
41925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen      break;
42025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'clear':
422086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'delete':
423086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'd':
424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.clearCommandToJSONRequest_(args);
425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'threads':
428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.request_ = this.threadsCommandToJSONRequest_(args);
429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
431086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'cond':
432086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.changeBreakpointCommandToJSONRequest_(args, 'cond');
433086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
434086aeeaae12517475c22695a200be45495516549Ben Murdoch
435086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'enable':
436086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'en':
437086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ =
438086aeeaae12517475c22695a200be45495516549Ben Murdoch          this.changeBreakpointCommandToJSONRequest_(args, 'enable');
439086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
440086aeeaae12517475c22695a200be45495516549Ben Murdoch
441086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'disable':
442086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'dis':
443086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ =
444086aeeaae12517475c22695a200be45495516549Ben Murdoch          this.changeBreakpointCommandToJSONRequest_(args, 'disable');
445086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
446086aeeaae12517475c22695a200be45495516549Ben Murdoch
447086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'ignore':
448086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ =
449086aeeaae12517475c22695a200be45495516549Ben Murdoch          this.changeBreakpointCommandToJSONRequest_(args, 'ignore');
450086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
451086aeeaae12517475c22695a200be45495516549Ben Murdoch
452086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'info':
453086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'inf':
454086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.infoCommandToJSONRequest_(args);
455086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
456086aeeaae12517475c22695a200be45495516549Ben Murdoch
457086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'flags':
458086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.v8FlagsToJSONRequest_(args);
459086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
460086aeeaae12517475c22695a200be45495516549Ben Murdoch
461086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'gc':
462086aeeaae12517475c22695a200be45495516549Ben Murdoch      this.request_ = this.gcToJSONRequest_(args);
463086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
464086aeeaae12517475c22695a200be45495516549Ben Murdoch
465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'trace':
466086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'tr':
467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Return undefined to indicate command handled internally (no JSON).
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this.request_ = UNDEFINED;
469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.traceCommand_(args);
470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case 'help':
473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case '?':
474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.helpCommand_(args);
475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Return undefined to indicate command handled internally (no JSON).
476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this.request_ = UNDEFINED;
477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      throw new Error('Unknown command "' + cmd + '"');
481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.JSONRequest = function() {
485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.request_;
4863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction RequestPacket(command) {
490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.seq = 0;
491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.type = 'request';
492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.command = command;
493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockRequestPacket.prototype.toJSONProtocol = function() {
497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Encode the protocol header.
498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var json = '{';
499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  json += '"seq":' + this.seq;
500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  json += ',"type":"' + this.type + '"';
501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (this.command) {
502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    json += ',"command":' + JSON.stringify(this.command);
503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (this.arguments) {
505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    json += ',"arguments":';
506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Encode the arguments part.
507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (this.arguments.toJSONProtocol) {
5083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      json += this.arguments.toJSONProtocol();
509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      json += JSON.stringify(this.arguments);
511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  json += '}';
514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return json;
5153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.createRequest = function(command) {
519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return new RequestPacket(command);
520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the evaluation command.
524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.makeEvaluateJSONRequest_ = function(expression) {
525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  lookup_handle = null;
526e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Check if the expression is a handle id in the form #<handle>#.
528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var handle_match = expression.match(/^#([0-9]*)#$/);
529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (handle_match) {
530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Remember the handle requested in a global variable.
531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    lookup_handle = parseInt(handle_match[1]);
532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Build a lookup request.
533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var request = this.createRequest('lookup');
534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.handles = [ lookup_handle ];
536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return request.toJSONProtocol();
537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Build an evaluate request.
539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var request = this.createRequest('evaluate');
540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.expression = expression;
542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Request a global evaluation if there is no current frame.
543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (Debug.State.currentFrame == kNoFrame) {
544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      request.arguments.global = true;
545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return request.toJSONProtocol();
547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the references/instances command.
552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.makeReferencesJSONRequest_ = function(handle, type) {
553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a references request.
554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var handle_match = handle.match(/^#([0-9]*)#$/);
555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (handle_match) {
556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var request = this.createRequest('references');
557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.type = type;
559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.handle = parseInt(handle_match[1]);
560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return request.toJSONProtocol();
561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Invalid object id.');
563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the continue command.
568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.continueCommandToJSONRequest_ = function(args) {
569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('continue');
570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the step command.
575086aeeaae12517475c22695a200be45495516549Ben MurdochDebugRequest.prototype.stepCommandToJSONRequest_ = function(args, type) {
576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Requesting a step is through the continue command with additional
577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // arguments.
578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('continue');
579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request.arguments = {};
580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Process arguments if any.
582086aeeaae12517475c22695a200be45495516549Ben Murdoch
583086aeeaae12517475c22695a200be45495516549Ben Murdoch  // Only process args if the command is 'step' which is indicated by type being
584086aeeaae12517475c22695a200be45495516549Ben Murdoch  // set to 'in'.  For all other commands, ignore the args.
585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args && args.length > 0) {
586086aeeaae12517475c22695a200be45495516549Ben Murdoch    args = args.split(/\s+/g);
587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (args.length > 2) {
589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      throw new Error('Invalid step arguments.');
590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (args.length > 0) {
593086aeeaae12517475c22695a200be45495516549Ben Murdoch      // Check if we have a gdb stype step command.  If so, the 1st arg would
594086aeeaae12517475c22695a200be45495516549Ben Murdoch      // be the step count.  If it's not a number, then assume that we're
595086aeeaae12517475c22695a200be45495516549Ben Murdoch      // parsing for the legacy v8 step command.
596086aeeaae12517475c22695a200be45495516549Ben Murdoch      var stepcount = Number(args[0]);
597086aeeaae12517475c22695a200be45495516549Ben Murdoch      if (stepcount == Number.NaN) {
598086aeeaae12517475c22695a200be45495516549Ben Murdoch        // No step count at arg 1.  Process as legacy d8 step command:
599086aeeaae12517475c22695a200be45495516549Ben Murdoch        if (args.length == 2) {
600086aeeaae12517475c22695a200be45495516549Ben Murdoch          var stepcount = parseInt(args[1]);
601086aeeaae12517475c22695a200be45495516549Ben Murdoch          if (isNaN(stepcount) || stepcount <= 0) {
602086aeeaae12517475c22695a200be45495516549Ben Murdoch            throw new Error('Invalid step count argument "' + args[0] + '".');
603086aeeaae12517475c22695a200be45495516549Ben Murdoch          }
604086aeeaae12517475c22695a200be45495516549Ben Murdoch          request.arguments.stepcount = stepcount;
605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
607086aeeaae12517475c22695a200be45495516549Ben Murdoch        // Get the step action.
608086aeeaae12517475c22695a200be45495516549Ben Murdoch        switch (args[0]) {
609086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'in':
610086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'i':
611086aeeaae12517475c22695a200be45495516549Ben Murdoch            request.arguments.stepaction = 'in';
612086aeeaae12517475c22695a200be45495516549Ben Murdoch            break;
6136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
614086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'min':
615086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'm':
616086aeeaae12517475c22695a200be45495516549Ben Murdoch            request.arguments.stepaction = 'min';
617086aeeaae12517475c22695a200be45495516549Ben Murdoch            break;
6186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
619086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'next':
620086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'n':
621086aeeaae12517475c22695a200be45495516549Ben Murdoch            request.arguments.stepaction = 'next';
622086aeeaae12517475c22695a200be45495516549Ben Murdoch            break;
6236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
624086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'out':
625086aeeaae12517475c22695a200be45495516549Ben Murdoch          case 'o':
626086aeeaae12517475c22695a200be45495516549Ben Murdoch            request.arguments.stepaction = 'out';
627086aeeaae12517475c22695a200be45495516549Ben Murdoch            break;
6286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
629086aeeaae12517475c22695a200be45495516549Ben Murdoch          default:
630086aeeaae12517475c22695a200be45495516549Ben Murdoch            throw new Error('Invalid step argument "' + args[0] + '".');
631086aeeaae12517475c22695a200be45495516549Ben Murdoch        }
632086aeeaae12517475c22695a200be45495516549Ben Murdoch
633086aeeaae12517475c22695a200be45495516549Ben Murdoch      } else {
634086aeeaae12517475c22695a200be45495516549Ben Murdoch        // gdb style step commands:
635086aeeaae12517475c22695a200be45495516549Ben Murdoch        request.arguments.stepaction = type;
636086aeeaae12517475c22695a200be45495516549Ben Murdoch        request.arguments.stepcount = stepcount;
637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
640086aeeaae12517475c22695a200be45495516549Ben Murdoch    // Default is step of the specified type.
641086aeeaae12517475c22695a200be45495516549Ben Murdoch    request.arguments.stepaction = type;
642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the backtrace command.
649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.backtraceCommandToJSONRequest_ = function(args) {
650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a backtrace request from the text command.
651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('backtrace');
6526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Default is to show top 10 frames.
654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request.arguments = {};
655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request.arguments.fromFrame = 0;
656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request.arguments.toFrame = 10;
657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  args = args.split(/\s*[ ]+\s*/g);
659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length == 1 && args[0].length > 0) {
660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var frameCount = parseInt(args[0]);
661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (frameCount > 0) {
662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Show top frames.
663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      request.arguments.fromFrame = 0;
664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      request.arguments.toFrame = frameCount;
665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Show bottom frames.
667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      request.arguments.fromFrame = 0;
668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      request.arguments.toFrame = -frameCount;
669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      request.arguments.bottom = true;
670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (args.length == 2) {
672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var fromFrame = parseInt(args[0]);
673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var toFrame = parseInt(args[1]);
674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (isNaN(fromFrame) || fromFrame < 0) {
675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      throw new Error('Invalid start frame argument "' + args[0] + '".');
676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (isNaN(toFrame) || toFrame < 0) {
678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      throw new Error('Invalid end frame argument "' + args[1] + '".');
679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (fromFrame > toFrame) {
681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      throw new Error('Invalid arguments start frame cannot be larger ' +
682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                      'than end frame.');
683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Show frame range.
685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.fromFrame = fromFrame;
686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.toFrame = toFrame + 1;
687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (args.length > 2) {
688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Invalid backtrace arguments.');
689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the frame command.
696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.frameCommandToJSONRequest_ = function(args) {
697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a frame request from the text command.
698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('frame');
699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  args = args.split(/\s*[ ]+\s*/g);
700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length > 0 && args[0].length > 0) {
701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.number = args[0];
703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the scopes command.
709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.scopesCommandToJSONRequest_ = function(args) {
710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a scopes request from the text command.
711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('scopes');
712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the scope command.
717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.scopeCommandToJSONRequest_ = function(args) {
718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a scope request from the text command.
719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('scope');
720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  args = args.split(/\s*[ ]+\s*/g);
721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length > 0 && args[0].length > 0) {
722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.number = args[0];
724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the print command.
730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.printCommandToJSONRequest_ = function(args) {
731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build an evaluate request from the text command.
732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length == 0) {
733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Missing expression.');
734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.makeEvaluateJSONRequest_(args);
736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the dir command.
740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.dirCommandToJSONRequest_ = function(args) {
741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build an evaluate request from the text command.
742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length == 0) {
743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Missing expression.');
744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.makeEvaluateJSONRequest_(args);
746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the references command.
750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.referencesCommandToJSONRequest_ = function(args) {
751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build an evaluate request from the text command.
752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length == 0) {
753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Missing object id.');
754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
7556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.makeReferencesJSONRequest_(args, 'referencedBy');
757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the instances command.
761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.instancesCommandToJSONRequest_ = function(args) {
762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build an evaluate request from the text command.
763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length == 0) {
764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Missing object id.');
765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
7666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a references request.
768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.makeReferencesJSONRequest_(args, 'constructedBy');
769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
772086aeeaae12517475c22695a200be45495516549Ben Murdoch// Create a JSON request for the list command.
773086aeeaae12517475c22695a200be45495516549Ben MurdochDebugRequest.prototype.listCommandToJSONRequest_ = function(args) {
774086aeeaae12517475c22695a200be45495516549Ben Murdoch
775086aeeaae12517475c22695a200be45495516549Ben Murdoch  // Default is ten lines starting five lines before the current location.
776086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (Debug.State.displaySourceEndLine == -1) {
777086aeeaae12517475c22695a200be45495516549Ben Murdoch    // If we list forwards, we will start listing after the last source end
778086aeeaae12517475c22695a200be45495516549Ben Murdoch    // line.  Set it to start from 5 lines before the current location.
779086aeeaae12517475c22695a200be45495516549Ben Murdoch    Debug.State.displaySourceEndLine = Debug.State.currentSourceLine - 5;
780086aeeaae12517475c22695a200be45495516549Ben Murdoch    // If we list backwards, we will start listing backwards from the last
781086aeeaae12517475c22695a200be45495516549Ben Murdoch    // source start line.  Set it to start from 1 lines before the current
782086aeeaae12517475c22695a200be45495516549Ben Murdoch    // location.
783086aeeaae12517475c22695a200be45495516549Ben Murdoch    Debug.State.displaySourceStartLine = Debug.State.currentSourceLine + 1;
784086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
785086aeeaae12517475c22695a200be45495516549Ben Murdoch
786086aeeaae12517475c22695a200be45495516549Ben Murdoch  var from = Debug.State.displaySourceEndLine + 1;
787086aeeaae12517475c22695a200be45495516549Ben Murdoch  var lines = 10;
788086aeeaae12517475c22695a200be45495516549Ben Murdoch
789086aeeaae12517475c22695a200be45495516549Ben Murdoch  // Parse the arguments.
790086aeeaae12517475c22695a200be45495516549Ben Murdoch  args = args.split(/\s*,\s*/g);
791086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (args == '') {
792086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else if ((args.length == 1) && (args[0] == '-')) {
793086aeeaae12517475c22695a200be45495516549Ben Murdoch    from = Debug.State.displaySourceStartLine - lines;
794086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else if (args.length == 2) {
795086aeeaae12517475c22695a200be45495516549Ben Murdoch    from = parseInt(args[0]);
796086aeeaae12517475c22695a200be45495516549Ben Murdoch    lines = parseInt(args[1]) - from + 1; // inclusive of the ending line.
797086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else {
798086aeeaae12517475c22695a200be45495516549Ben Murdoch    throw new Error('Invalid list arguments.');
799086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
800086aeeaae12517475c22695a200be45495516549Ben Murdoch  Debug.State.displaySourceStartLine = from;
801086aeeaae12517475c22695a200be45495516549Ben Murdoch  Debug.State.displaySourceEndLine = from + lines - 1;
802086aeeaae12517475c22695a200be45495516549Ben Murdoch  var sourceArgs = '' + from + ' ' + lines;
803086aeeaae12517475c22695a200be45495516549Ben Murdoch  return this.sourceCommandToJSONRequest_(sourceArgs);
804086aeeaae12517475c22695a200be45495516549Ben Murdoch};
805086aeeaae12517475c22695a200be45495516549Ben Murdoch
806086aeeaae12517475c22695a200be45495516549Ben Murdoch
807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the source command.
808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.sourceCommandToJSONRequest_ = function(args) {
809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a evaluate request from the text command.
810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('source');
811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Default is ten lines starting five lines before the current location.
813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var from = Debug.State.currentSourceLine - 5;
814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var lines = 10;
815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Parse the arguments.
817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  args = args.split(/\s*[ ]+\s*/g);
818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args.length > 1 && args[0].length > 0 && args[1].length > 0) {
819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    from = parseInt(args[0]) - 1;
820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    lines = parseInt(args[1]);
821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (args.length > 0 && args[0].length > 0) {
822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    from = parseInt(args[0]) - 1;
823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (from < 0) from = 0;
826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (lines < 0) lines = 10;
827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Request source arround current source location.
829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request.arguments = {};
830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request.arguments.fromLine = from;
831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  request.arguments.toLine = from + lines;
832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the scripts command.
838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.scriptsCommandToJSONRequest_ = function(args) {
839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a evaluate request from the text command.
840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('scripts');
841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Process arguments if any.
843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args && args.length > 0) {
844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    args = args.split(/\s*[ ]+\s*/g);
845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (args.length > 1) {
847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      throw new Error('Invalid scripts arguments.');
848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    switch (args[0]) {
852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'natives':
853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        request.arguments.types = ScriptTypeFlag(Debug.ScriptType.Native);
854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
8556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'extensions':
857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        request.arguments.types = ScriptTypeFlag(Debug.ScriptType.Extension);
858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
8596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'all':
861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        request.arguments.types =
862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            ScriptTypeFlag(Debug.ScriptType.Normal) |
863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            ScriptTypeFlag(Debug.ScriptType.Native) |
864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            ScriptTypeFlag(Debug.ScriptType.Extension);
865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
8666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      default:
868086aeeaae12517475c22695a200be45495516549Ben Murdoch        // If the arg is not one of the know one aboves, then it must be a
869086aeeaae12517475c22695a200be45495516549Ben Murdoch        // filter used for filtering the results:
870086aeeaae12517475c22695a200be45495516549Ben Murdoch        request.arguments.filter = args[0];
871086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the break command.
880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.breakCommandToJSONRequest_ = function(args) {
881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a evaluate request from the text command.
882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Process arguments if any.
883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args && args.length > 0) {
884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var target = args;
885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var type = 'function';
886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var line;
887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var column;
888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var condition;
889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var pos;
890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    var request = this.createRequest('setbreakpoint');
8926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
893086aeeaae12517475c22695a200be45495516549Ben Murdoch    // Break the args into target spec and condition if appropriate.
894086aeeaae12517475c22695a200be45495516549Ben Murdoch
895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Check for breakpoint condition.
896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    pos = args.indexOf(' ');
897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (pos > 0) {
898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      target = args.substring(0, pos);
899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      condition = args.substring(pos + 1, args.length);
900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Check for script breakpoint (name:line[:column]). If no ':' in break
903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // specification it is considered a function break point.
904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    pos = target.indexOf(':');
905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (pos > 0) {
906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var tmp = target.substring(pos + 1, target.length);
907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      target = target.substring(0, pos);
9083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      if (target[0] == '/' && target[target.length - 1] == '/') {
9093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        type = 'scriptRegExp';
9103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        target = target.substring(1, target.length - 1);
9113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      } else {
9123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        type = 'script';
9133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      }
9146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Check for both line and column.
916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      pos = tmp.indexOf(':');
917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (pos > 0) {
918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        column = parseInt(tmp.substring(pos + 1, tmp.length)) - 1;
919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        line = parseInt(tmp.substring(0, pos)) - 1;
920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      } else {
921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        line = parseInt(tmp) - 1;
922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else if (target[0] == '#' && target[target.length - 1] == '#') {
924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      type = 'handle';
925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      target = target.substring(1, target.length - 1);
926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      type = 'function';
928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
9296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.type = type;
932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.target = target;
933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.line = line;
934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.column = column;
935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.condition = condition;
936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
9376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    var request = this.createRequest('suspend');
938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
94425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian MonsenDebugRequest.prototype.breakpointsCommandToJSONRequest_ = function(args) {
94525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  if (args && args.length > 0) {
94625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    throw new Error('Unexpected arguments.');
94725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  }
94825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  var request = this.createRequest('listbreakpoints');
94925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  return request.toJSONProtocol();
95025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen};
95125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
95225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the clear command.
954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.clearCommandToJSONRequest_ = function(args) {
955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a evaluate request from the text command.
956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('clearbreakpoint');
957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Process arguments if any.
959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args && args.length > 0) {
960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments = {};
961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    request.arguments.breakpoint = parseInt(args);
962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Invalid break arguments.');
964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
970086aeeaae12517475c22695a200be45495516549Ben Murdoch// Create a JSON request for the change breakpoint command.
971086aeeaae12517475c22695a200be45495516549Ben MurdochDebugRequest.prototype.changeBreakpointCommandToJSONRequest_ =
972086aeeaae12517475c22695a200be45495516549Ben Murdoch    function(args, command) {
973086aeeaae12517475c22695a200be45495516549Ben Murdoch
974086aeeaae12517475c22695a200be45495516549Ben Murdoch  var request;
975086aeeaae12517475c22695a200be45495516549Ben Murdoch
976086aeeaae12517475c22695a200be45495516549Ben Murdoch  // Check for exception breaks first:
977086aeeaae12517475c22695a200be45495516549Ben Murdoch  //   en[able] exc[eptions] [all|unc[aught]]
978086aeeaae12517475c22695a200be45495516549Ben Murdoch  //   en[able] [all|unc[aught]] exc[eptions]
979086aeeaae12517475c22695a200be45495516549Ben Murdoch  //   dis[able] exc[eptions] [all|unc[aught]]
980086aeeaae12517475c22695a200be45495516549Ben Murdoch  //   dis[able] [all|unc[aught]] exc[eptions]
981086aeeaae12517475c22695a200be45495516549Ben Murdoch  if ((command == 'enable' || command == 'disable') &&
982086aeeaae12517475c22695a200be45495516549Ben Murdoch      args && args.length > 1) {
983086aeeaae12517475c22695a200be45495516549Ben Murdoch    var nextPos = args.indexOf(' ');
984086aeeaae12517475c22695a200be45495516549Ben Murdoch    var arg1 = (nextPos > 0) ? args.substring(0, nextPos) : args;
985086aeeaae12517475c22695a200be45495516549Ben Murdoch    var excType = null;
986086aeeaae12517475c22695a200be45495516549Ben Murdoch
987086aeeaae12517475c22695a200be45495516549Ben Murdoch    // Check for:
988086aeeaae12517475c22695a200be45495516549Ben Murdoch    //   en[able] exc[eptions] [all|unc[aught]]
989086aeeaae12517475c22695a200be45495516549Ben Murdoch    //   dis[able] exc[eptions] [all|unc[aught]]
990086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (arg1 == 'exc' || arg1 == 'exception' || arg1 == 'exceptions') {
991086aeeaae12517475c22695a200be45495516549Ben Murdoch
992086aeeaae12517475c22695a200be45495516549Ben Murdoch      var arg2 = (nextPos > 0) ?
993086aeeaae12517475c22695a200be45495516549Ben Murdoch          args.substring(nextPos + 1, args.length) : 'all';
994086aeeaae12517475c22695a200be45495516549Ben Murdoch      if (!arg2) {
995086aeeaae12517475c22695a200be45495516549Ben Murdoch        arg2 = 'all'; // if unspecified, set for all.
996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else if (arg2 == 'unc') { // check for short cut.
997086aeeaae12517475c22695a200be45495516549Ben Murdoch        arg2 = 'uncaught';
998086aeeaae12517475c22695a200be45495516549Ben Murdoch      }
999086aeeaae12517475c22695a200be45495516549Ben Murdoch      excType = arg2;
100069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1001086aeeaae12517475c22695a200be45495516549Ben Murdoch    // Check for:
1002086aeeaae12517475c22695a200be45495516549Ben Murdoch    //   en[able] [all|unc[aught]] exc[eptions]
1003086aeeaae12517475c22695a200be45495516549Ben Murdoch    //   dis[able] [all|unc[aught]] exc[eptions]
1004086aeeaae12517475c22695a200be45495516549Ben Murdoch    } else if (arg1 == 'all' || arg1 == 'unc' || arg1 == 'uncaught') {
1005086aeeaae12517475c22695a200be45495516549Ben Murdoch
1006086aeeaae12517475c22695a200be45495516549Ben Murdoch      var arg2 = (nextPos > 0) ?
1007086aeeaae12517475c22695a200be45495516549Ben Murdoch          args.substring(nextPos + 1, args.length) : null;
1008086aeeaae12517475c22695a200be45495516549Ben Murdoch      if (arg2 == 'exc' || arg1 == 'exception' || arg1 == 'exceptions') {
1009086aeeaae12517475c22695a200be45495516549Ben Murdoch        excType = arg1;
1010086aeeaae12517475c22695a200be45495516549Ben Murdoch        if (excType == 'unc') {
1011086aeeaae12517475c22695a200be45495516549Ben Murdoch          excType = 'uncaught';
1012086aeeaae12517475c22695a200be45495516549Ben Murdoch        }
1013086aeeaae12517475c22695a200be45495516549Ben Murdoch      }
1014086aeeaae12517475c22695a200be45495516549Ben Murdoch    }
1015086aeeaae12517475c22695a200be45495516549Ben Murdoch
1016086aeeaae12517475c22695a200be45495516549Ben Murdoch    // If we matched one of the command formats, then excType will be non-null:
1017086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (excType) {
1018086aeeaae12517475c22695a200be45495516549Ben Murdoch      // Build a evaluate request from the text command.
1019086aeeaae12517475c22695a200be45495516549Ben Murdoch      request = this.createRequest('setexceptionbreak');
1020086aeeaae12517475c22695a200be45495516549Ben Murdoch
1021086aeeaae12517475c22695a200be45495516549Ben Murdoch      request.arguments = {};
1022086aeeaae12517475c22695a200be45495516549Ben Murdoch      request.arguments.type = excType;
1023086aeeaae12517475c22695a200be45495516549Ben Murdoch      request.arguments.enabled = (command == 'enable');
1024086aeeaae12517475c22695a200be45495516549Ben Murdoch
1025086aeeaae12517475c22695a200be45495516549Ben Murdoch      return request.toJSONProtocol();
1026086aeeaae12517475c22695a200be45495516549Ben Murdoch    }
1027086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
1028086aeeaae12517475c22695a200be45495516549Ben Murdoch
1029086aeeaae12517475c22695a200be45495516549Ben Murdoch  // Build a evaluate request from the text command.
1030086aeeaae12517475c22695a200be45495516549Ben Murdoch  request = this.createRequest('changebreakpoint');
1031086aeeaae12517475c22695a200be45495516549Ben Murdoch
1032086aeeaae12517475c22695a200be45495516549Ben Murdoch  // Process arguments if any.
1033086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (args && args.length > 0) {
1034086aeeaae12517475c22695a200be45495516549Ben Murdoch    request.arguments = {};
1035086aeeaae12517475c22695a200be45495516549Ben Murdoch    var pos = args.indexOf(' ');
1036086aeeaae12517475c22695a200be45495516549Ben Murdoch    var breakpointArg = args;
1037086aeeaae12517475c22695a200be45495516549Ben Murdoch    var otherArgs;
1038086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (pos > 0) {
1039086aeeaae12517475c22695a200be45495516549Ben Murdoch      breakpointArg = args.substring(0, pos);
1040086aeeaae12517475c22695a200be45495516549Ben Murdoch      otherArgs = args.substring(pos + 1, args.length);
1041086aeeaae12517475c22695a200be45495516549Ben Murdoch    }
1042086aeeaae12517475c22695a200be45495516549Ben Murdoch
1043086aeeaae12517475c22695a200be45495516549Ben Murdoch    request.arguments.breakpoint = parseInt(breakpointArg);
1044086aeeaae12517475c22695a200be45495516549Ben Murdoch
1045086aeeaae12517475c22695a200be45495516549Ben Murdoch    switch(command) {
1046086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'cond':
1047086aeeaae12517475c22695a200be45495516549Ben Murdoch        request.arguments.condition = otherArgs ? otherArgs : null;
1048086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
1049086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'enable':
1050086aeeaae12517475c22695a200be45495516549Ben Murdoch        request.arguments.enabled = true;
1051086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
1052086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'disable':
1053086aeeaae12517475c22695a200be45495516549Ben Murdoch        request.arguments.enabled = false;
1054086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
1055086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'ignore':
1056086aeeaae12517475c22695a200be45495516549Ben Murdoch        request.arguments.ignoreCount = parseInt(otherArgs);
1057086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
1058086aeeaae12517475c22695a200be45495516549Ben Murdoch      default:
105969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        throw new Error('Invalid arguments.');
1060086aeeaae12517475c22695a200be45495516549Ben Murdoch    }
1061086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else {
1062086aeeaae12517475c22695a200be45495516549Ben Murdoch    throw new Error('Invalid arguments.');
1063086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
1064086aeeaae12517475c22695a200be45495516549Ben Murdoch
1065086aeeaae12517475c22695a200be45495516549Ben Murdoch  return request.toJSONProtocol();
1066086aeeaae12517475c22695a200be45495516549Ben Murdoch};
1067086aeeaae12517475c22695a200be45495516549Ben Murdoch
1068086aeeaae12517475c22695a200be45495516549Ben Murdoch
1069086aeeaae12517475c22695a200be45495516549Ben Murdoch// Create a JSON request for the disconnect command.
1070086aeeaae12517475c22695a200be45495516549Ben MurdochDebugRequest.prototype.disconnectCommandToJSONRequest_ = function(args) {
1071086aeeaae12517475c22695a200be45495516549Ben Murdoch  var request;
1072086aeeaae12517475c22695a200be45495516549Ben Murdoch  request = this.createRequest('disconnect');
1073086aeeaae12517475c22695a200be45495516549Ben Murdoch  return request.toJSONProtocol();
1074086aeeaae12517475c22695a200be45495516549Ben Murdoch};
1075086aeeaae12517475c22695a200be45495516549Ben Murdoch
1076086aeeaae12517475c22695a200be45495516549Ben Murdoch
1077086aeeaae12517475c22695a200be45495516549Ben Murdoch// Create a JSON request for the info command.
1078086aeeaae12517475c22695a200be45495516549Ben MurdochDebugRequest.prototype.infoCommandToJSONRequest_ = function(args) {
1079086aeeaae12517475c22695a200be45495516549Ben Murdoch  var request;
1080086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (args && (args == 'break' || args == 'br')) {
1081086aeeaae12517475c22695a200be45495516549Ben Murdoch    // Build a evaluate request from the text command.
1082086aeeaae12517475c22695a200be45495516549Ben Murdoch    request = this.createRequest('listbreakpoints');
1083086aeeaae12517475c22695a200be45495516549Ben Murdoch    last_cmd = 'info break';
1084086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else if (args && (args == 'locals' || args == 'lo')) {
1085086aeeaae12517475c22695a200be45495516549Ben Murdoch    // Build a evaluate request from the text command.
1086086aeeaae12517475c22695a200be45495516549Ben Murdoch    request = this.createRequest('frame');
1087086aeeaae12517475c22695a200be45495516549Ben Murdoch    last_cmd = 'info locals';
1088086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else if (args && (args == 'args' || args == 'ar')) {
1089086aeeaae12517475c22695a200be45495516549Ben Murdoch    // Build a evaluate request from the text command.
1090086aeeaae12517475c22695a200be45495516549Ben Murdoch    request = this.createRequest('frame');
1091086aeeaae12517475c22695a200be45495516549Ben Murdoch    last_cmd = 'info args';
1092086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else {
1093086aeeaae12517475c22695a200be45495516549Ben Murdoch    throw new Error('Invalid info arguments.');
1094086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
1095086aeeaae12517475c22695a200be45495516549Ben Murdoch
1096086aeeaae12517475c22695a200be45495516549Ben Murdoch  return request.toJSONProtocol();
1097086aeeaae12517475c22695a200be45495516549Ben Murdoch};
1098086aeeaae12517475c22695a200be45495516549Ben Murdoch
1099086aeeaae12517475c22695a200be45495516549Ben Murdoch
1100086aeeaae12517475c22695a200be45495516549Ben MurdochDebugRequest.prototype.v8FlagsToJSONRequest_ = function(args) {
1101086aeeaae12517475c22695a200be45495516549Ben Murdoch  var request;
1102086aeeaae12517475c22695a200be45495516549Ben Murdoch  request = this.createRequest('v8flags');
1103086aeeaae12517475c22695a200be45495516549Ben Murdoch  request.arguments = {};
1104086aeeaae12517475c22695a200be45495516549Ben Murdoch  request.arguments.flags = args;
1105086aeeaae12517475c22695a200be45495516549Ben Murdoch  return request.toJSONProtocol();
1106086aeeaae12517475c22695a200be45495516549Ben Murdoch};
1107086aeeaae12517475c22695a200be45495516549Ben Murdoch
1108086aeeaae12517475c22695a200be45495516549Ben Murdoch
1109086aeeaae12517475c22695a200be45495516549Ben MurdochDebugRequest.prototype.gcToJSONRequest_ = function(args) {
1110086aeeaae12517475c22695a200be45495516549Ben Murdoch  var request;
1111086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!args) {
1112086aeeaae12517475c22695a200be45495516549Ben Murdoch    args = 'all';
1113086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
1114086aeeaae12517475c22695a200be45495516549Ben Murdoch  var args = args.split(/\s+/g);
1115086aeeaae12517475c22695a200be45495516549Ben Murdoch  var cmd = args[0];
1116086aeeaae12517475c22695a200be45495516549Ben Murdoch
1117086aeeaae12517475c22695a200be45495516549Ben Murdoch  switch(cmd) {
1118086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'all':
1119086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'quick':
1120086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'full':
1121086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'young':
1122086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'old':
1123086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'compact':
1124086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'sweep':
1125086aeeaae12517475c22695a200be45495516549Ben Murdoch    case 'scavenge': {
1126086aeeaae12517475c22695a200be45495516549Ben Murdoch      if (cmd == 'young') { cmd = 'quick'; }
1127086aeeaae12517475c22695a200be45495516549Ben Murdoch      else if (cmd == 'old') { cmd = 'full'; }
1128086aeeaae12517475c22695a200be45495516549Ben Murdoch
1129086aeeaae12517475c22695a200be45495516549Ben Murdoch      request = this.createRequest('gc');
1130086aeeaae12517475c22695a200be45495516549Ben Murdoch      request.arguments = {};
1131086aeeaae12517475c22695a200be45495516549Ben Murdoch      request.arguments.type = cmd;
1132086aeeaae12517475c22695a200be45495516549Ben Murdoch      break;
1133086aeeaae12517475c22695a200be45495516549Ben Murdoch    }
1134086aeeaae12517475c22695a200be45495516549Ben Murdoch      // Else fall thru to the default case below to report the error.
1135086aeeaae12517475c22695a200be45495516549Ben Murdoch    default:
1136086aeeaae12517475c22695a200be45495516549Ben Murdoch      throw new Error('Missing arguments after ' + cmd + '.');
1137086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
1138086aeeaae12517475c22695a200be45495516549Ben Murdoch  return request.toJSONProtocol();
1139086aeeaae12517475c22695a200be45495516549Ben Murdoch};
1140086aeeaae12517475c22695a200be45495516549Ben Murdoch
1141086aeeaae12517475c22695a200be45495516549Ben Murdoch
1142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Create a JSON request for the threads command.
1143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.threadsCommandToJSONRequest_ = function(args) {
1144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Build a threads request from the text command.
1145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var request = this.createRequest('threads');
1146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return request.toJSONProtocol();
1147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
1148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Handle the trace command.
1151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.traceCommand_ = function(args) {
1152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Process arguments.
1153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args && args.length > 0) {
1154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (args == 'compile') {
1155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      trace_compile = !trace_compile;
1156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      print('Tracing of compiled scripts ' + (trace_compile ? 'on' : 'off'));
1157086aeeaae12517475c22695a200be45495516549Ben Murdoch    } else if (args === 'debug json' || args === 'json' || args === 'packets') {
1158086aeeaae12517475c22695a200be45495516549Ben Murdoch      trace_debug_json = !trace_debug_json;
1159086aeeaae12517475c22695a200be45495516549Ben Murdoch      print('Tracing of debug json packets ' +
1160086aeeaae12517475c22695a200be45495516549Ben Murdoch            (trace_debug_json ? 'on' : 'off'));
1161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
1162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      throw new Error('Invalid trace arguments.');
1163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    throw new Error('Invalid trace arguments.');
1166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
11673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Handle the help command.
1170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebugRequest.prototype.helpCommand_ = function(args) {
1171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Help os quite simple.
1172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (args && args.length > 0) {
1173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    print('warning: arguments to \'help\' are ignored');
1174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1176086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('Note: <> denotes symbollic values to be replaced with real values.');
1177086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('Note: [] denotes optional parts of commands, or optional options / arguments.');
1178086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('      e.g. d[elete] - you get the same command if you type d or delete.');
1179086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1180086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('[break] - break as soon as possible');
1181086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('b[reak] location [condition]');
1182086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('        - break on named function: location is a function name');
1183086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('        - break on function: location is #<id>#');
1184086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('        - break on script position: location is name:line[:column]');
1185086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1186086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('clear <breakpoint #>       - deletes the specified user defined breakpoint');
1187086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('d[elete]  <breakpoint #>   - deletes the specified user defined breakpoint');
1188086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('dis[able] <breakpoint #>   - disables the specified user defined breakpoint');
1189086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('dis[able] exc[eptions] [[all] | unc[aught]]');
1190086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('                           - disables breaking on exceptions');
1191086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('en[able]  <breakpoint #>   - enables the specified user defined breakpoint');
1192086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('en[able]  exc[eptions] [[all] | unc[aught]]');
1193086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('                           - enables breaking on exceptions');
1194086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1195086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('b[ack]t[race] [n] | [-n] | [from to]');
1196086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('                           - prints the stack back trace');
1197086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('f[rame]                    - prints info about the current frame context');
1198086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('f[rame] <frame #>          - set context to specified frame #');
1199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  print('scopes');
1200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  print('scope <scope #>');
1201086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1202086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('up                         - set context to caller of current frame');
1203086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('do[wn]                     - set context to callee of current frame');
1204086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('inf[o] br[eak]             - prints info about breakpoints in use');
1205086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('inf[o] ar[gs]              - prints info about arguments of the current function');
1206086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('inf[o] lo[cals]            - prints info about locals in the current function');
1207086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  print('step [in | next | out| min [step count]]');
1209086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('c[ontinue]                 - continue executing after a breakpoint');
1210086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('s[tep]   [<N>]             - step into the next N callees (default N is 1)');
1211086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('s[tep]i  [<N>]             - step into the next N callees (default N is 1)');
1212086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('n[ext]   [<N>]             - step over the next N callees (default N is 1)');
1213086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('fin[ish] [<N>]             - step out of N frames (default N is 1)');
1214086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1215086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('p[rint] <expression>       - prints the result of the specified expression');
1216086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('dir <expression>           - prints the object structure of the result');
1217086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('set <var> = <expression>   - executes the specified statement');
1218086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1219086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('l[ist]                     - list the source code around for the current pc');
1220086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('l[ist] [- | <start>,<end>] - list the specified range of source code');
1221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  print('source [from line [num lines]]');
1222086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('scr[ipts] [native|extensions|all]');
1223086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('scr[ipts] [<filter text>]  - list scripts with the specified text in its description');
1224086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1225086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('gc                         - runs the garbage collector');
1226086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  print('trace compile');
1228086aeeaae12517475c22695a200be45495516549Ben Murdoch  // hidden command: trace debug json - toggles tracing of debug json packets
1229086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('');
1230086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('disconnect|exit|quit       - disconnects and quits the debugger');
1231086aeeaae12517475c22695a200be45495516549Ben Murdoch  print('help                       - prints this help information');
12323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction formatHandleReference_(value) {
1236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (value.handle() >= 0) {
1237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return '#' + value.handle() + '#';
1238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return '#Transient#';
1240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction formatObject_(value, include_properties) {
1245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var result = '';
1246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += formatHandleReference_(value);
12473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  result += ', type: object';
1248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += ', constructor ';
1249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var ctor = value.constructorFunctionValue();
1250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += formatHandleReference_(ctor);
1251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += ', __proto__ ';
1252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var proto = value.protoObjectValue();
1253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += formatHandleReference_(proto);
1254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += ', ';
1255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += value.propertyCount();
1256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result +=  ' properties.';
1257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (include_properties) {
1258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    result +=  '\n';
1259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (var i = 0; i < value.propertyCount(); i++) {
1260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '  ';
1261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += value.propertyName(i);
1262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += ': ';
1263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var property_value = value.propertyValue(i);
1264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (property_value instanceof ProtocolReference) {
1265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += '<no type>';
1266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      } else {
1267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (property_value && property_value.type()) {
1268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += property_value.type();
1269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        } else {
1270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += '<no type>';
1271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
1272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
1273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += ' ';
1274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += formatHandleReference_(property_value);
1275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '\n';
1276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
1279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction formatScope_(scope) {
1283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var result = '';
1284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var index = scope.index;
1285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += '#' + (index <= 9 ? '0' : '') + index;
1286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += ' ';
1287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (scope.type) {
1288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case Debug.ScopeType.Global:
1289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += 'Global, ';
1290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '#' + scope.object.ref + '#';
1291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case Debug.ScopeType.Local:
1293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += 'Local';
1294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case Debug.ScopeType.With:
1296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += 'With, ';
1297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '#' + scope.object.ref + '#';
1298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case Debug.ScopeType.Catch:
1300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += 'Catch, ';
1301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += '#' + scope.object.ref + '#';
1302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case Debug.ScopeType.Closure:
1304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += 'Closure';
1305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
1307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      result += 'UNKNOWN';
1308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
1310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1313086aeeaae12517475c22695a200be45495516549Ben Murdochfunction refObjectToString_(protocolPackage, handle) {
1314086aeeaae12517475c22695a200be45495516549Ben Murdoch  var value = protocolPackage.lookup(handle);
1315086aeeaae12517475c22695a200be45495516549Ben Murdoch  var result = '';
1316086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (value.isString()) {
1317086aeeaae12517475c22695a200be45495516549Ben Murdoch    result = '"' + value.value() + '"';
1318086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else if (value.isPrimitive()) {
1319086aeeaae12517475c22695a200be45495516549Ben Murdoch    result = value.valueString();
1320086aeeaae12517475c22695a200be45495516549Ben Murdoch  } else if (value.isObject()) {
1321086aeeaae12517475c22695a200be45495516549Ben Murdoch    result += formatObject_(value, true);
1322086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
1323086aeeaae12517475c22695a200be45495516549Ben Murdoch  return result;
1324086aeeaae12517475c22695a200be45495516549Ben Murdoch}
1325086aeeaae12517475c22695a200be45495516549Ben Murdoch
1326086aeeaae12517475c22695a200be45495516549Ben Murdoch
1327086aeeaae12517475c22695a200be45495516549Ben Murdoch// Rounds number 'num' to 'length' decimal places.
1328086aeeaae12517475c22695a200be45495516549Ben Murdochfunction roundNumber(num, length) {
1329086aeeaae12517475c22695a200be45495516549Ben Murdoch  var factor = Math.pow(10, length);
1330086aeeaae12517475c22695a200be45495516549Ben Murdoch  return Math.round(num * factor) / factor;
1331086aeeaae12517475c22695a200be45495516549Ben Murdoch}
1332086aeeaae12517475c22695a200be45495516549Ben Murdoch
1333086aeeaae12517475c22695a200be45495516549Ben Murdoch
1334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Convert a JSON response to text for display in a text based debugger.
1335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction DebugResponseDetails(response) {
13363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  var details = { text: '', running: false };
1337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  try {
1339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (!response.success()) {
1340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      details.text = response.message();
1341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return details;
1342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Get the running state.
1345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    details.running = response.running();
1346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var body = response.body();
1348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    var result = '';
1349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    switch (response.command()) {
13506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      case 'suspend':
13516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block        details.text = 'stopped';
13526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block        break;
1353f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
1354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'setbreakpoint':
1355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result = 'set breakpoint #';
1356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += body.breakpoint;
1357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
1358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
13596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'clearbreakpoint':
1361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result = 'cleared breakpoint #';
1362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += body.breakpoint;
1363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
1364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
1365f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
1366086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'changebreakpoint':
1367086aeeaae12517475c22695a200be45495516549Ben Murdoch        result = 'successfully changed breakpoint';
1368086aeeaae12517475c22695a200be45495516549Ben Murdoch        details.text = result;
1369086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
1370086aeeaae12517475c22695a200be45495516549Ben Murdoch
137125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen      case 'listbreakpoints':
137225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen        result = 'breakpoints: (' + body.breakpoints.length + ')';
137325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen        for (var i = 0; i < body.breakpoints.length; i++) {
137425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          var breakpoint = body.breakpoints[i];
137525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          result += '\n id=' + breakpoint.number;
137625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          result += ' type=' + breakpoint.type;
137725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          if (breakpoint.script_id) {
137825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen              result += ' script_id=' + breakpoint.script_id;
137925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          }
138025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          if (breakpoint.script_name) {
138125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen              result += ' script_name=' + breakpoint.script_name;
138225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          }
13833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          if (breakpoint.script_regexp) {
13843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch              result += ' script_regexp=' + breakpoint.script_regexp;
13853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          }
1386086aeeaae12517475c22695a200be45495516549Ben Murdoch          result += ' line=' + (breakpoint.line + 1);
138725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          if (breakpoint.column != null) {
1388086aeeaae12517475c22695a200be45495516549Ben Murdoch            result += ' column=' + (breakpoint.column + 1);
138925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          }
139025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          if (breakpoint.groupId) {
139125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen            result += ' groupId=' + breakpoint.groupId;
139225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          }
139325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          if (breakpoint.ignoreCount) {
139425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen              result += ' ignoreCount=' + breakpoint.ignoreCount;
139525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          }
139625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          if (breakpoint.active === false) {
139725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen            result += ' inactive';
139825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          }
139925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          if (breakpoint.condition) {
140025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen            result += ' condition=' + breakpoint.condition;
140125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          }
140225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen          result += ' hit_count=' + breakpoint.hit_count;
140325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen        }
1404086aeeaae12517475c22695a200be45495516549Ben Murdoch        if (body.breakpoints.length === 0) {
1405086aeeaae12517475c22695a200be45495516549Ben Murdoch          result = "No user defined breakpoints\n";
1406086aeeaae12517475c22695a200be45495516549Ben Murdoch        } else {
1407086aeeaae12517475c22695a200be45495516549Ben Murdoch          result += '\n';
1408086aeeaae12517475c22695a200be45495516549Ben Murdoch        }
1409086aeeaae12517475c22695a200be45495516549Ben Murdoch        if (body.breakOnExceptions) {
1410086aeeaae12517475c22695a200be45495516549Ben Murdoch          result += '* breaking on ALL exceptions is enabled\n';
1411086aeeaae12517475c22695a200be45495516549Ben Murdoch        } else if (body.breakOnUncaughtExceptions) {
1412086aeeaae12517475c22695a200be45495516549Ben Murdoch          result += '* breaking on UNCAUGHT exceptions is enabled\n';
1413086aeeaae12517475c22695a200be45495516549Ben Murdoch        } else {
141469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch          result += '* all exception breakpoints are disabled\n';
1415086aeeaae12517475c22695a200be45495516549Ben Murdoch        }
1416086aeeaae12517475c22695a200be45495516549Ben Murdoch        details.text = result;
1417086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
1418086aeeaae12517475c22695a200be45495516549Ben Murdoch
1419086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'setexceptionbreak':
1420086aeeaae12517475c22695a200be45495516549Ben Murdoch        result = 'Break on ' + body.type + ' exceptions: ';
1421086aeeaae12517475c22695a200be45495516549Ben Murdoch        result += body.enabled ? 'enabled' : 'disabled';
142225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen        details.text = result;
142325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen        break;
14246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'backtrace':
1426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (body.totalFrames == 0) {
1427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result = '(empty stack)';
1428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        } else {
1429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          var result = 'Frames #' + body.fromFrame + ' to #' +
1430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              (body.toFrame - 1) + ' of ' + body.totalFrames + '\n';
1431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          for (i = 0; i < body.frames.length; i++) {
1432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            if (i != 0) result += '\n';
1433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += body.frames[i].text;
1434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
1435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
1436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
1437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
14386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'frame':
1440086aeeaae12517475c22695a200be45495516549Ben Murdoch        if (last_cmd === 'info locals') {
1441086aeeaae12517475c22695a200be45495516549Ben Murdoch          var locals = body.locals;
1442086aeeaae12517475c22695a200be45495516549Ben Murdoch          if (locals.length === 0) {
1443086aeeaae12517475c22695a200be45495516549Ben Murdoch            result = 'No locals';
1444086aeeaae12517475c22695a200be45495516549Ben Murdoch          } else {
1445086aeeaae12517475c22695a200be45495516549Ben Murdoch            for (var i = 0; i < locals.length; i++) {
1446086aeeaae12517475c22695a200be45495516549Ben Murdoch              var local = locals[i];
1447086aeeaae12517475c22695a200be45495516549Ben Murdoch              result += local.name + ' = ';
1448086aeeaae12517475c22695a200be45495516549Ben Murdoch              result += refObjectToString_(response, local.value.ref);
1449086aeeaae12517475c22695a200be45495516549Ben Murdoch              result += '\n';
1450086aeeaae12517475c22695a200be45495516549Ben Murdoch            }
1451086aeeaae12517475c22695a200be45495516549Ben Murdoch          }
1452086aeeaae12517475c22695a200be45495516549Ben Murdoch        } else if (last_cmd === 'info args') {
1453086aeeaae12517475c22695a200be45495516549Ben Murdoch          var args = body.arguments;
1454086aeeaae12517475c22695a200be45495516549Ben Murdoch          if (args.length === 0) {
1455086aeeaae12517475c22695a200be45495516549Ben Murdoch            result = 'No arguments';
1456086aeeaae12517475c22695a200be45495516549Ben Murdoch          } else {
1457086aeeaae12517475c22695a200be45495516549Ben Murdoch            for (var i = 0; i < args.length; i++) {
1458086aeeaae12517475c22695a200be45495516549Ben Murdoch              var arg = args[i];
1459086aeeaae12517475c22695a200be45495516549Ben Murdoch              result += arg.name + ' = ';
1460086aeeaae12517475c22695a200be45495516549Ben Murdoch              result += refObjectToString_(response, arg.value.ref);
1461086aeeaae12517475c22695a200be45495516549Ben Murdoch              result += '\n';
1462086aeeaae12517475c22695a200be45495516549Ben Murdoch            }
1463086aeeaae12517475c22695a200be45495516549Ben Murdoch          }
1464086aeeaae12517475c22695a200be45495516549Ben Murdoch        } else {
1465086aeeaae12517475c22695a200be45495516549Ben Murdoch          result = SourceUnderline(body.sourceLineText,
1466086aeeaae12517475c22695a200be45495516549Ben Murdoch                                   body.column);
1467086aeeaae12517475c22695a200be45495516549Ben Murdoch          Debug.State.currentSourceLine = body.line;
1468086aeeaae12517475c22695a200be45495516549Ben Murdoch          Debug.State.currentFrame = body.index;
1469086aeeaae12517475c22695a200be45495516549Ben Murdoch          Debug.State.displaySourceStartLine = -1;
1470086aeeaae12517475c22695a200be45495516549Ben Murdoch          Debug.State.displaySourceEndLine = -1;
1471086aeeaae12517475c22695a200be45495516549Ben Murdoch        }
1472086aeeaae12517475c22695a200be45495516549Ben Murdoch        details.text = result;
1473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
14746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'scopes':
1476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (body.totalScopes == 0) {
1477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result = '(no scopes)';
1478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        } else {
1479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result = 'Scopes #' + body.fromScope + ' to #' +
1480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   (body.toScope - 1) + ' of ' + body.totalScopes + '\n';
1481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          for (i = 0; i < body.scopes.length; i++) {
1482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            if (i != 0) {
1483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += '\n';
1484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            }
1485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += formatScope_(body.scopes[i]);
1486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
1487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
1488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
1489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
1490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'scope':
1492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += formatScope_(body);
1493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += '\n';
1494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var scope_object_value = response.lookup(body.object.ref);
1495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += formatObject_(scope_object_value, true);
1496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
1497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
14986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'evaluate':
1500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'lookup':
1501e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case 'getobj':
1502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (last_cmd == 'p' || last_cmd == 'print') {
1503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result = body.text;
1504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        } else {
1505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          var value;
1506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (lookup_handle) {
1507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            value = response.bodyValue(lookup_handle);
1508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          } else {
1509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            value = response.bodyValue();
1510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
1511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (value.isObject()) {
1512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += formatObject_(value, true);
1513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          } else {
1514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += 'type: ';
1515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += value.type();
1516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            if (!value.isUndefined() && !value.isNull()) {
1517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += ', ';
1518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              if (value.isString()) {
1519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                result += '"';
1520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              }
1521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += value.value();
1522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              if (value.isString()) {
1523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                result += '"';
1524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              }
1525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            }
1526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += '\n';
1527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
1528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
1529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
1530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
1531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'references':
1533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var count = body.length;
1534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += 'found ' + count + ' objects';
1535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        result += '\n';
1536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        for (var i = 0; i < count; i++) {
1537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          var value = response.bodyValue(i);
1538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += formatObject_(value, false);
1539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += '\n';
1540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
1541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
1542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
15436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'source':
1545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        // Get the source from the response.
1546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var source = body.source;
1547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var from_line = body.fromLine + 1;
1548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var lines = source.split('\n');
1549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var maxdigits = 1 + Math.floor(log10(from_line + lines.length));
1550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (maxdigits < 3) {
1551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          maxdigits = 3;
1552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
1553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var result = '';
1554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        for (var num = 0; num < lines.length; num++) {
1555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          // Check if there's an extra newline at the end.
1556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (num == (lines.length - 1) && lines[num].length == 0) {
1557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            break;
1558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
1559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          var current_line = from_line + num;
1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          var spacer = maxdigits - (1 + Math.floor(log10(current_line)));
1562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (current_line == Debug.State.currentSourceLine + 1) {
1563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            for (var i = 0; i < maxdigits; i++) {
1564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += '>';
1565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            }
1566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += '  ';
1567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          } else {
1568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            for (var i = 0; i < spacer; i++) {
1569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += ' ';
1570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            }
1571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += current_line + ': ';
1572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
1573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += lines[num];
1574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += '\n';
1575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
1576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
1577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
15786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'scripts':
1580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var result = '';
1581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        for (i = 0; i < body.length; i++) {
1582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (i != 0) result += '\n';
1583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (body[i].id) {
1584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += body[i].id;
1585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          } else {
1586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += '[no id]';
1587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
1588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += ', ';
1589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (body[i].name) {
1590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += body[i].name;
1591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          } else {
1592086aeeaae12517475c22695a200be45495516549Ben Murdoch            if (body[i].compilationType == Debug.ScriptCompilationType.Eval
1593086aeeaae12517475c22695a200be45495516549Ben Murdoch                && body[i].evalFromScript
1594086aeeaae12517475c22695a200be45495516549Ben Murdoch                ) {
1595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += 'eval from ';
1596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              var script_value = response.lookup(body[i].evalFromScript.ref);
1597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += ' ' + script_value.field('name');
1598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += ':' + (body[i].evalFromLocation.line + 1);
1599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += ':' + body[i].evalFromLocation.column;
1600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            } else if (body[i].compilationType ==
1601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                       Debug.ScriptCompilationType.JSON) {
1602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += 'JSON ';
1603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            } else {  // body[i].compilation == Debug.ScriptCompilationType.Host
1604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              result += '[unnamed] ';
1605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            }
1606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
1607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += ' (lines: ';
1608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += body[i].lineCount;
1609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += ', length: ';
1610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += body[i].sourceLength;
1611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (body[i].type == Debug.ScriptType.Native) {
1612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += ', native';
1613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          } else if (body[i].type == Debug.ScriptType.Extension) {
1614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            result += ', extension';
1615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
1616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += '), [';
1617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          var sourceStart = body[i].sourceStart;
1618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          if (sourceStart.length > 40) {
1619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            sourceStart = sourceStart.substring(0, 37) + '...';
1620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          }
1621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += sourceStart;
1622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += ']';
1623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
1624086aeeaae12517475c22695a200be45495516549Ben Murdoch        if (body.length == 0) {
1625086aeeaae12517475c22695a200be45495516549Ben Murdoch          result = "no matching scripts found";
1626086aeeaae12517475c22695a200be45495516549Ben Murdoch        }
1627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
1628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'threads':
1631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        var result = 'Active V8 threads: ' + body.totalThreads + '\n';
1632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        body.threads.sort(function(a, b) { return a.id - b.id; });
1633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        for (i = 0; i < body.threads.length; i++) {
1634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += body.threads[i].current ? '*' : ' ';
1635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += ' ';
1636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += body.threads[i].id;
1637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          result += '\n';
1638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
1639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = result;
1640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
1641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case 'continue':
1643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text = "(running)";
1644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
16456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1646086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'v8flags':
1647086aeeaae12517475c22695a200be45495516549Ben Murdoch        details.text = "flags set";
1648086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
1649086aeeaae12517475c22695a200be45495516549Ben Murdoch
1650086aeeaae12517475c22695a200be45495516549Ben Murdoch      case 'gc':
1651086aeeaae12517475c22695a200be45495516549Ben Murdoch        details.text = "GC " + body.before + " => " + body.after;
1652086aeeaae12517475c22695a200be45495516549Ben Murdoch        if (body.after > (1024*1024)) {
1653086aeeaae12517475c22695a200be45495516549Ben Murdoch          details.text +=
1654086aeeaae12517475c22695a200be45495516549Ben Murdoch              " (" + roundNumber(body.before/(1024*1024), 1) + "M => " +
1655086aeeaae12517475c22695a200be45495516549Ben Murdoch                     roundNumber(body.after/(1024*1024), 1) + "M)";
1656086aeeaae12517475c22695a200be45495516549Ben Murdoch        } else if (body.after > 1024) {
1657086aeeaae12517475c22695a200be45495516549Ben Murdoch          details.text +=
1658086aeeaae12517475c22695a200be45495516549Ben Murdoch              " (" + roundNumber(body.before/1024, 1) + "K => " +
1659086aeeaae12517475c22695a200be45495516549Ben Murdoch                     roundNumber(body.after/1024, 1) + "K)";
1660086aeeaae12517475c22695a200be45495516549Ben Murdoch        }
1661086aeeaae12517475c22695a200be45495516549Ben Murdoch        break;
1662086aeeaae12517475c22695a200be45495516549Ben Murdoch
1663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      default:
1664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        details.text =
166525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen            'Response for unknown command \'' + response.command() + '\'' +
166625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen            ' (' + response.raw_json() + ')';
1667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } catch (e) {
1669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    details.text = 'Error: "' + e + '" formatting response';
1670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
16716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return details;
16733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Protocol packages send from the debugger.
1678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @param {string} json - raw protocol packet as JSON string.
1679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @constructor
1680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction ProtocolPackage(json) {
168225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  this.raw_json_ = json;
1683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.packet_ = JSON.parse(json);
1684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.refs_ = [];
1685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (this.packet_.refs) {
1686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (var i = 0; i < this.packet_.refs.length; i++) {
1687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.refs_[this.packet_.refs[i].handle] = this.packet_.refs[i];
1688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the packet type.
1695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {String} the packet type
1696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.type = function() {
1698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.type;
16993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the packet event.
1704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {Object} the packet event
1705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.event = function() {
1707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.event;
17083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the packet request sequence.
1713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {number} the packet request sequence
1714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.requestSeq = function() {
1716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.request_seq;
17173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the packet request sequence.
1722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {number} the packet request sequence
1723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.running = function() {
1725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.running ? true : false;
17263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.success = function() {
1730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.success ? true : false;
17313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.message = function() {
1735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.message;
17363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.command = function() {
1740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.command;
17413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.body = function() {
1745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.body;
17463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.bodyValue = function(index) {
1750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (index != null) {
1751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return new ProtocolValue(this.packet_.body[index], this);
1752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return new ProtocolValue(this.packet_.body, this);
1754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
17553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.body = function() {
1759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.body;
17603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolPackage.prototype.lookup = function(handle) {
1764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var value = this.refs_[handle];
1765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (value) {
1766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return new ProtocolValue(value, this);
1767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return new ProtocolReference(handle);
1769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
17703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
177325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian MonsenProtocolPackage.prototype.raw_json = function() {
177425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  return this.raw_json_;
17753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
177625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
177725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
1778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction ProtocolValue(value, packet) {
1779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.value_ = value;
1780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.packet_ = packet;
1781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the value type.
1786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {String} the value type
1787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.type = function() {
1789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.type;
17903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
17946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * Get a metadata field from a protocol value.
1795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {Object} the metadata field value
1796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.field = function(name) {
1798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_[name];
17993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is a primitive value.
1804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is primitive
1805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.isPrimitive = function() {
1807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.isUndefined() || this.isNull() || this.isBoolean() ||
1808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         this.isNumber() || this.isString();
18093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the object handle.
1814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {number} the value handle
1815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.handle = function() {
1817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.handle;
18183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is undefined.
1823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is undefined
1824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.isUndefined = function() {
1826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.type == 'undefined';
18273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is null.
1832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is null
1833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.isNull = function() {
1835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.type == 'null';
18363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is a boolean.
1841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is a boolean
1842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.isBoolean = function() {
1844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.type == 'boolean';
18453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is a number.
1850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is a number
1851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.isNumber = function() {
1853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.type == 'number';
18543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is a string.
1859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is a string
1860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.isString = function() {
1862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.type == 'string';
18633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is an object.
1868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is an object
1869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.isObject = function() {
1871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.type == 'object' || this.value_.type == 'function' ||
1872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         this.value_.type == 'error' || this.value_.type == 'regexp';
18733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the constructor function
1878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {ProtocolValue} constructor function
1879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.constructorFunctionValue = function() {
1881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var ctor = this.value_.constructorFunction;
1882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.lookup(ctor.ref);
18833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the __proto__ value
1888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {ProtocolValue} __proto__ value
1889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.protoObjectValue = function() {
1891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var proto = this.value_.protoObject;
1892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.lookup(proto.ref);
18933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the number og properties.
1898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {number} the number of properties
1899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.propertyCount = function() {
1901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.properties ? this.value_.properties.length : 0;
19023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the specified property name.
1907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {string} property name
1908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.propertyName = function(index) {
1910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var property = this.value_.properties[index];
1911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return property.name;
19123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Return index for the property name.
1917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @param name The property name to look for
1918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {number} index for the property name
1919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.propertyIndex = function(name) {
1921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (var i = 0; i < this.propertyCount(); i++) {
1922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (this.value_.properties[i].name == name) {
1923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return i;
1924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return null;
19273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Get the specified property value.
1932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {ProtocolValue} property value
1933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.propertyValue = function(index) {
1935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var property = this.value_.properties[index];
1936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.packet_.lookup(property.ref);
19373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block/**
1941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * Check is the value is a string.
1942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block * @return {boolean} true if the value is a string
1943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block */
1944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolValue.prototype.value = function() {
1945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.value_.value;
19463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1949086aeeaae12517475c22695a200be45495516549Ben MurdochProtocolValue.prototype.valueString = function() {
1950086aeeaae12517475c22695a200be45495516549Ben Murdoch  return this.value_.text;
19513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1952086aeeaae12517475c22695a200be45495516549Ben Murdoch
1953086aeeaae12517475c22695a200be45495516549Ben Murdoch
1954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction ProtocolReference(handle) {
1955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.handle_ = handle;
1956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockProtocolReference.prototype.handle = function() {
1960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.handle_;
19613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A more universal stringify that supports more types than JSON.
1965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Used by the d8 shell to output results.
1966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar stringifyDepthLimit = 4;  // To avoid crashing on cyclic objects
1967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction Stringify(x, depth) {
1969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (depth === undefined)
1970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    depth = stringifyDepthLimit;
1971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  else if (depth === 0)
1972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return "*";
1973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (typeof x) {
1974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case "undefined":
1975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return "undefined";
1976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case "boolean":
1977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case "number":
1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case "function":
1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return x.toString();
1980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case "string":
1981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return "\"" + x.toString() + "\"";
1982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case "symbol":
1983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return x.toString();
1984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case "object":
1985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (IS_NULL(x)) return "null";
1986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (x.constructor && x.constructor.name === "Array") {
1987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        var elems = [];
1988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        for (var i = 0; i < x.length; ++i) {
1989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          elems.push(
1990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            {}.hasOwnProperty.call(x, i) ? Stringify(x[i], depth - 1) : "");
1991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return "[" + elems.join(", ") + "]";
1993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
1994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      try {
1995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        var string = String(x);
1996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (string && string !== "[object Object]") return string;
1997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } catch(e) {}
1998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      var props = [];
1999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      var names = Object.getOwnPropertyNames(x);
2000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      names = names.concat(Object.getOwnPropertySymbols(x));
2001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var i in names) {
2002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        var name = names[i];
2003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        var desc = Object.getOwnPropertyDescriptor(x, name);
2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (IS_UNDEFINED(desc)) continue;
2005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (IS_SYMBOL(name)) name = "[" + Stringify(name) + "]";
2006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if ("value" in desc) {
2007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          props.push(name + ": " + Stringify(desc.value, depth - 1));
2008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (desc.get) {
2010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          var getter = Stringify(desc.get);
2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          props.push("get " + name + getter.slice(getter.indexOf('(')));
2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (desc.set) {
2014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          var setter = Stringify(desc.set);
2015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          props.push("set " + name + setter.slice(setter.indexOf('(')));
2016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return "{" + props.join(", ") + "}";
2019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
2020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return "[crazy non-standard shit]";
2021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2023