15a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// Copyright 2008 the V8 project authors. All rights reserved.
25a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// Redistribution and use in source and binary forms, with or without
35a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// modification, are permitted provided that the following conditions are
45a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// met:
55a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//
65a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//     * Redistributions of source code must retain the above copyright
75a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//       notice, this list of conditions and the following disclaimer.
85a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//     * Redistributions in binary form must reproduce the above
95a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//       copyright notice, this list of conditions and the following
105a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//       disclaimer in the documentation and/or other materials provided
115a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//       with the distribution.
125a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//     * Neither the name of Google Inc. nor the names of its
135a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//       contributors may be used to endorse or promote products derived
145a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//       from this software without specific prior written permission.
155a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org//
165a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
28f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org"use strict";
29f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org
305a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgString.prototype.startsWith = function (str) {
311b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (str.length > this.length) {
325a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    return false;
331b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  }
345a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  return this.substr(0, str.length) == str;
351b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
3637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
3737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction log10(num) {
3837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return Math.log(num)/Math.log(10);
3937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
405a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
415a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgfunction ToInspectableObject(obj) {
425a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  if (!obj && typeof obj === 'object') {
435a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    return void 0;
445a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  } else {
455a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    return Object(obj);
465a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  }
475a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}
485a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
495a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgfunction GetCompletions(global, last, full) {
505a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  var full_tokens = full.split();
515a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  full = full_tokens.pop();
525a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  var parts = full.split('.');
535a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  parts.pop();
545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  var current = global;
555a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  for (var i = 0; i < parts.length; i++) {
565a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    var part = parts[i];
575a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    var next = current[part];
581b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (!next) {
595a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org      return [];
601b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    }
615a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    current = next;
625a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  }
635a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  var result = [];
645a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  current = ToInspectableObject(current);
655a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  while (typeof current !== 'undefined') {
665a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    var mirror = new $debug.ObjectMirror(current);
675a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    var properties = mirror.properties();
685a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    for (var i = 0; i < properties.length; i++) {
695a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org      var name = properties[i].name();
701b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      if (typeof name === 'string' && name.startsWith(last)) {
715a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org        result.push(name);
721b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      }
735a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    }
74750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    current = ToInspectableObject(Object.getPrototypeOf(current));
755a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  }
765a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  return result;
775a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}
7837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
7937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
8037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Global object holding debugger related constants and state.
81f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar Debug = {};
8237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
8337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
8437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Debug events which can occour in the V8 JavaScript engine. These originate
85245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// from the API include file v8-debug.h.
8637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebug.DebugEvent = { Break: 1,
8737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                     Exception: 2,
8837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                     NewFunction: 3,
8937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                     BeforeCompile: 4,
9037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                     AfterCompile: 5 };
9137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
9237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
9337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// The different types of scripts matching enum ScriptType in objects.h.
9437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebug.ScriptType = { Native: 0,
9537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                     Extension: 1,
9637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                     Normal: 2 };
9737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
9837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
99e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org// The different types of script compilations matching enum
100e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org// Script::CompilationType in objects.h.
101e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgDebug.ScriptCompilationType = { Host: 0,
102e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org                                Eval: 1,
103e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org                                JSON: 2 };
104e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
105e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
106eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org// The different types of scopes matching constants runtime.cc.
107eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgDebug.ScopeType = { Global: 0,
108eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org                    Local: 1,
109eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org                    With: 2,
110a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org                    Closure: 3,
1114acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org                    Catch: 4,
1124acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org                    Block: 5 };
113eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
114eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
11537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Current debug state.
116f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kNoFrame = -1;
11737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebug.State = {
11837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  currentFrame: kNoFrame,
119d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  displaySourceStartLine: -1,
120d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  displaySourceEndLine: -1,
12137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  currentSourceLine: -1
1221b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
123245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgvar trace_compile = false;  // Tracing all compile events?
124d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgvar trace_debug_json = false; // Tracing all debug json packets?
125ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgvar last_cmd = '';
126d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgvar repeat_cmd_line = '';
127d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgvar is_running = true;
128ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// Global variable used to store whether a handle was requested.
129ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgvar lookup_handle = null;
130d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
131d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// Copied from debug-delay.js.  This is needed below:
132d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgfunction ScriptTypeFlag(type) {
133d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return (1 << type);
134d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org}
13537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
13637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
1377be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// Process a debugger JSON message into a display text and a running status.
1387be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// This function returns an object with properties "text" and "running" holding
1397be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// this information.
1407be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgfunction DebugMessageDetails(message) {
141d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (trace_debug_json) {
142d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    print("received: '" + message + "'");
143d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
144061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  // Convert the JSON string to an object.
1457be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  var response = new ProtocolPackage(message);
146d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  is_running = response.running();
1477be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
1487be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  if (response.type() == 'event') {
1497be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    return DebugEventDetails(response);
1507be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  } else {
1517be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    return DebugResponseDetails(response);
1527be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  }
1537be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org}
1547be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
1557be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgfunction DebugEventDetails(response) {
156ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  var details = {text:'', running:false};
1577be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
1587be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  // Get the running state.
1597be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  details.running = response.running();
160061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
161061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  var body = response.body();
1627be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  var result = '';
163061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  switch (response.event()) {
164061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    case 'break':
165061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org      if (body.breakpoints) {
1667be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += 'breakpoint';
167061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org        if (body.breakpoints.length > 1) {
1687be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += 's';
16937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
1707be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += ' #';
171061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org        for (var i = 0; i < body.breakpoints.length; i++) {
172245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org          if (i > 0) {
1737be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            result += ', #';
174245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org          }
1757be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += body.breakpoints[i];
17637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
177245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      } else {
1787be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += 'break';
17937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      }
1807be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += ' in ';
1817be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += body.invocationText;
1827be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += ', ';
1837be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += SourceInfo(body);
1847be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += '\n';
1857be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += SourceUnderline(body.sourceLineText, body.sourceColumn);
186061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org      Debug.State.currentSourceLine = body.sourceLine;
187d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      Debug.State.displaySourceStartLine = -1;
188d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      Debug.State.displaySourceEndLine = -1;
18937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      Debug.State.currentFrame = 0;
1907be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      details.text = result;
1917be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      break;
19225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
193061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    case 'exception':
194061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org      if (body.uncaught) {
1957be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += 'Uncaught: ';
196245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      } else {
1977be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += 'Exception: ';
198245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      }
1997be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += '"';
2007be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += body.exception.text;
2017be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += '"';
202061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org      if (body.sourceLine >= 0) {
2037be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += ', ';
2047be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += SourceInfo(body);
2057be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += '\n';
2067be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += SourceUnderline(body.sourceLineText, body.sourceColumn);
207061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org        Debug.State.currentSourceLine = body.sourceLine;
208d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        Debug.State.displaySourceStartLine = -1;
209d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        Debug.State.displaySourceEndLine = -1;
210245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        Debug.State.currentFrame = 0;
211245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      } else {
2127be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += ' (empty stack)';
213245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        Debug.State.currentSourceLine = -1;
214d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        Debug.State.displaySourceStartLine = -1;
215d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        Debug.State.displaySourceEndLine = -1;
216245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        Debug.State.currentFrame = kNoFrame;
217245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      }
2187be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      details.text = result;
2197be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      break;
220061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
221061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    case 'afterCompile':
222245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      if (trace_compile) {
2231b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        result = 'Source ' + body.script.name + ' compiled:\n';
224061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org        var source = body.script.source;
225245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        if (!(source[source.length - 1] == '\n')) {
2267be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += source;
227245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        } else {
2287be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += source.substring(0, source.length - 1);
229245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        }
230245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      }
2317be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      details.text = result;
2327be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      break;
2337be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
234d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'scriptCollected':
235d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      details.text = result;
236d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
237d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2387be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    default:
2397be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      details.text = 'Unknown debug event ' + response.event();
24037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
2417be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
2427be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return details;
2431b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
24437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
24537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
246061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.orgfunction SourceInfo(body) {
247061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  var result = '';
24825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
249061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  if (body.script) {
250061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    if (body.script.name) {
251061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org      result += body.script.name;
252061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    } else {
253061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org      result += '[unnamed]';
254061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    }
255061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  }
256061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  result += ' line ';
257061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  result += body.sourceLine + 1;
258061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  result += ' column ';
259061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  result += body.sourceColumn + 1;
26025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
261061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  return result;
262061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org}
263061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
264061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
26537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction SourceUnderline(source_text, position) {
26637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (!source_text) {
26737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    return;
26837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
26937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
27037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Create an underline with a caret pointing to the source position. If the
27137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // source contains a tab character the underline will have a tab character in
27237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // the same place otherwise the underline will have a space character.
27337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var underline = '';
27437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  for (var i = 0; i < position; i++) {
27537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (source_text[i] == '\t') {
27637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      underline += '\t';
27737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    } else {
27837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      underline += ' ';
27937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
28037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
28137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  underline += '^';
28237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
28337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Return the source line text with the underline beneath.
28437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return source_text + '\n' + underline;
2851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
28637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
28737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
28837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Converts a text command to a JSON request.
28937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction DebugCommandToJSONRequest(cmd_line) {
290d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var result = new DebugRequest(cmd_line).JSONRequest();
291d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (trace_debug_json && result) {
292d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    print("sending: '" + result + "'");
293d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
294d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return result;
2951b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
29637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
29737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
29837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction DebugRequest(cmd_line) {
29937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // If the very first character is a { assume that a JSON request have been
30037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // entered as a command. Converting that to a JSON request is trivial.
30137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (cmd_line && cmd_line.length > 0 && cmd_line.charAt(0) == '{') {
30237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    this.request_ = cmd_line;
30337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    return;
30437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
30537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
306d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Check for a simple carriage return to repeat the last command:
307d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var is_repeating = false;
308d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (cmd_line == '\n') {
309d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if (is_running) {
310d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      cmd_line = 'break'; // Not in debugger mode, break with a frame request.
311d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    } else {
312d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      cmd_line = repeat_cmd_line; // use command to repeat.
313d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      is_repeating = true;
314d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
315d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
316d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (!is_running) { // Only save the command if in debugger mode.
317d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    repeat_cmd_line = cmd_line;   // save last command.
318d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
319d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
32037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Trim string for leading and trailing whitespace.
32137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  cmd_line = cmd_line.replace(/^\s+|\s+$/g, '');
32237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
32337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Find the command.
32437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var pos = cmd_line.indexOf(' ');
32537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var cmd;
32637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var args;
32737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (pos == -1) {
32837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    cmd = cmd_line;
32937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    args = '';
33037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } else {
33137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    cmd = cmd_line.slice(0, pos);
33237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    args = cmd_line.slice(pos).replace(/^\s+|\s+$/g, '');
33337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
33437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
335d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if ((cmd === undefined) || !cmd) {
336d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    this.request_ = void 0;
337d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    return;
338d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
339d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
340d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  last_cmd = cmd;
341d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
34237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Switch on command.
34337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  switch (cmd) {
34437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'continue':
34537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'c':
34637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.continueCommandToJSONRequest_(args);
34737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
34837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
34937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'step':
35037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 's':
351d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.stepCommandToJSONRequest_(args, 'in');
352d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
353d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
354d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'stepi':
355d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'si':
356d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.stepCommandToJSONRequest_(args, 'min');
357d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
358d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
359d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'next':
360d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'n':
361d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.stepCommandToJSONRequest_(args, 'next');
362d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
363d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
364d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'finish':
365d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'fin':
366d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.stepCommandToJSONRequest_(args, 'out');
36737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
36837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
36937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'backtrace':
37037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'bt':
37137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.backtraceCommandToJSONRequest_(args);
37237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
37325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
37437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'frame':
37537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'f':
37637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.frameCommandToJSONRequest_(args);
37737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
37825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
379eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    case 'scopes':
380eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      this.request_ = this.scopesCommandToJSONRequest_(args);
381eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      break;
38225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
383eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    case 'scope':
384eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      this.request_ = this.scopeCommandToJSONRequest_(args);
385eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      break;
38625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
387d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'disconnect':
388d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'exit':
389d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'quit':
390d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.disconnectCommandToJSONRequest_(args);
391d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
392d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
393d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'up':
394d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ =
395d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          this.frameCommandToJSONRequest_('' +
396d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org                                          (Debug.State.currentFrame + 1));
397d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
39828a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org
399d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'down':
400d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'do':
401d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ =
402d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          this.frameCommandToJSONRequest_('' +
403d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org                                          (Debug.State.currentFrame - 1));
404d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
40528a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org
406d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'set':
40737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'print':
40837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'p':
40937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.printCommandToJSONRequest_(args);
41037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
41137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
412ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    case 'dir':
413ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      this.request_ = this.dirCommandToJSONRequest_(args);
414ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      break;
415ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
416245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    case 'references':
417245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      this.request_ = this.referencesCommandToJSONRequest_(args);
418245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      break;
419245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
420245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    case 'instances':
421245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      this.request_ = this.instancesCommandToJSONRequest_(args);
422245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      break;
423245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
424d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'list':
425d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'l':
426d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.listCommandToJSONRequest_(args);
427d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
42837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'source':
42937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.sourceCommandToJSONRequest_(args);
43037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
43125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
43237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'scripts':
433d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'script':
434d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'scr':
43537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.scriptsCommandToJSONRequest_(args);
43637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
43725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
43837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'break':
43937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'b':
44037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.breakCommandToJSONRequest_(args);
44137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
44225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
443dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    case 'breakpoints':
444dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    case 'bb':
445dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      this.request_ = this.breakpointsCommandToJSONRequest_(args);
446dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      break;
447dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
44837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'clear':
449d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'delete':
450d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'd':
45137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.clearCommandToJSONRequest_(args);
45237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
45337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
454bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    case 'threads':
455bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org      this.request_ = this.threadsCommandToJSONRequest_(args);
456bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org      break;
457bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
458d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'cond':
459d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.changeBreakpointCommandToJSONRequest_(args, 'cond');
460d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
461d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
462d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'enable':
463d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'en':
464d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ =
465d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          this.changeBreakpointCommandToJSONRequest_(args, 'enable');
466d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
467d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
468d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'disable':
469d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'dis':
470d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ =
471d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          this.changeBreakpointCommandToJSONRequest_(args, 'disable');
472d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
473d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
474d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'ignore':
475d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ =
476d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          this.changeBreakpointCommandToJSONRequest_(args, 'ignore');
477d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
478d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
479d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'info':
480d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'inf':
481d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.infoCommandToJSONRequest_(args);
482d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
483d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
484d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'flags':
485d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.v8FlagsToJSONRequest_(args);
486d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
487d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
488d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'gc':
489d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.gcToJSONRequest_(args);
490d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
491d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
492245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    case 'trace':
493d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'tr':
494245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      // Return undefined to indicate command handled internally (no JSON).
495245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      this.request_ = void 0;
496245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      this.traceCommand_(args);
497245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      break;
498245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
49937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'help':
50037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case '?':
50137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.helpCommand_(args);
502245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      // Return undefined to indicate command handled internally (no JSON).
503245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      this.request_ = void 0;
50437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
50537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
50637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    default:
50737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      throw new Error('Unknown command "' + cmd + '"');
50837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
50937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
51037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
51137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.JSONRequest = function() {
51237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return this.request_;
5131b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
51437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
51537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
51637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction RequestPacket(command) {
51737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  this.seq = 0;
51837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  this.type = 'request';
51937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  this.command = command;
52037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
52137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
52237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
52337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comRequestPacket.prototype.toJSONProtocol = function() {
52437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Encode the protocol header.
52537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var json = '{';
52637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  json += '"seq":' + this.seq;
52737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  json += ',"type":"' + this.type + '"';
52837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (this.command) {
52937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    json += ',"command":' + StringToJSON_(this.command);
53037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
53137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (this.arguments) {
53237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    json += ',"arguments":';
53337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    // Encode the arguments part.
53437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (this.arguments.toJSONProtocol) {
5351b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      json += this.arguments.toJSONProtocol();
53637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    } else {
53737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      json += SimpleObjectToJSON_(this.arguments);
53837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
53937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
54037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  json += '}';
54137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return json;
5421b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
54337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
54437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
54537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.createRequest = function(command) {
54637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return new RequestPacket(command);
54737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
54837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
54937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
550ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// Create a JSON request for the evaluation command.
551ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgDebugRequest.prototype.makeEvaluateJSONRequest_ = function(expression) {
552eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  lookup_handle = null;
5539ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
554ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Check if the expression is a handle id in the form #<handle>#.
555ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  var handle_match = expression.match(/^#([0-9]*)#$/);
556ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  if (handle_match) {
557eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    // Remember the handle requested in a global variable.
558eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    lookup_handle = parseInt(handle_match[1]);
559245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    // Build a lookup request.
560ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    var request = this.createRequest('lookup');
561ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    request.arguments = {};
562eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    request.arguments.handles = [ lookup_handle ];
563ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    return request.toJSONProtocol();
564ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  } else {
565ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    // Build an evaluate request.
566ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    var request = this.createRequest('evaluate');
567ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    request.arguments = {};
568ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    request.arguments.expression = expression;
569381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    // Request a global evaluation if there is no current frame.
570381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    if (Debug.State.currentFrame == kNoFrame) {
571381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org      request.arguments.global = true;
572381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    }
573ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    return request.toJSONProtocol();
574ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
575ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org};
576ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
577ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
578245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// Create a JSON request for the references/instances command.
579245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebugRequest.prototype.makeReferencesJSONRequest_ = function(handle, type) {
580245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Build a references request.
581245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var handle_match = handle.match(/^#([0-9]*)#$/);
582245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (handle_match) {
583245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    var request = this.createRequest('references');
584245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    request.arguments = {};
585245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    request.arguments.type = type;
586245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    request.arguments.handle = parseInt(handle_match[1]);
587245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return request.toJSONProtocol();
588245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  } else {
589245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    throw new Error('Invalid object id.');
590245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
591245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org};
592245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
593ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
59437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the continue command.
59537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.continueCommandToJSONRequest_ = function(args) {
59637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var request = this.createRequest('continue');
59737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
59837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
59937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
60037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
60137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the step command.
602d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugRequest.prototype.stepCommandToJSONRequest_ = function(args, type) {
60337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Requesting a step is through the continue command with additional
60437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // arguments.
60537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var request = this.createRequest('continue');
60637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  request.arguments = {};
60737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
60837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Process arguments if any.
609d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
610d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Only process args if the command is 'step' which is indicated by type being
611d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // set to 'in'.  For all other commands, ignore the args.
61237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args && args.length > 0) {
613d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    args = args.split(/\s+/g);
61437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
61537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (args.length > 2) {
61637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      throw new Error('Invalid step arguments.');
61737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
61837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
61937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (args.length > 0) {
620d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      // Check if we have a gdb stype step command.  If so, the 1st arg would
621d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      // be the step count.  If it's not a number, then assume that we're
622d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      // parsing for the legacy v8 step command.
623d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      var stepcount = Number(args[0]);
624d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (stepcount == Number.NaN) {
625d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        // No step count at arg 1.  Process as legacy d8 step command:
626d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (args.length == 2) {
627d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          var stepcount = parseInt(args[1]);
628d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          if (isNaN(stepcount) || stepcount <= 0) {
629d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            throw new Error('Invalid step count argument "' + args[0] + '".');
630d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          }
631d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          request.arguments.stepcount = stepcount;
63237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
63337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
634d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        // Get the step action.
635d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        switch (args[0]) {
636d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'in':
637d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'i':
638d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            request.arguments.stepaction = 'in';
639d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            break;
64025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
641d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'min':
642d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'm':
643d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            request.arguments.stepaction = 'min';
644d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            break;
64525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
646d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'next':
647d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'n':
648d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            request.arguments.stepaction = 'next';
649d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            break;
65025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
651d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'out':
652d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'o':
653d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            request.arguments.stepaction = 'out';
654d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            break;
65525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
656d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          default:
657d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            throw new Error('Invalid step argument "' + args[0] + '".');
658d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
659d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
660d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      } else {
661d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        // gdb style step commands:
662d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        request.arguments.stepaction = type;
663d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        request.arguments.stepcount = stepcount;
66437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      }
66537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
66637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } else {
667d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // Default is step of the specified type.
668d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    request.arguments.stepaction = type;
66937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
67037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
67137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
67237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
67337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
67437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
67537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the backtrace command.
67637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.backtraceCommandToJSONRequest_ = function(args) {
67737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Build a backtrace request from the text command.
67837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var request = this.createRequest('backtrace');
67925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
680b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  // Default is to show top 10 frames.
681b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  request.arguments = {};
682b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  request.arguments.fromFrame = 0;
683b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  request.arguments.toFrame = 10;
684b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
68537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  args = args.split(/\s*[ ]+\s*/g);
686b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  if (args.length == 1 && args[0].length > 0) {
687b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    var frameCount = parseInt(args[0]);
688b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (frameCount > 0) {
689b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      // Show top frames.
690b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      request.arguments.fromFrame = 0;
691b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      request.arguments.toFrame = frameCount;
692b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    } else {
693b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      // Show bottom frames.
694b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      request.arguments.fromFrame = 0;
695b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      request.arguments.toFrame = -frameCount;
696b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      request.arguments.bottom = true;
697b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    }
698b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  } else if (args.length == 2) {
69937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    var fromFrame = parseInt(args[0]);
70037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    var toFrame = parseInt(args[1]);
70137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (isNaN(fromFrame) || fromFrame < 0) {
70237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      throw new Error('Invalid start frame argument "' + args[0] + '".');
70337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
70437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (isNaN(toFrame) || toFrame < 0) {
70537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      throw new Error('Invalid end frame argument "' + args[1] + '".');
70637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
70737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (fromFrame > toFrame) {
70837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      throw new Error('Invalid arguments start frame cannot be larger ' +
70937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                      'than end frame.');
71037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
711b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    // Show frame range.
71237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments.fromFrame = fromFrame;
71337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments.toFrame = toFrame + 1;
714b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  } else if (args.length > 2) {
715b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    throw new Error('Invalid backtrace arguments.');
71637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
717b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
71837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
71937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
72037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
72137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
72237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the frame command.
72337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.frameCommandToJSONRequest_ = function(args) {
72437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Build a frame request from the text command.
72537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var request = this.createRequest('frame');
72637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  args = args.split(/\s*[ ]+\s*/g);
72737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args.length > 0 && args[0].length > 0) {
72837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments = {};
72937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments.number = args[0];
73037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
73137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
73237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
73337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
73437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
735eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org// Create a JSON request for the scopes command.
736eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgDebugRequest.prototype.scopesCommandToJSONRequest_ = function(args) {
737eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // Build a scopes request from the text command.
738eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var request = this.createRequest('scopes');
739eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return request.toJSONProtocol();
740eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org};
741eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
742eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
743eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org// Create a JSON request for the scope command.
744eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgDebugRequest.prototype.scopeCommandToJSONRequest_ = function(args) {
745eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // Build a scope request from the text command.
746eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var request = this.createRequest('scope');
747eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  args = args.split(/\s*[ ]+\s*/g);
748eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  if (args.length > 0 && args[0].length > 0) {
749eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    request.arguments = {};
750eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    request.arguments.number = args[0];
751eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
752eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return request.toJSONProtocol();
753eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org};
754eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
755eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
75637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the print command.
75737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.printCommandToJSONRequest_ = function(args) {
758ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Build an evaluate request from the text command.
75937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args.length == 0) {
76037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    throw new Error('Missing expression.');
76137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
762ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.makeEvaluateJSONRequest_(args);
763ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org};
76437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
76537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
766ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// Create a JSON request for the dir command.
767ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgDebugRequest.prototype.dirCommandToJSONRequest_ = function(args) {
768ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Build an evaluate request from the text command.
769ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  if (args.length == 0) {
770ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    throw new Error('Missing expression.');
771ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
772ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.makeEvaluateJSONRequest_(args);
77337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
77437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
77537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
776245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// Create a JSON request for the references command.
777245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebugRequest.prototype.referencesCommandToJSONRequest_ = function(args) {
778245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Build an evaluate request from the text command.
779245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (args.length == 0) {
780245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    throw new Error('Missing object id.');
781245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
78225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
783245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return this.makeReferencesJSONRequest_(args, 'referencedBy');
784245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org};
785245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
786245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
787245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// Create a JSON request for the instances command.
788245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebugRequest.prototype.instancesCommandToJSONRequest_ = function(args) {
789245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Build an evaluate request from the text command.
790245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (args.length == 0) {
791245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    throw new Error('Missing object id.');
792245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
79325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
794245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Build a references request.
795245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return this.makeReferencesJSONRequest_(args, 'constructedBy');
796245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org};
797245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
798245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
799d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// Create a JSON request for the list command.
800d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugRequest.prototype.listCommandToJSONRequest_ = function(args) {
801d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
802d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Default is ten lines starting five lines before the current location.
803d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (Debug.State.displaySourceEndLine == -1) {
804d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // If we list forwards, we will start listing after the last source end
805d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // line.  Set it to start from 5 lines before the current location.
806d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    Debug.State.displaySourceEndLine = Debug.State.currentSourceLine - 5;
807d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // If we list backwards, we will start listing backwards from the last
808d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // source start line.  Set it to start from 1 lines before the current
809d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // location.
810d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    Debug.State.displaySourceStartLine = Debug.State.currentSourceLine + 1;
811d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
812d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
813d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var from = Debug.State.displaySourceEndLine + 1;
814d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var lines = 10;
815d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
816d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Parse the arguments.
817d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  args = args.split(/\s*,\s*/g);
818d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (args == '') {
819d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if ((args.length == 1) && (args[0] == '-')) {
820d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    from = Debug.State.displaySourceStartLine - lines;
821d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if (args.length == 2) {
822d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    from = parseInt(args[0]);
823d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    lines = parseInt(args[1]) - from + 1; // inclusive of the ending line.
824d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else {
825d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    throw new Error('Invalid list arguments.');
826d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
827d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  Debug.State.displaySourceStartLine = from;
828d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  Debug.State.displaySourceEndLine = from + lines - 1;
829d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var sourceArgs = '' + from + ' ' + lines;
830d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return this.sourceCommandToJSONRequest_(sourceArgs);
831d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
832d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
833d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
83437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the source command.
83537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.sourceCommandToJSONRequest_ = function(args) {
83637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Build a evaluate request from the text command.
83737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var request = this.createRequest('source');
83837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
83937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Default is ten lines starting five lines before the current location.
84037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var from = Debug.State.currentSourceLine - 5;
84137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var lines = 10;
84237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
84337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Parse the arguments.
84437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  args = args.split(/\s*[ ]+\s*/g);
84537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args.length > 1 && args[0].length > 0 && args[1].length > 0) {
84637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    from = parseInt(args[0]) - 1;
84737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    lines = parseInt(args[1]);
84837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } else if (args.length > 0 && args[0].length > 0) {
84937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    from = parseInt(args[0]) - 1;
85037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
85137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
85237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (from < 0) from = 0;
85337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (lines < 0) lines = 10;
85437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
85537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Request source arround current source location.
85637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  request.arguments = {};
85737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  request.arguments.fromLine = from;
85837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  request.arguments.toLine = from + lines;
85937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
86037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
86137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
86237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
86337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
86437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the scripts command.
86537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.scriptsCommandToJSONRequest_ = function(args) {
86637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Build a evaluate request from the text command.
86737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var request = this.createRequest('scripts');
86837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
86937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Process arguments if any.
87037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args && args.length > 0) {
87137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    args = args.split(/\s*[ ]+\s*/g);
87237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
87337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (args.length > 1) {
87437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      throw new Error('Invalid scripts arguments.');
87537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
87637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
87737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments = {};
87837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    switch (args[0]) {
87937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'natives':
88037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        request.arguments.types = ScriptTypeFlag(Debug.ScriptType.Native);
88137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
88225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
88337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'extensions':
88437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        request.arguments.types = ScriptTypeFlag(Debug.ScriptType.Extension);
88537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
88625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
88737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'all':
88837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        request.arguments.types =
88937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            ScriptTypeFlag(Debug.ScriptType.Normal) |
89037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            ScriptTypeFlag(Debug.ScriptType.Native) |
89137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            ScriptTypeFlag(Debug.ScriptType.Extension);
89237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
89325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
89437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      default:
895d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        // If the arg is not one of the know one aboves, then it must be a
896d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        // filter used for filtering the results:
897d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        request.arguments.filter = args[0];
898d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
89937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
90037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
90137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
90237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
90337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
90437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
90537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
90637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the break command.
90737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.breakCommandToJSONRequest_ = function(args) {
90837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Build a evaluate request from the text command.
90937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Process arguments if any.
91037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args && args.length > 0) {
91137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    var target = args;
91265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var type = 'function';
91365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var line;
91465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var column;
91537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    var condition;
91665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var pos;
91737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
918c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org    var request = this.createRequest('setbreakpoint');
919c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org
920d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // Break the args into target spec and condition if appropriate.
921d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
92265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    // Check for breakpoint condition.
92365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    pos = args.indexOf(' ');
92437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (pos > 0) {
92537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      target = args.substring(0, pos);
92637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      condition = args.substring(pos + 1, args.length);
92737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
92837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
92965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    // Check for script breakpoint (name:line[:column]). If no ':' in break
93065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    // specification it is considered a function break point.
93165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    pos = target.indexOf(':');
93265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    if (pos > 0) {
93365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      var tmp = target.substring(pos + 1, target.length);
93465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      target = target.substring(0, pos);
935ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      if (target[0] == '/' && target[target.length - 1] == '/') {
936ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org        type = 'scriptRegExp';
937ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org        target = target.substring(1, target.length - 1);
938ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      } else {
939ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org        type = 'script';
940ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      }
94125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
94265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      // Check for both line and column.
94365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      pos = tmp.indexOf(':');
94465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      if (pos > 0) {
94565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org        column = parseInt(tmp.substring(pos + 1, tmp.length)) - 1;
94665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org        line = parseInt(tmp.substring(0, pos)) - 1;
94765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      } else {
94865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org        line = parseInt(tmp) - 1;
94965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      }
95065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    } else if (target[0] == '#' && target[target.length - 1] == '#') {
95165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      type = 'handle';
95265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      target = target.substring(1, target.length - 1);
95365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    } else {
95465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      type = 'function';
95565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    }
95625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
95737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments = {};
95865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    request.arguments.type = type;
95937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments.target = target;
96065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    request.arguments.line = line;
96165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    request.arguments.column = column;
96237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments.condition = condition;
96337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } else {
964c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org    var request = this.createRequest('suspend');
96537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
96637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
96737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
96837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
96937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
97037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
971dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.orgDebugRequest.prototype.breakpointsCommandToJSONRequest_ = function(args) {
972dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  if (args && args.length > 0) {
973dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    throw new Error('Unexpected arguments.');
974dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  }
975dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  var request = this.createRequest('listbreakpoints');
976dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  return request.toJSONProtocol();
977dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org};
978dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
979dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
98037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the clear command.
98137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.clearCommandToJSONRequest_ = function(args) {
98237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Build a evaluate request from the text command.
98337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var request = this.createRequest('clearbreakpoint');
98437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
98537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Process arguments if any.
98637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args && args.length > 0) {
98737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments = {};
98837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments.breakpoint = parseInt(args);
98937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } else {
99037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    throw new Error('Invalid break arguments.');
99137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
99237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
99337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
99437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
99537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
99637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
997d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// Create a JSON request for the change breakpoint command.
998d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugRequest.prototype.changeBreakpointCommandToJSONRequest_ =
999d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    function(args, command) {
1000d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1001d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var request;
1002d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1003d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Check for exception breaks first:
1004d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  //   en[able] exc[eptions] [all|unc[aught]]
1005d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  //   en[able] [all|unc[aught]] exc[eptions]
1006d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  //   dis[able] exc[eptions] [all|unc[aught]]
1007d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  //   dis[able] [all|unc[aught]] exc[eptions]
1008d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if ((command == 'enable' || command == 'disable') &&
1009d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      args && args.length > 1) {
1010d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var nextPos = args.indexOf(' ');
1011d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var arg1 = (nextPos > 0) ? args.substring(0, nextPos) : args;
1012d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var excType = null;
1013d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1014d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // Check for:
1015d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    //   en[able] exc[eptions] [all|unc[aught]]
1016d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    //   dis[able] exc[eptions] [all|unc[aught]]
1017d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if (arg1 == 'exc' || arg1 == 'exception' || arg1 == 'exceptions') {
1018d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1019d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      var arg2 = (nextPos > 0) ?
1020d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          args.substring(nextPos + 1, args.length) : 'all';
1021d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (!arg2) {
1022d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        arg2 = 'all'; // if unspecified, set for all.
1023c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org      } else if (arg2 == 'unc') { // check for short cut.
1024d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        arg2 = 'uncaught';
1025d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      }
1026d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      excType = arg2;
102728a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org
1028d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // Check for:
1029d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    //   en[able] [all|unc[aught]] exc[eptions]
1030d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    //   dis[able] [all|unc[aught]] exc[eptions]
1031d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    } else if (arg1 == 'all' || arg1 == 'unc' || arg1 == 'uncaught') {
1032d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1033d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      var arg2 = (nextPos > 0) ?
1034d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          args.substring(nextPos + 1, args.length) : null;
1035d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (arg2 == 'exc' || arg1 == 'exception' || arg1 == 'exceptions') {
1036d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        excType = arg1;
1037d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (excType == 'unc') {
1038d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          excType = 'uncaught';
1039d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
1040d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      }
1041d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
1042d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1043d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // If we matched one of the command formats, then excType will be non-null:
1044d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if (excType) {
1045d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      // Build a evaluate request from the text command.
1046d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      request = this.createRequest('setexceptionbreak');
1047d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1048d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      request.arguments = {};
1049d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      request.arguments.type = excType;
1050d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      request.arguments.enabled = (command == 'enable');
1051d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1052d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      return request.toJSONProtocol();
1053d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
1054d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1055d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1056d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Build a evaluate request from the text command.
1057d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  request = this.createRequest('changebreakpoint');
1058d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1059d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Process arguments if any.
1060d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (args && args.length > 0) {
1061d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    request.arguments = {};
1062d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var pos = args.indexOf(' ');
1063d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var breakpointArg = args;
1064d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var otherArgs;
1065d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if (pos > 0) {
1066d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      breakpointArg = args.substring(0, pos);
1067d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      otherArgs = args.substring(pos + 1, args.length);
1068d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
1069d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1070d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    request.arguments.breakpoint = parseInt(breakpointArg);
1071d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1072d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    switch(command) {
1073d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'cond':
1074d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        request.arguments.condition = otherArgs ? otherArgs : null;
1075d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1076d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'enable':
1077d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        request.arguments.enabled = true;
1078d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1079d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'disable':
1080d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        request.arguments.enabled = false;
1081d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1082d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'ignore':
1083d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        request.arguments.ignoreCount = parseInt(otherArgs);
1084d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1085d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      default:
108628a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org        throw new Error('Invalid arguments.');
1087d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
1088d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else {
1089d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    throw new Error('Invalid arguments.');
1090d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1091d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1092d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return request.toJSONProtocol();
1093d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
1094d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1095d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1096d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// Create a JSON request for the disconnect command.
1097d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugRequest.prototype.disconnectCommandToJSONRequest_ = function(args) {
1098d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var request;
1099d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  request = this.createRequest('disconnect');
1100d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return request.toJSONProtocol();
1101d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
1102d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1103d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1104d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// Create a JSON request for the info command.
1105d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugRequest.prototype.infoCommandToJSONRequest_ = function(args) {
1106d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var request;
1107d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (args && (args == 'break' || args == 'br')) {
1108d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // Build a evaluate request from the text command.
1109d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    request = this.createRequest('listbreakpoints');
1110d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    last_cmd = 'info break';
1111d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if (args && (args == 'locals' || args == 'lo')) {
1112d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // Build a evaluate request from the text command.
1113d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    request = this.createRequest('frame');
1114d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    last_cmd = 'info locals';
1115d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if (args && (args == 'args' || args == 'ar')) {
1116d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // Build a evaluate request from the text command.
1117d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    request = this.createRequest('frame');
1118d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    last_cmd = 'info args';
1119d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else {
1120d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    throw new Error('Invalid info arguments.');
1121d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1122d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1123d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return request.toJSONProtocol();
1124d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
1125d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1126d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1127d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugRequest.prototype.v8FlagsToJSONRequest_ = function(args) {
1128d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var request;
1129d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  request = this.createRequest('v8flags');
1130d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  request.arguments = {};
1131d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  request.arguments.flags = args;
1132d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return request.toJSONProtocol();
1133d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
1134d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1135d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1136d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugRequest.prototype.gcToJSONRequest_ = function(args) {
1137d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var request;
1138d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (!args) {
1139d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    args = 'all';
1140d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1141d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var args = args.split(/\s+/g);
1142d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var cmd = args[0];
1143d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1144d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  switch(cmd) {
1145d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'all':
1146d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'quick':
1147d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'full':
1148d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'young':
1149d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'old':
1150d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'compact':
1151d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'sweep':
1152d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'scavenge': {
1153d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (cmd == 'young') { cmd = 'quick'; }
1154d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      else if (cmd == 'old') { cmd = 'full'; }
1155d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1156d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      request = this.createRequest('gc');
1157d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      request.arguments = {};
1158d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      request.arguments.type = cmd;
1159d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
1160d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
1161d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      // Else fall thru to the default case below to report the error.
1162d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    default:
1163d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      throw new Error('Missing arguments after ' + cmd + '.');
1164d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1165d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return request.toJSONProtocol();
1166d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
1167d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1168d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1169bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// Create a JSON request for the threads command.
1170bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgDebugRequest.prototype.threadsCommandToJSONRequest_ = function(args) {
1171bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  // Build a threads request from the text command.
1172bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  var request = this.createRequest('threads');
1173bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  return request.toJSONProtocol();
1174bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org};
1175bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
1176bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
1177245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// Handle the trace command.
1178245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebugRequest.prototype.traceCommand_ = function(args) {
1179245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Process arguments.
1180245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (args && args.length > 0) {
1181245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    if (args == 'compile') {
1182245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      trace_compile = !trace_compile;
1183245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      print('Tracing of compiled scripts ' + (trace_compile ? 'on' : 'off'));
1184d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    } else if (args === 'debug json' || args === 'json' || args === 'packets') {
1185d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      trace_debug_json = !trace_debug_json;
1186d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      print('Tracing of debug json packets ' +
1187d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            (trace_debug_json ? 'on' : 'off'));
1188245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    } else {
1189245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      throw new Error('Invalid trace arguments.');
1190245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    }
1191245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  } else {
1192245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    throw new Error('Invalid trace arguments.');
1193245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
11941b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1195245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
1196245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// Handle the help command.
119737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.helpCommand_ = function(args) {
119837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Help os quite simple.
119937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args && args.length > 0) {
120037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    print('warning: arguments to \'help\' are ignored');
120137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
120237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
1203d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('Note: <> denotes symbollic values to be replaced with real values.');
1204d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('Note: [] denotes optional parts of commands, or optional options / arguments.');
1205d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('      e.g. d[elete] - you get the same command if you type d or delete.');
1206d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1207d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('[break] - break as soon as possible');
1208d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('b[reak] location [condition]');
1209d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('        - break on named function: location is a function name');
1210d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('        - break on function: location is #<id>#');
1211d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('        - break on script position: location is name:line[:column]');
1212d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1213d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('clear <breakpoint #>       - deletes the specified user defined breakpoint');
1214d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('d[elete]  <breakpoint #>   - deletes the specified user defined breakpoint');
1215d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('dis[able] <breakpoint #>   - disables the specified user defined breakpoint');
1216d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('dis[able] exc[eptions] [[all] | unc[aught]]');
1217d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('                           - disables breaking on exceptions');
1218d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('en[able]  <breakpoint #>   - enables the specified user defined breakpoint');
1219d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('en[able]  exc[eptions] [[all] | unc[aught]]');
1220d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('                           - enables breaking on exceptions');
1221d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1222d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('b[ack]t[race] [n] | [-n] | [from to]');
1223d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('                           - prints the stack back trace');
1224d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('f[rame]                    - prints info about the current frame context');
1225d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('f[rame] <frame #>          - set context to specified frame #');
1226eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  print('scopes');
1227eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  print('scope <scope #>');
1228d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1229d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('up                         - set context to caller of current frame');
1230d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('do[wn]                     - set context to callee of current frame');
1231d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('inf[o] br[eak]             - prints info about breakpoints in use');
1232d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('inf[o] ar[gs]              - prints info about arguments of the current function');
1233d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('inf[o] lo[cals]            - prints info about locals in the current function');
1234d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
123537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  print('step [in | next | out| min [step count]]');
1236d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('c[ontinue]                 - continue executing after a breakpoint');
1237d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('s[tep]   [<N>]             - step into the next N callees (default N is 1)');
1238d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('s[tep]i  [<N>]             - step into the next N callees (default N is 1)');
1239d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('n[ext]   [<N>]             - step over the next N callees (default N is 1)');
1240d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('fin[ish] [<N>]             - step out of N frames (default N is 1)');
1241d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1242d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('p[rint] <expression>       - prints the result of the specified expression');
1243d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('dir <expression>           - prints the object structure of the result');
1244d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('set <var> = <expression>   - executes the specified statement');
1245d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1246d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('l[ist]                     - list the source code around for the current pc');
1247d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('l[ist] [- | <start>,<end>] - list the specified range of source code');
124837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  print('source [from line [num lines]]');
1249d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('scr[ipts] [native|extensions|all]');
1250d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('scr[ipts] [<filter text>]  - list scripts with the specified text in its description');
1251d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1252d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('gc                         - runs the garbage collector');
1253d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1254245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  print('trace compile');
1255d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // hidden command: trace debug json - toggles tracing of debug json packets
1256d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1257d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('disconnect|exit|quit       - disconnects and quits the debugger');
1258d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('help                       - prints this help information');
12591b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
126037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
126137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
1262ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction formatHandleReference_(value) {
1263eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  if (value.handle() >= 0) {
1264eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return '#' + value.handle() + '#';
1265eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  } else {
1266eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return '#Transient#';
1267eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
1268ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org}
1269ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1270ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1271245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgfunction formatObject_(value, include_properties) {
1272245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var result = '';
1273245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result += formatHandleReference_(value);
12741b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  result += ', type: object';
1275245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result += ', constructor ';
1276245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var ctor = value.constructorFunctionValue();
1277245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result += formatHandleReference_(ctor);
1278245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result += ', __proto__ ';
1279245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var proto = value.protoObjectValue();
1280245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result += formatHandleReference_(proto);
1281245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result += ', ';
1282245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result += value.propertyCount();
1283245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result +=  ' properties.';
1284245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (include_properties) {
1285245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    result +=  '\n';
1286245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    for (var i = 0; i < value.propertyCount(); i++) {
1287245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      result += '  ';
1288245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      result += value.propertyName(i);
1289245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      result += ': ';
1290245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      var property_value = value.propertyValue(i);
1291eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      if (property_value instanceof ProtocolReference) {
1292245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        result += '<no type>';
1293eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      } else {
1294eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        if (property_value && property_value.type()) {
1295eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          result += property_value.type();
1296eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        } else {
1297eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          result += '<no type>';
1298eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        }
1299245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      }
1300245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      result += ' ';
1301245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      result += formatHandleReference_(property_value);
1302245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      result += '\n';
1303245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    }
1304245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
1305245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return result;
1306245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org}
1307245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
1308245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
1309eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction formatScope_(scope) {
1310eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var result = '';
1311eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var index = scope.index;
1312eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  result += '#' + (index <= 9 ? '0' : '') + index;
1313eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  result += ' ';
1314eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  switch (scope.type) {
1315eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    case Debug.ScopeType.Global:
1316eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      result += 'Global, ';
1317eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      result += '#' + scope.object.ref + '#';
1318eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      break;
1319eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    case Debug.ScopeType.Local:
1320eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      result += 'Local';
1321eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      break;
1322eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    case Debug.ScopeType.With:
1323eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      result += 'With, ';
1324eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      result += '#' + scope.object.ref + '#';
1325eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      break;
1326a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    case Debug.ScopeType.Catch:
1327a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org      result += 'Catch, ';
1328a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org      result += '#' + scope.object.ref + '#';
1329a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org      break;
1330eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    case Debug.ScopeType.Closure:
1331eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      result += 'Closure';
1332eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      break;
1333eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    default:
1334eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      result += 'UNKNOWN';
1335eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
1336eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return result;
1337eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
1338eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1339eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1340d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgfunction refObjectToString_(protocolPackage, handle) {
1341d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var value = protocolPackage.lookup(handle);
1342d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var result = '';
1343d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (value.isString()) {
1344d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    result = '"' + value.value() + '"';
1345d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if (value.isPrimitive()) {
1346d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    result = value.valueString();
1347d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if (value.isObject()) {
1348d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    result += formatObject_(value, true);
1349d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1350d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return result;
1351d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org}
1352d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1353d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1354d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// Rounds number 'num' to 'length' decimal places.
1355d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgfunction roundNumber(num, length) {
1356d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var factor = Math.pow(10, length);
1357d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return Math.round(num * factor) / factor;
1358d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org}
1359d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1360d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
136137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Convert a JSON response to text for display in a text based debugger.
13627be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgfunction DebugResponseDetails(response) {
1363ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  var details = { text: '', running: false };
136437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
136537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  try {
1366ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    if (!response.success()) {
1367ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      details.text = response.message();
136837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      return details;
136937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
137037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
137137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    // Get the running state.
1372ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    details.running = response.running();
137337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
1374ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    var body = response.body();
1375ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    var result = '';
1376ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    switch (response.command()) {
1377c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org      case 'suspend':
1378c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org        details.text = 'stopped';
1379c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org        break;
138042841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org
138137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'setbreakpoint':
138237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        result = 'set breakpoint #';
138337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        result += body.breakpoint;
138437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        details.text = result;
138537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
138625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
138737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'clearbreakpoint':
138837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        result = 'cleared breakpoint #';
138937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        result += body.breakpoint;
139037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        details.text = result;
139137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
139242841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org
1393d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'changebreakpoint':
1394d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        result = 'successfully changed breakpoint';
1395d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        details.text = result;
1396d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1397d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1398dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      case 'listbreakpoints':
1399dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org        result = 'breakpoints: (' + body.breakpoints.length + ')';
1400dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org        for (var i = 0; i < body.breakpoints.length; i++) {
1401dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          var breakpoint = body.breakpoints[i];
1402dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          result += '\n id=' + breakpoint.number;
1403dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          result += ' type=' + breakpoint.type;
1404dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          if (breakpoint.script_id) {
1405dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org              result += ' script_id=' + breakpoint.script_id;
1406dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          }
1407dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          if (breakpoint.script_name) {
1408dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org              result += ' script_name=' + breakpoint.script_name;
1409dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          }
1410ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org          if (breakpoint.script_regexp) {
1411ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org              result += ' script_regexp=' + breakpoint.script_regexp;
1412ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org          }
1413d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          result += ' line=' + (breakpoint.line + 1);
1414dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          if (breakpoint.column != null) {
1415d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            result += ' column=' + (breakpoint.column + 1);
1416dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          }
1417dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          if (breakpoint.groupId) {
1418dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org            result += ' groupId=' + breakpoint.groupId;
1419dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          }
1420dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          if (breakpoint.ignoreCount) {
1421dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org              result += ' ignoreCount=' + breakpoint.ignoreCount;
1422dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          }
1423dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          if (breakpoint.active === false) {
1424dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org            result += ' inactive';
1425dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          }
1426dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          if (breakpoint.condition) {
1427dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org            result += ' condition=' + breakpoint.condition;
1428dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          }
1429dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          result += ' hit_count=' + breakpoint.hit_count;
1430dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org        }
1431d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (body.breakpoints.length === 0) {
1432d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          result = "No user defined breakpoints\n";
1433d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        } else {
1434d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          result += '\n';
1435d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
1436d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (body.breakOnExceptions) {
1437d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          result += '* breaking on ALL exceptions is enabled\n';
1438d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        } else if (body.breakOnUncaughtExceptions) {
1439d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          result += '* breaking on UNCAUGHT exceptions is enabled\n';
1440d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        } else {
144128a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org          result += '* all exception breakpoints are disabled\n';
1442d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
1443d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        details.text = result;
1444d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1445d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1446d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'setexceptionbreak':
1447d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        result = 'Break on ' + body.type + ' exceptions: ';
1448d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        result += body.enabled ? 'enabled' : 'disabled';
1449dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org        details.text = result;
1450dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org        break;
145125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
145237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'backtrace':
145337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        if (body.totalFrames == 0) {
145437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          result = '(empty stack)';
145537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        } else {
145637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          var result = 'Frames #' + body.fromFrame + ' to #' +
145737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com              (body.toFrame - 1) + ' of ' + body.totalFrames + '\n';
145837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          for (i = 0; i < body.frames.length; i++) {
145937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            if (i != 0) result += '\n';
146037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            result += body.frames[i].text;
146137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          }
146237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
146337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        details.text = result;
146437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
146525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
146637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'frame':
1467d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (last_cmd === 'info locals') {
1468d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          var locals = body.locals;
1469d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          if (locals.length === 0) {
1470d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            result = 'No locals';
1471d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          } else {
1472d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            for (var i = 0; i < locals.length; i++) {
1473d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              var local = locals[i];
1474d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              result += local.name + ' = ';
1475d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              result += refObjectToString_(response, local.value.ref);
1476d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              result += '\n';
1477d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            }
1478d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          }
1479d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        } else if (last_cmd === 'info args') {
1480d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          var args = body.arguments;
1481d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          if (args.length === 0) {
1482d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            result = 'No arguments';
1483d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          } else {
1484d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            for (var i = 0; i < args.length; i++) {
1485d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              var arg = args[i];
1486d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              result += arg.name + ' = ';
1487d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              result += refObjectToString_(response, arg.value.ref);
1488d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              result += '\n';
1489d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            }
1490d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          }
1491d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        } else {
1492d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          result = SourceUnderline(body.sourceLineText,
1493d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org                                   body.column);
1494d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          Debug.State.currentSourceLine = body.line;
1495d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          Debug.State.currentFrame = body.index;
1496d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          Debug.State.displaySourceStartLine = -1;
1497d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          Debug.State.displaySourceEndLine = -1;
1498d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
1499d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        details.text = result;
150037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
150125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
1502eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      case 'scopes':
1503eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        if (body.totalScopes == 0) {
1504eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          result = '(no scopes)';
1505eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        } else {
1506eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          result = 'Scopes #' + body.fromScope + ' to #' +
1507eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org                   (body.toScope - 1) + ' of ' + body.totalScopes + '\n';
1508eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          for (i = 0; i < body.scopes.length; i++) {
1509eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org            if (i != 0) {
1510eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org              result += '\n';
1511eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org            }
1512eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org            result += formatScope_(body.scopes[i]);
1513eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          }
1514eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        }
1515eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        details.text = result;
1516eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        break;
1517eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1518eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      case 'scope':
1519eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        result += formatScope_(body);
1520eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        result += '\n';
1521eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        var scope_object_value = response.lookup(body.object.ref);
1522eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        result += formatObject_(scope_object_value, true);
1523eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        details.text = result;
1524eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        break;
152525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
152637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'evaluate':
1527ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      case 'lookup':
15289ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      case 'getobj':
1529ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        if (last_cmd == 'p' || last_cmd == 'print') {
1530381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org          result = body.text;
1531ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        } else {
1532eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          var value;
1533eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          if (lookup_handle) {
1534eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org            value = response.bodyValue(lookup_handle);
1535eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          } else {
1536eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org            value = response.bodyValue();
1537eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          }
1538ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          if (value.isObject()) {
1539245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org            result += formatObject_(value, true);
1540ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          } else {
1541ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org            result += 'type: ';
1542ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org            result += value.type();
1543ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org            if (!value.isUndefined() && !value.isNull()) {
1544ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org              result += ', ';
1545ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org              if (value.isString()) {
1546ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org                result += '"';
1547ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org              }
1548ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org              result += value.value();
1549ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org              if (value.isString()) {
1550ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org                result += '"';
1551ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org              }
1552ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org            }
1553ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org            result += '\n';
1554ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          }
1555ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        }
1556ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        details.text = result;
155737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
1558245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
1559245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      case 'references':
1560245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        var count = body.length;
1561245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        result += 'found ' + count + ' objects';
1562245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        result += '\n';
1563245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        for (var i = 0; i < count; i++) {
1564245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org          var value = response.bodyValue(i);
1565245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org          result += formatObject_(value, false);
1566245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org          result += '\n';
1567245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        }
1568245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        details.text = result;
1569245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        break;
157025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
157137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'source':
157237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        // Get the source from the response.
1573ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        var source = body.source;
1574ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        var from_line = body.fromLine + 1;
157537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        var lines = source.split('\n');
157637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        var maxdigits = 1 + Math.floor(log10(from_line + lines.length));
157737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        if (maxdigits < 3) {
157837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          maxdigits = 3;
157937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
158037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        var result = '';
158137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        for (var num = 0; num < lines.length; num++) {
158237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          // Check if there's an extra newline at the end.
158337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          if (num == (lines.length - 1) && lines[num].length == 0) {
158437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            break;
158537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          }
158637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
158737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          var current_line = from_line + num;
15881456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org          var spacer = maxdigits - (1 + Math.floor(log10(current_line)));
158937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          if (current_line == Debug.State.currentSourceLine + 1) {
159037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            for (var i = 0; i < maxdigits; i++) {
159137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com              result += '>';
159237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            }
159337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            result += '  ';
159437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          } else {
159537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            for (var i = 0; i < spacer; i++) {
159637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com              result += ' ';
159737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            }
159837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            result += current_line + ': ';
159937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          }
160037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          result += lines[num];
160137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          result += '\n';
160237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
160337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        details.text = result;
160437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
160525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
160637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'scripts':
160737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        var result = '';
1608ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        for (i = 0; i < body.length; i++) {
160937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          if (i != 0) result += '\n';
16107be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          if (body[i].id) {
16117be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            result += body[i].id;
16127be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          } else {
16137be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            result += '[no id]';
16147be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          }
16157be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += ', ';
1616ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          if (body[i].name) {
1617ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org            result += body[i].name;
161837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          } else {
1619d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            if (body[i].compilationType == Debug.ScriptCompilationType.Eval
1620d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org                && body[i].evalFromScript
1621d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org                ) {
1622e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org              result += 'eval from ';
1623e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org              var script_value = response.lookup(body[i].evalFromScript.ref);
1624e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org              result += ' ' + script_value.field('name');
1625e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org              result += ':' + (body[i].evalFromLocation.line + 1);
1626e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org              result += ':' + body[i].evalFromLocation.column;
1627e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org            } else if (body[i].compilationType ==
1628e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org                       Debug.ScriptCompilationType.JSON) {
1629e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org              result += 'JSON ';
1630e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org            } else {  // body[i].compilation == Debug.ScriptCompilationType.Host
1631e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org              result += '[unnamed] ';
1632e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org            }
163337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          }
163437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          result += ' (lines: ';
16357be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += body[i].lineCount;
163637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          result += ', length: ';
1637ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          result += body[i].sourceLength;
1638ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          if (body[i].type == Debug.ScriptType.Native) {
163937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            result += ', native';
1640ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          } else if (body[i].type == Debug.ScriptType.Extension) {
164137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            result += ', extension';
164237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          }
16437be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += '), [';
16447be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          var sourceStart = body[i].sourceStart;
16457be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          if (sourceStart.length > 40) {
16467be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            sourceStart = sourceStart.substring(0, 37) + '...';
16477be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          }
16487be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += sourceStart;
16497be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += ']';
165037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
1651d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (body.length == 0) {
1652d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          result = "no matching scripts found";
1653d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
165437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        details.text = result;
165537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
165637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
1657bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org      case 'threads':
1658bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org        var result = 'Active V8 threads: ' + body.totalThreads + '\n';
1659bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org        body.threads.sort(function(a, b) { return a.id - b.id; });
1660bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org        for (i = 0; i < body.threads.length; i++) {
1661bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org          result += body.threads[i].current ? '*' : ' ';
1662bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org          result += ' ';
1663bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org          result += body.threads[i].id;
1664bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org          result += '\n';
1665bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org        }
1666bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org        details.text = result;
1667bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org        break;
1668bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
166937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'continue':
167037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        details.text = "(running)";
167137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
167225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
1673d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'v8flags':
1674d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        details.text = "flags set";
1675d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1676d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1677d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'gc':
1678d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        details.text = "GC " + body.before + " => " + body.after;
1679d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (body.after > (1024*1024)) {
1680d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          details.text +=
1681d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              " (" + roundNumber(body.before/(1024*1024), 1) + "M => " +
1682d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org                     roundNumber(body.after/(1024*1024), 1) + "M)";
1683d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        } else if (body.after > 1024) {
1684d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          details.text +=
1685d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              " (" + roundNumber(body.before/1024, 1) + "K => " +
1686d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org                     roundNumber(body.after/1024, 1) + "K)";
1687d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
1688d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1689d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
169037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      default:
169137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        details.text =
1692dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org            'Response for unknown command \'' + response.command() + '\'' +
1693dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org            ' (' + response.raw_json() + ')';
169437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
169537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } catch (e) {
169637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    details.text = 'Error: "' + e + '" formatting response';
169737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
169825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
169937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return details;
17001b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
170137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
170237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
1703ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1704ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Protocol packages send from the debugger.
1705ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @param {string} json - raw protocol packet as JSON string.
1706ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @constructor
1707ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1708ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction ProtocolPackage(json) {
1709dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  this.raw_json_ = json;
171018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  this.packet_ = JSON.parse(json);
1711ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  this.refs_ = [];
1712ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  if (this.packet_.refs) {
1713ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    for (var i = 0; i < this.packet_.refs.length; i++) {
1714ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      this.refs_[this.packet_.refs[i].handle] = this.packet_.refs[i];
1715ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    }
1716ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
1717ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org}
1718ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1719ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1720ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1721ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the packet type.
1722ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {String} the packet type
1723ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1724ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.type = function() {
1725ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.type;
17261b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1727ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1728ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1729ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1730ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the packet event.
1731ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {Object} the packet event
1732ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1733ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.event = function() {
1734ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.event;
17351b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1736ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1737ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1738ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1739ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the packet request sequence.
1740ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {number} the packet request sequence
1741ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1742ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.requestSeq = function() {
1743ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.request_seq;
17441b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1745ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1746ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1747ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1748ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the packet request sequence.
1749ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {number} the packet request sequence
1750ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1751ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.running = function() {
1752ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.running ? true : false;
17531b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1754ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1755ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1756ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.success = function() {
1757ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.success ? true : false;
17581b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1759ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1760ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1761ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.message = function() {
1762ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.message;
17631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1764ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1765ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1766ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.command = function() {
1767ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.command;
17681b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1769ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1770ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1771ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.body = function() {
1772ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.body;
17731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1774ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1775ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1776245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgProtocolPackage.prototype.bodyValue = function(index) {
1777eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  if (index != null) {
1778245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return new ProtocolValue(this.packet_.body[index], this);
1779381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org  } else {
1780381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    return new ProtocolValue(this.packet_.body, this);
1781245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
17821b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1783ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1784ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1785ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.body = function() {
1786ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.body;
17871b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1788ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1789ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1790ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.lookup = function(handle) {
1791ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  var value = this.refs_[handle];
1792ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  if (value) {
1793ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    return new ProtocolValue(value, this);
1794ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  } else {
1795ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    return new ProtocolReference(handle);
1796ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
17971b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1798ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1799ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1800dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.orgProtocolPackage.prototype.raw_json = function() {
1801dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  return this.raw_json_;
18021b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1803dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
1804dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
1805ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction ProtocolValue(value, packet) {
1806ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  this.value_ = value;
1807ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  this.packet_ = packet;
1808ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org}
1809ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1810ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1811ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1812ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the value type.
1813ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {String} the value type
1814ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1815ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.type = function() {
1816ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.type;
18171b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1818ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1819ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1820ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
182125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org * Get a metadata field from a protocol value.
1822e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org * @return {Object} the metadata field value
1823e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org */
1824e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgProtocolValue.prototype.field = function(name) {
1825e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  return this.value_[name];
18261b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1827e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
1828e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
1829e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org/**
1830ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is a primitive value.
1831ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is primitive
1832ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1833ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.isPrimitive = function() {
1834ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.isUndefined() || this.isNull() || this.isBoolean() ||
1835ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org         this.isNumber() || this.isString();
18361b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1837ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1838ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1839ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1840ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the object handle.
1841ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {number} the value handle
1842ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1843ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.handle = function() {
1844ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.handle;
18451b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1846ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1847ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1848ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1849ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is undefined.
1850ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is undefined
1851ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1852ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.isUndefined = function() {
1853ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.type == 'undefined';
18541b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1855ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1856ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1857ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1858ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is null.
1859ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is null
1860ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1861ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.isNull = function() {
1862ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.type == 'null';
18631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1864ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1865ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1866ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1867ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is a boolean.
1868ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is a boolean
1869ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1870ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.isBoolean = function() {
1871ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.type == 'boolean';
18721b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1873ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1874ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1875ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1876ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is a number.
1877ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is a number
1878ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1879ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.isNumber = function() {
1880ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.type == 'number';
18811b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1882ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1883ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1884ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1885ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is a string.
1886ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is a string
1887ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1888ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.isString = function() {
1889ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.type == 'string';
18901b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1891ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1892ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1893ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1894ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is an object.
1895ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is an object
1896ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1897ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.isObject = function() {
1898ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.type == 'object' || this.value_.type == 'function' ||
1899ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org         this.value_.type == 'error' || this.value_.type == 'regexp';
19001b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1901ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1902ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1903ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1904ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the constructor function
1905ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {ProtocolValue} constructor function
1906ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1907ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.constructorFunctionValue = function() {
1908ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  var ctor = this.value_.constructorFunction;
1909ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.lookup(ctor.ref);
19101b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1911ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1912ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1913ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1914ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the __proto__ value
1915ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {ProtocolValue} __proto__ value
1916ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1917ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.protoObjectValue = function() {
1918ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  var proto = this.value_.protoObject;
1919ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.lookup(proto.ref);
19201b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1921ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1922ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1923ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1924ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the number og properties.
1925ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {number} the number of properties
1926ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1927ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.propertyCount = function() {
1928ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.properties ? this.value_.properties.length : 0;
19291b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1930ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1931ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1932ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1933ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the specified property name.
1934ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {string} property name
1935ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1936ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.propertyName = function(index) {
1937ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  var property = this.value_.properties[index];
1938ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return property.name;
19391b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1940ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1941ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1942ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1943ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Return index for the property name.
1944ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @param name The property name to look for
1945ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {number} index for the property name
1946ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1947ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.propertyIndex = function(name) {
1948ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  for (var i = 0; i < this.propertyCount(); i++) {
1949ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    if (this.value_.properties[i].name == name) {
1950ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      return i;
1951ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    }
1952ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
1953ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return null;
19541b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1955ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1956ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1957ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1958ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the specified property value.
1959ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {ProtocolValue} property value
1960ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1961ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.propertyValue = function(index) {
1962ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  var property = this.value_.properties[index];
1963ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.lookup(property.ref);
19641b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1965ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1966ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1967ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1968ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is a string.
1969ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is a string
1970ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1971ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.value = function() {
1972ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.value;
19731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1974ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1975ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1976d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgProtocolValue.prototype.valueString = function() {
1977d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return this.value_.text;
19781b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1979d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1980d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1981ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction ProtocolReference(handle) {
1982ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  this.handle_ = handle;
1983ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org}
1984ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1985ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1986ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolReference.prototype.handle = function() {
1987ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.handle_;
19881b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1989ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1990ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
199137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction MakeJSONPair_(name, value) {
199237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return '"' + name + '":' + value;
199337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
199437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
199537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
199637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction ArrayToJSONObject_(content) {
199737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return '{' + content.join(',') + '}';
199837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
199937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
200037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
200137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction ArrayToJSONArray_(content) {
200237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return '[' + content.join(',') + ']';
200337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
200437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
200537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
200637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction BooleanToJSON_(value) {
200725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  return String(value);
200837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
200937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
201037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
201137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction NumberToJSON_(value) {
201225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  return String(value);
201337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
201437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
201537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
201637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Mapping of some control characters to avoid the \uXXXX syntax for most
201737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// commonly used control cahracters.
2018f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar ctrlCharMap_ = {
201937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  '\b': '\\b',
202037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  '\t': '\\t',
202137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  '\n': '\\n',
202237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  '\f': '\\f',
202337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  '\r': '\\r',
202437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  '"' : '\\"',
202537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  '\\': '\\\\'
202637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
202737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
202837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
202937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Regular expression testing for ", \ and control characters (0x00 - 0x1F).
2030f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar ctrlCharTest_ = new RegExp('["\\\\\x00-\x1F]');
203137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
203237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
203337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Regular expression matching ", \ and control characters (0x00 - 0x1F)
203437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// globally.
2035f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar ctrlCharMatch_ = new RegExp('["\\\\\x00-\x1F]', 'g');
203637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
203737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
203837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com/**
203937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * Convert a String to its JSON representation (see http://www.json.org/). To
204037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * avoid depending on the String object this method calls the functions in
204137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * string.js directly and not through the value.
204237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * @param {String} value The String value to format as JSON
204337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * @return {string} JSON formatted String value
204437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com */
204537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction StringToJSON_(value) {
204637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Check for" , \ and control characters (0x00 - 0x1F). No need to call
204737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // RegExpTest as ctrlchar is constructed using RegExp.
204837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (ctrlCharTest_.test(value)) {
204937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    // Replace ", \ and control characters (0x00 - 0x1F).
205037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    return '"' +
205137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      value.replace(ctrlCharMatch_, function (char) {
205237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        // Use charmap if possible.
205337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        var mapped = ctrlCharMap_[char];
205437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        if (mapped) return mapped;
205537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        mapped = char.charCodeAt();
205637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        // Convert control character to unicode escape sequence.
205737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        return '\\u00' +
205837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          '0' + // TODO %NumberToRadixString(Math.floor(mapped / 16), 16) +
20591b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org          '0'; // TODO %NumberToRadixString(mapped % 16, 16)
206037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      })
206137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    + '"';
206237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
206337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
206437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Simple string with no special characters.
206537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return '"' + value + '"';
206637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
206737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
206837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
206937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com/**
207037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * Convert a Date to ISO 8601 format. To avoid depending on the Date object
207137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * this method calls the functions in date.js directly and not through the
207237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * value.
207337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * @param {Date} value The Date value to format as JSON
207437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * @return {string} JSON formatted Date value
207537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com */
207637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction DateToISO8601_(value) {
2077f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  var f = function(n) {
207837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    return n < 10 ? '0' + n : n;
2079f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  };
2080f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  var g = function(n) {
208137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    return n < 10 ? '00' + n : n < 100 ? '0' + n : n;
2082f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  };
208337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return builtins.GetUTCFullYearFrom(value)         + '-' +
208437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          f(builtins.GetUTCMonthFrom(value) + 1)    + '-' +
208537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          f(builtins.GetUTCDateFrom(value))         + 'T' +
208637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          f(builtins.GetUTCHoursFrom(value))        + ':' +
208737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          f(builtins.GetUTCMinutesFrom(value))      + ':' +
208837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          f(builtins.GetUTCSecondsFrom(value))      + '.' +
208937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          g(builtins.GetUTCMillisecondsFrom(value)) + 'Z';
209037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
209137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
209237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
209337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com/**
209437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * Convert a Date to ISO 8601 format. To avoid depending on the Date object
209537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * this method calls the functions in date.js directly and not through the
209637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * value.
209737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * @param {Date} value The Date value to format as JSON
209837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * @return {string} JSON formatted Date value
209937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com */
210037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction DateToJSON_(value) {
210137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return '"' + DateToISO8601_(value) + '"';
210237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
210337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
210437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
210537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com/**
210637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * Convert an Object to its JSON representation (see http://www.json.org/).
210737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * This implementation simply runs through all string property names and adds
210837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * each property to the JSON representation for some predefined types. For type
210937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * "object" the function calls itself recursively unless the object has the
211037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * function property "toJSONProtocol" in which case that is used. This is not
211137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * a general implementation but sufficient for the debugger. Note that circular
211237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * structures will cause infinite recursion.
211337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * @param {Object} object The object to format as JSON
211437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * @return {string} JSON formatted object value
211537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com */
211637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction SimpleObjectToJSON_(object) {
211737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var content = [];
211837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  for (var key in object) {
211937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    // Only consider string keys.
212037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (typeof key == 'string') {
212137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      var property_value = object[key];
212237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
212337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      // Format the value based on its type.
212437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      var property_value_json;
212537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      switch (typeof property_value) {
212637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        case 'object':
2127d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          if (property_value === null) {
2128d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            property_value_json = 'null';
2129d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          } else if (typeof property_value.toJSONProtocol == 'function') {
21301b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org            property_value_json = property_value.toJSONProtocol(true);
213137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          } else if (property_value.constructor.name == 'Array'){
213237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            property_value_json = SimpleArrayToJSON_(property_value);
213337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          } else {
213437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            property_value_json = SimpleObjectToJSON_(property_value);
213537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          }
213637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          break;
213737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
213837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        case 'boolean':
213937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          property_value_json = BooleanToJSON_(property_value);
214037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          break;
214137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
214237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        case 'number':
214337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          property_value_json = NumberToJSON_(property_value);
214437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          break;
214537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
214637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        case 'string':
214737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          property_value_json = StringToJSON_(property_value);
214837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          break;
214937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
215037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        default:
215137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          property_value_json = null;
215237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      }
215337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
215437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      // Add the property if relevant.
215537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      if (property_value_json) {
215637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        content.push(StringToJSON_(key) + ':' + property_value_json);
215737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      }
215837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
215937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
216037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
216137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Make JSON object representation.
216237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return '{' + content.join(',') + '}';
216337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
216437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
216537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
216637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com/**
216737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * Convert an array to its JSON representation. This is a VERY simple
216837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * implementation just to support what is needed for the debugger.
216937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * @param {Array} arrya The array to format as JSON
217037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * @return {string} JSON formatted array value
217137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com */
217237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction SimpleArrayToJSON_(array) {
217337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Make JSON array representation.
217437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var json = '[';
217537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  for (var i = 0; i < array.length; i++) {
217637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (i != 0) {
217737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      json += ',';
217837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
217937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    var elem = array[i];
218037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (elem.toJSONProtocol) {
21811b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      json += elem.toJSONProtocol(true);
218237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    } else if (typeof(elem) === 'object')  {
218337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      json += SimpleObjectToJSON_(elem);
218437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    } else if (typeof(elem) === 'boolean')  {
218537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      json += BooleanToJSON_(elem);
218637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    } else if (typeof(elem) === 'number')  {
218737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      json += NumberToJSON_(elem);
218837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    } else if (typeof(elem) === 'string')  {
218937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      json += StringToJSON_(elem);
219037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    } else {
219137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      json += elem;
219237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
219337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
219437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  json += ']';
219537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return json;
219637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
2197876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
2198876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
2199876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org// A more universal stringify that supports more types than JSON.
2200876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org// Used by the d8 shell to output results.
2201876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgvar stringifyDepthLimit = 4;  // To avoid crashing on cyclic objects
2202876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
2203876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgfunction Stringify(x, depth) {
2204876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  if (depth === undefined)
2205876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    depth = stringifyDepthLimit;
2206876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  else if (depth === 0)
2207876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    return "*";
2208876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  switch (typeof x) {
2209876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    case "undefined":
2210876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      return "undefined";
2211876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    case "boolean":
2212876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    case "number":
2213876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    case "function":
2214876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      return x.toString();
2215876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    case "string":
2216876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      return "\"" + x.toString() + "\"";
2217f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    case "symbol":
2218f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      return "Symbol(" + (x.name ? Stringify(x.name, depth) : "") + ")"
2219876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    case "object":
2220876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      if (x === null) return "null";
2221876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      if (x.constructor && x.constructor.name === "Array") {
2222876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        var elems = [];
2223876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        for (var i = 0; i < x.length; ++i) {
2224876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org          elems.push(
2225876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org            {}.hasOwnProperty.call(x, i) ? Stringify(x[i], depth - 1) : "");
2226876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        }
2227876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        return "[" + elems.join(", ") + "]";
2228876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      }
2229876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      try {
2230876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        var string = String(x);
2231876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        if (string && string !== "[object Object]") return string;
2232876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      } catch(e) {}
2233876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      var props = [];
2234876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      for (var name in x) {
2235876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        var desc = Object.getOwnPropertyDescriptor(x, name);
2236876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        if (desc === void 0) continue;
2237876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        if ("value" in desc) {
2238876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org          props.push(name + ": " + Stringify(desc.value, depth - 1));
2239876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        }
2240876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        if ("get" in desc) {
2241876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org          var getter = desc.get.toString();
2242876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org          props.push("get " + name + getter.slice(getter.indexOf('(')));
2243876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        }
2244876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        if ("set" in desc) {
2245876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org          var setter = desc.set.toString();
2246876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org          props.push("set " + name + setter.slice(setter.indexOf('(')));
2247876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        }
2248876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      }
2249876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      return "{" + props.join(", ") + "}";
2250876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    default:
2251876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      return "[crazy non-standard shit]";
2252876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  }
2253876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org}
2254