15a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org// Copyright 2008 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
45a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
5f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org"use strict";
6f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org
75a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgString.prototype.startsWith = function (str) {
81b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (str.length > this.length) {
95a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    return false;
101b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  }
115a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  return this.substr(0, str.length) == str;
121b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
1437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction log10(num) {
1537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return Math.log(num)/Math.log(10);
1637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
175a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
185a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgfunction ToInspectableObject(obj) {
195a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  if (!obj && typeof obj === 'object') {
20690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org    return UNDEFINED;
215a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  } else {
225a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    return Object(obj);
235a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  }
245a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}
255a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
265a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgfunction GetCompletions(global, last, full) {
275a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  var full_tokens = full.split();
285a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  full = full_tokens.pop();
295a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  var parts = full.split('.');
305a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  parts.pop();
315a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  var current = global;
325a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  for (var i = 0; i < parts.length; i++) {
335a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    var part = parts[i];
345a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    var next = current[part];
351b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    if (!next) {
365a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org      return [];
371b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    }
385a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    current = next;
395a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  }
405a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  var result = [];
415a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  current = ToInspectableObject(current);
425a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  while (typeof current !== 'undefined') {
435a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    var mirror = new $debug.ObjectMirror(current);
445a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    var properties = mirror.properties();
455a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    for (var i = 0; i < properties.length; i++) {
465a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org      var name = properties[i].name();
471b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      if (typeof name === 'string' && name.startsWith(last)) {
485a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org        result.push(name);
491b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      }
505a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    }
51750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    current = ToInspectableObject(Object.getPrototypeOf(current));
525a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  }
535a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  return result;
545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}
5537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
5637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
5737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Global object holding debugger related constants and state.
58f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar Debug = {};
5937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
6037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
6137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Debug events which can occour in the V8 JavaScript engine. These originate
62245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// from the API include file v8-debug.h.
6337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebug.DebugEvent = { Break: 1,
6437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                     Exception: 2,
6537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                     NewFunction: 3,
6637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                     BeforeCompile: 4,
6737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                     AfterCompile: 5 };
6837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
6937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
7037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// The different types of scripts matching enum ScriptType in objects.h.
7137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebug.ScriptType = { Native: 0,
7237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                     Extension: 1,
7337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                     Normal: 2 };
7437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
7537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
76e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org// The different types of script compilations matching enum
77e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org// Script::CompilationType in objects.h.
78e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgDebug.ScriptCompilationType = { Host: 0,
79e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org                                Eval: 1,
80e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org                                JSON: 2 };
81e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
82e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
83eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org// The different types of scopes matching constants runtime.cc.
84eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgDebug.ScopeType = { Global: 0,
85eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org                    Local: 1,
86eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org                    With: 2,
87a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org                    Closure: 3,
884acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org                    Catch: 4,
894acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org                    Block: 5 };
90eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
91eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
9237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Current debug state.
93f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kNoFrame = -1;
9437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebug.State = {
9537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  currentFrame: kNoFrame,
96d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  displaySourceStartLine: -1,
97d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  displaySourceEndLine: -1,
9837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  currentSourceLine: -1
991b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
100245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgvar trace_compile = false;  // Tracing all compile events?
101d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgvar trace_debug_json = false; // Tracing all debug json packets?
102ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgvar last_cmd = '';
103d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgvar repeat_cmd_line = '';
104d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgvar is_running = true;
105ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org// Global variable used to store whether a handle was requested.
106ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgvar lookup_handle = null;
107d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
108d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// Copied from debug-delay.js.  This is needed below:
109d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgfunction ScriptTypeFlag(type) {
110d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return (1 << type);
111d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org}
11237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
11337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
1147be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// Process a debugger JSON message into a display text and a running status.
1157be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// This function returns an object with properties "text" and "running" holding
1167be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// this information.
1177be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgfunction DebugMessageDetails(message) {
118d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (trace_debug_json) {
119d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    print("received: '" + message + "'");
120d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
121061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  // Convert the JSON string to an object.
1227be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  var response = new ProtocolPackage(message);
123d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  is_running = response.running();
1247be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
1257be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  if (response.type() == 'event') {
1267be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    return DebugEventDetails(response);
1277be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  } else {
1287be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    return DebugResponseDetails(response);
1297be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  }
1307be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org}
1317be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
1327be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgfunction DebugEventDetails(response) {
133ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  var details = {text:'', running:false};
1347be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
1357be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  // Get the running state.
1367be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  details.running = response.running();
137061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
138061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  var body = response.body();
1397be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  var result = '';
140061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  switch (response.event()) {
141061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    case 'break':
142061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org      if (body.breakpoints) {
1437be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += 'breakpoint';
144061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org        if (body.breakpoints.length > 1) {
1457be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += 's';
14637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
1477be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += ' #';
148061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org        for (var i = 0; i < body.breakpoints.length; i++) {
149245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org          if (i > 0) {
1507be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            result += ', #';
151245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org          }
1527be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += body.breakpoints[i];
15337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
154245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      } else {
1557be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += 'break';
15637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      }
1577be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += ' in ';
1587be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += body.invocationText;
1597be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += ', ';
1607be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += SourceInfo(body);
1617be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += '\n';
1627be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += SourceUnderline(body.sourceLineText, body.sourceColumn);
163061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org      Debug.State.currentSourceLine = body.sourceLine;
164d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      Debug.State.displaySourceStartLine = -1;
165d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      Debug.State.displaySourceEndLine = -1;
16637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      Debug.State.currentFrame = 0;
1677be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      details.text = result;
1687be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      break;
16925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
170061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    case 'exception':
171061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org      if (body.uncaught) {
1727be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += 'Uncaught: ';
173245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      } else {
1747be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += 'Exception: ';
175245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      }
1767be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += '"';
1777be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += body.exception.text;
1787be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      result += '"';
179061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org      if (body.sourceLine >= 0) {
1807be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += ', ';
1817be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += SourceInfo(body);
1827be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += '\n';
1837be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += SourceUnderline(body.sourceLineText, body.sourceColumn);
184061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org        Debug.State.currentSourceLine = body.sourceLine;
185d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        Debug.State.displaySourceStartLine = -1;
186d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        Debug.State.displaySourceEndLine = -1;
187245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        Debug.State.currentFrame = 0;
188245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      } else {
1897be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org        result += ' (empty stack)';
190245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        Debug.State.currentSourceLine = -1;
191d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        Debug.State.displaySourceStartLine = -1;
192d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        Debug.State.displaySourceEndLine = -1;
193245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        Debug.State.currentFrame = kNoFrame;
194245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      }
1957be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      details.text = result;
1967be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      break;
197061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
198061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    case 'afterCompile':
199245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      if (trace_compile) {
2001b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        result = 'Source ' + body.script.name + ' compiled:\n';
201061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org        var source = body.script.source;
202245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        if (!(source[source.length - 1] == '\n')) {
2037be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += source;
204245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        } else {
2057be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += source.substring(0, source.length - 1);
206245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        }
207245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      }
2087be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      details.text = result;
2097be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      break;
2107be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
2117be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    default:
2127be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      details.text = 'Unknown debug event ' + response.event();
21337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
2147be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
2157be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return details;
2161b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
21737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
21837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
219061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.orgfunction SourceInfo(body) {
220061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  var result = '';
22125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
222061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  if (body.script) {
223061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    if (body.script.name) {
224061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org      result += body.script.name;
225061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    } else {
226061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org      result += '[unnamed]';
227061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    }
228061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  }
229061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  result += ' line ';
230061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  result += body.sourceLine + 1;
231061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  result += ' column ';
232061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  result += body.sourceColumn + 1;
23325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
234061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  return result;
235061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org}
236061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
237061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
23837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction SourceUnderline(source_text, position) {
23937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (!source_text) {
24037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    return;
24137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
24237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
24337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Create an underline with a caret pointing to the source position. If the
24437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // source contains a tab character the underline will have a tab character in
24537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // the same place otherwise the underline will have a space character.
24637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var underline = '';
24737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  for (var i = 0; i < position; i++) {
24837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (source_text[i] == '\t') {
24937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      underline += '\t';
25037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    } else {
25137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      underline += ' ';
25237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
25337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
25437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  underline += '^';
25537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
25637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Return the source line text with the underline beneath.
25737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return source_text + '\n' + underline;
2581b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
25937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
26037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
26137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Converts a text command to a JSON request.
26237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction DebugCommandToJSONRequest(cmd_line) {
263d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var result = new DebugRequest(cmd_line).JSONRequest();
264d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (trace_debug_json && result) {
265d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    print("sending: '" + result + "'");
266d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
267d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return result;
2681b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
26937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
27037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
27137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction DebugRequest(cmd_line) {
27237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // If the very first character is a { assume that a JSON request have been
27337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // entered as a command. Converting that to a JSON request is trivial.
27437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (cmd_line && cmd_line.length > 0 && cmd_line.charAt(0) == '{') {
27537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    this.request_ = cmd_line;
27637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    return;
27737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
27837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
279d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Check for a simple carriage return to repeat the last command:
280d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var is_repeating = false;
281d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (cmd_line == '\n') {
282d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if (is_running) {
283d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      cmd_line = 'break'; // Not in debugger mode, break with a frame request.
284d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    } else {
285d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      cmd_line = repeat_cmd_line; // use command to repeat.
286d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      is_repeating = true;
287d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
288d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
289d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (!is_running) { // Only save the command if in debugger mode.
290d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    repeat_cmd_line = cmd_line;   // save last command.
291d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
292d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
29337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Trim string for leading and trailing whitespace.
29437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  cmd_line = cmd_line.replace(/^\s+|\s+$/g, '');
29537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
29637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Find the command.
29737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var pos = cmd_line.indexOf(' ');
29837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var cmd;
29937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var args;
30037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (pos == -1) {
30137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    cmd = cmd_line;
30237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    args = '';
30337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } else {
30437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    cmd = cmd_line.slice(0, pos);
30537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    args = cmd_line.slice(pos).replace(/^\s+|\s+$/g, '');
30637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
30737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
308d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if ((cmd === undefined) || !cmd) {
309690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org    this.request_ = UNDEFINED;
310d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    return;
311d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
312d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
313d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  last_cmd = cmd;
314d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
31537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Switch on command.
31637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  switch (cmd) {
31737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'continue':
31837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'c':
31937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.continueCommandToJSONRequest_(args);
32037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
32137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
32237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'step':
32337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 's':
324d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.stepCommandToJSONRequest_(args, 'in');
325d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
326d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
327d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'stepi':
328d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'si':
329d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.stepCommandToJSONRequest_(args, 'min');
330d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
331d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
332d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'next':
333d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'n':
334d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.stepCommandToJSONRequest_(args, 'next');
335d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
336d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
337d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'finish':
338d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'fin':
339d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.stepCommandToJSONRequest_(args, 'out');
34037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
34137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
34237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'backtrace':
34337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'bt':
34437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.backtraceCommandToJSONRequest_(args);
34537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
34625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
34737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'frame':
34837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'f':
34937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.frameCommandToJSONRequest_(args);
35037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
35125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
352eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    case 'scopes':
353eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      this.request_ = this.scopesCommandToJSONRequest_(args);
354eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      break;
35525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
356eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    case 'scope':
357eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      this.request_ = this.scopeCommandToJSONRequest_(args);
358eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      break;
35925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
360d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'disconnect':
361d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'exit':
362d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'quit':
363d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.disconnectCommandToJSONRequest_(args);
364d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
365d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
366d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'up':
367d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ =
368d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          this.frameCommandToJSONRequest_('' +
369d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org                                          (Debug.State.currentFrame + 1));
370d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
37128a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org
372d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'down':
373d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'do':
374d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ =
375d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          this.frameCommandToJSONRequest_('' +
376d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org                                          (Debug.State.currentFrame - 1));
377d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
37828a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org
379d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'set':
38037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'print':
38137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'p':
38237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.printCommandToJSONRequest_(args);
38337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
38437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
385ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    case 'dir':
386ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      this.request_ = this.dirCommandToJSONRequest_(args);
387ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      break;
388ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
389245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    case 'references':
390245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      this.request_ = this.referencesCommandToJSONRequest_(args);
391245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      break;
392245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
393245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    case 'instances':
394245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      this.request_ = this.instancesCommandToJSONRequest_(args);
395245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      break;
396245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
397d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'list':
398d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'l':
399d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.listCommandToJSONRequest_(args);
400d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
40137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'source':
40237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.sourceCommandToJSONRequest_(args);
40337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
40425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
40537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'scripts':
406d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'script':
407d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'scr':
40837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.scriptsCommandToJSONRequest_(args);
40937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
41025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
41137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'break':
41237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'b':
41337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.breakCommandToJSONRequest_(args);
41437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
41525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
416dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    case 'breakpoints':
417dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    case 'bb':
418dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      this.request_ = this.breakpointsCommandToJSONRequest_(args);
419dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      break;
420dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
42137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'clear':
422d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'delete':
423d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'd':
42437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.request_ = this.clearCommandToJSONRequest_(args);
42537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
42637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
427bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    case 'threads':
428bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org      this.request_ = this.threadsCommandToJSONRequest_(args);
429bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org      break;
430bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
431d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'cond':
432d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.changeBreakpointCommandToJSONRequest_(args, 'cond');
433d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
434d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
435d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'enable':
436d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'en':
437d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ =
438d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          this.changeBreakpointCommandToJSONRequest_(args, 'enable');
439d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
440d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
441d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'disable':
442d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'dis':
443d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ =
444d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          this.changeBreakpointCommandToJSONRequest_(args, 'disable');
445d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
446d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
447d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'ignore':
448d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ =
449d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          this.changeBreakpointCommandToJSONRequest_(args, 'ignore');
450d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
451d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
452d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'info':
453d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'inf':
454d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.infoCommandToJSONRequest_(args);
455d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
456d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
457d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'flags':
458d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.v8FlagsToJSONRequest_(args);
459d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
460d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
461d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'gc':
462d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      this.request_ = this.gcToJSONRequest_(args);
463d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
464d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
465245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    case 'trace':
466d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'tr':
467245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      // Return undefined to indicate command handled internally (no JSON).
468690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org      this.request_ = UNDEFINED;
469245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      this.traceCommand_(args);
470245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      break;
471245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
47237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case 'help':
47337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    case '?':
47437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      this.helpCommand_(args);
475245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      // Return undefined to indicate command handled internally (no JSON).
476690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org      this.request_ = UNDEFINED;
47737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      break;
47837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
47937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    default:
48037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      throw new Error('Unknown command "' + cmd + '"');
48137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
48237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
48337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
48437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.JSONRequest = function() {
48537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return this.request_;
4861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
48737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
48837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
48937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comfunction RequestPacket(command) {
49037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  this.seq = 0;
49137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  this.type = 'request';
49237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  this.command = command;
49337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
49437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
49537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
49637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comRequestPacket.prototype.toJSONProtocol = function() {
49737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Encode the protocol header.
49837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var json = '{';
49937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  json += '"seq":' + this.seq;
50037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  json += ',"type":"' + this.type + '"';
50137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (this.command) {
502285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    json += ',"command":' + JSON.stringify(this.command);
50337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
50437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (this.arguments) {
50537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    json += ',"arguments":';
50637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    // Encode the arguments part.
50737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (this.arguments.toJSONProtocol) {
5081b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      json += this.arguments.toJSONProtocol();
50937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    } else {
510285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      json += JSON.stringify(this.arguments);
51137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
51237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
51337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  json += '}';
51437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return json;
5151b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
51637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
51737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
51837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.createRequest = function(command) {
51937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return new RequestPacket(command);
52037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
52137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
52237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
523ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// Create a JSON request for the evaluation command.
524ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgDebugRequest.prototype.makeEvaluateJSONRequest_ = function(expression) {
525eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  lookup_handle = null;
5269ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
527ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Check if the expression is a handle id in the form #<handle>#.
528ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  var handle_match = expression.match(/^#([0-9]*)#$/);
529ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  if (handle_match) {
530eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    // Remember the handle requested in a global variable.
531eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    lookup_handle = parseInt(handle_match[1]);
532245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    // Build a lookup request.
533ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    var request = this.createRequest('lookup');
534ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    request.arguments = {};
535eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    request.arguments.handles = [ lookup_handle ];
536ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    return request.toJSONProtocol();
537ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  } else {
538ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    // Build an evaluate request.
539ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    var request = this.createRequest('evaluate');
540ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    request.arguments = {};
541ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    request.arguments.expression = expression;
542381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    // Request a global evaluation if there is no current frame.
543381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    if (Debug.State.currentFrame == kNoFrame) {
544381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org      request.arguments.global = true;
545381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    }
546ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    return request.toJSONProtocol();
547ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
548ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org};
549ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
550ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
551245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// Create a JSON request for the references/instances command.
552245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebugRequest.prototype.makeReferencesJSONRequest_ = function(handle, type) {
553245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Build a references request.
554245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var handle_match = handle.match(/^#([0-9]*)#$/);
555245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (handle_match) {
556245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    var request = this.createRequest('references');
557245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    request.arguments = {};
558245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    request.arguments.type = type;
559245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    request.arguments.handle = parseInt(handle_match[1]);
560245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return request.toJSONProtocol();
561245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  } else {
562245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    throw new Error('Invalid object id.');
563245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
564245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org};
565245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
566ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
56737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the continue command.
56837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.continueCommandToJSONRequest_ = function(args) {
56937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var request = this.createRequest('continue');
57037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
57137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
57237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
57337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
57437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the step command.
575d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugRequest.prototype.stepCommandToJSONRequest_ = function(args, type) {
57637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Requesting a step is through the continue command with additional
57737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // arguments.
57837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var request = this.createRequest('continue');
57937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  request.arguments = {};
58037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
58137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Process arguments if any.
582d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
583d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Only process args if the command is 'step' which is indicated by type being
584d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // set to 'in'.  For all other commands, ignore the args.
58537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args && args.length > 0) {
586d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    args = args.split(/\s+/g);
58737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
58837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (args.length > 2) {
58937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      throw new Error('Invalid step arguments.');
59037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
59137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
59237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (args.length > 0) {
593d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      // Check if we have a gdb stype step command.  If so, the 1st arg would
594d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      // be the step count.  If it's not a number, then assume that we're
595d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      // parsing for the legacy v8 step command.
596d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      var stepcount = Number(args[0]);
597d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (stepcount == Number.NaN) {
598d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        // No step count at arg 1.  Process as legacy d8 step command:
599d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (args.length == 2) {
600d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          var stepcount = parseInt(args[1]);
601d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          if (isNaN(stepcount) || stepcount <= 0) {
602d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            throw new Error('Invalid step count argument "' + args[0] + '".');
603d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          }
604d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          request.arguments.stepcount = stepcount;
60537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
60637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
607d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        // Get the step action.
608d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        switch (args[0]) {
609d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'in':
610d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'i':
611d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            request.arguments.stepaction = 'in';
612d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            break;
61325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
614d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'min':
615d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'm':
616d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            request.arguments.stepaction = 'min';
617d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            break;
61825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
619d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'next':
620d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'n':
621d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            request.arguments.stepaction = 'next';
622d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            break;
62325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
624d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'out':
625d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          case 'o':
626d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            request.arguments.stepaction = 'out';
627d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            break;
62825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
629d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          default:
630d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            throw new Error('Invalid step argument "' + args[0] + '".');
631d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
632d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
633d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      } else {
634d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        // gdb style step commands:
635d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        request.arguments.stepaction = type;
636d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        request.arguments.stepcount = stepcount;
63737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      }
63837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
63937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } else {
640d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // Default is step of the specified type.
641d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    request.arguments.stepaction = type;
64237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
64337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
64437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
64537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
64637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
64737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
64837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the backtrace command.
64937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.backtraceCommandToJSONRequest_ = function(args) {
65037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Build a backtrace request from the text command.
65137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var request = this.createRequest('backtrace');
65225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
653b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  // Default is to show top 10 frames.
654b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  request.arguments = {};
655b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  request.arguments.fromFrame = 0;
656b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  request.arguments.toFrame = 10;
657b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
65837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  args = args.split(/\s*[ ]+\s*/g);
659b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  if (args.length == 1 && args[0].length > 0) {
660b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    var frameCount = parseInt(args[0]);
661b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (frameCount > 0) {
662b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      // Show top frames.
663b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      request.arguments.fromFrame = 0;
664b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      request.arguments.toFrame = frameCount;
665b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    } else {
666b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      // Show bottom frames.
667b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      request.arguments.fromFrame = 0;
668b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      request.arguments.toFrame = -frameCount;
669b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      request.arguments.bottom = true;
670b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    }
671b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  } else if (args.length == 2) {
67237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    var fromFrame = parseInt(args[0]);
67337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    var toFrame = parseInt(args[1]);
67437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (isNaN(fromFrame) || fromFrame < 0) {
67537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      throw new Error('Invalid start frame argument "' + args[0] + '".');
67637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
67737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (isNaN(toFrame) || toFrame < 0) {
67837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      throw new Error('Invalid end frame argument "' + args[1] + '".');
67937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
68037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (fromFrame > toFrame) {
68137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      throw new Error('Invalid arguments start frame cannot be larger ' +
68237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com                      'than end frame.');
68337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
684b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    // Show frame range.
68537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments.fromFrame = fromFrame;
68637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments.toFrame = toFrame + 1;
687b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  } else if (args.length > 2) {
688b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    throw new Error('Invalid backtrace arguments.');
68937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
690b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
69137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
69237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
69337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
69437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
69537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the frame command.
69637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.frameCommandToJSONRequest_ = function(args) {
69737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Build a frame request from the text command.
69837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var request = this.createRequest('frame');
69937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  args = args.split(/\s*[ ]+\s*/g);
70037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args.length > 0 && args[0].length > 0) {
70137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments = {};
70237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments.number = args[0];
70337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
70437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
70537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
70637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
70737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
708eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org// Create a JSON request for the scopes command.
709eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgDebugRequest.prototype.scopesCommandToJSONRequest_ = function(args) {
710eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // Build a scopes request from the text command.
711eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var request = this.createRequest('scopes');
712eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return request.toJSONProtocol();
713eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org};
714eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
715eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
716eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org// Create a JSON request for the scope command.
717eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgDebugRequest.prototype.scopeCommandToJSONRequest_ = function(args) {
718eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // Build a scope request from the text command.
719eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var request = this.createRequest('scope');
720eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  args = args.split(/\s*[ ]+\s*/g);
721eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  if (args.length > 0 && args[0].length > 0) {
722eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    request.arguments = {};
723eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    request.arguments.number = args[0];
724eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
725eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return request.toJSONProtocol();
726eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org};
727eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
728eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
72937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the print command.
73037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.printCommandToJSONRequest_ = function(args) {
731ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Build an evaluate request from the text command.
73237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args.length == 0) {
73337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    throw new Error('Missing expression.');
73437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
735ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.makeEvaluateJSONRequest_(args);
736ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org};
73737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
73837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
739ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// Create a JSON request for the dir command.
740ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgDebugRequest.prototype.dirCommandToJSONRequest_ = function(args) {
741ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Build an evaluate request from the text command.
742ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  if (args.length == 0) {
743ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    throw new Error('Missing expression.');
744ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
745ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.makeEvaluateJSONRequest_(args);
74637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
74737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
74837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
749245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// Create a JSON request for the references command.
750245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebugRequest.prototype.referencesCommandToJSONRequest_ = function(args) {
751245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Build an evaluate request from the text command.
752245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (args.length == 0) {
753245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    throw new Error('Missing object id.');
754245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
75525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
756245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return this.makeReferencesJSONRequest_(args, 'referencedBy');
757245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org};
758245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
759245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
760245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// Create a JSON request for the instances command.
761245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebugRequest.prototype.instancesCommandToJSONRequest_ = function(args) {
762245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Build an evaluate request from the text command.
763245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (args.length == 0) {
764245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    throw new Error('Missing object id.');
765245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
76625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
767245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Build a references request.
768245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return this.makeReferencesJSONRequest_(args, 'constructedBy');
769245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org};
770245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
771245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
772d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// Create a JSON request for the list command.
773d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugRequest.prototype.listCommandToJSONRequest_ = function(args) {
774d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
775d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Default is ten lines starting five lines before the current location.
776d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (Debug.State.displaySourceEndLine == -1) {
777d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // If we list forwards, we will start listing after the last source end
778d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // line.  Set it to start from 5 lines before the current location.
779d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    Debug.State.displaySourceEndLine = Debug.State.currentSourceLine - 5;
780d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // If we list backwards, we will start listing backwards from the last
781d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // source start line.  Set it to start from 1 lines before the current
782d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // location.
783d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    Debug.State.displaySourceStartLine = Debug.State.currentSourceLine + 1;
784d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
785d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
786d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var from = Debug.State.displaySourceEndLine + 1;
787d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var lines = 10;
788d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
789d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Parse the arguments.
790d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  args = args.split(/\s*,\s*/g);
791d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (args == '') {
792d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if ((args.length == 1) && (args[0] == '-')) {
793d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    from = Debug.State.displaySourceStartLine - lines;
794d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if (args.length == 2) {
795d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    from = parseInt(args[0]);
796d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    lines = parseInt(args[1]) - from + 1; // inclusive of the ending line.
797d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else {
798d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    throw new Error('Invalid list arguments.');
799d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
800d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  Debug.State.displaySourceStartLine = from;
801d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  Debug.State.displaySourceEndLine = from + lines - 1;
802d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var sourceArgs = '' + from + ' ' + lines;
803d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return this.sourceCommandToJSONRequest_(sourceArgs);
804d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
805d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
806d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
80737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the source command.
80837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.sourceCommandToJSONRequest_ = function(args) {
80937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Build a evaluate request from the text command.
81037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var request = this.createRequest('source');
81137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
81237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Default is ten lines starting five lines before the current location.
81337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var from = Debug.State.currentSourceLine - 5;
81437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var lines = 10;
81537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
81637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Parse the arguments.
81737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  args = args.split(/\s*[ ]+\s*/g);
81837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args.length > 1 && args[0].length > 0 && args[1].length > 0) {
81937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    from = parseInt(args[0]) - 1;
82037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    lines = parseInt(args[1]);
82137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } else if (args.length > 0 && args[0].length > 0) {
82237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    from = parseInt(args[0]) - 1;
82337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
82437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
82537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (from < 0) from = 0;
82637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (lines < 0) lines = 10;
82737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
82837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Request source arround current source location.
82937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  request.arguments = {};
83037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  request.arguments.fromLine = from;
83137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  request.arguments.toLine = from + lines;
83237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
83337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
83437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
83537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
83637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
83737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the scripts command.
83837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.scriptsCommandToJSONRequest_ = function(args) {
83937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Build a evaluate request from the text command.
84037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var request = this.createRequest('scripts');
84137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
84237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Process arguments if any.
84337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args && args.length > 0) {
84437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    args = args.split(/\s*[ ]+\s*/g);
84537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
84637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (args.length > 1) {
84737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      throw new Error('Invalid scripts arguments.');
84837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
84937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
85037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments = {};
85137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    switch (args[0]) {
85237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'natives':
85337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        request.arguments.types = ScriptTypeFlag(Debug.ScriptType.Native);
85437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
85525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
85637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'extensions':
85737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        request.arguments.types = ScriptTypeFlag(Debug.ScriptType.Extension);
85837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
85925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
86037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'all':
86137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        request.arguments.types =
86237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            ScriptTypeFlag(Debug.ScriptType.Normal) |
86337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            ScriptTypeFlag(Debug.ScriptType.Native) |
86437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            ScriptTypeFlag(Debug.ScriptType.Extension);
86537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
86625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
86737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      default:
868d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        // If the arg is not one of the know one aboves, then it must be a
869d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        // filter used for filtering the results:
870d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        request.arguments.filter = args[0];
871d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
87237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
87337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
87437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
87537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
87637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
87737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
87837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
87937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the break command.
88037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.breakCommandToJSONRequest_ = function(args) {
88137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Build a evaluate request from the text command.
88237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Process arguments if any.
88337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args && args.length > 0) {
88437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    var target = args;
88565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var type = 'function';
88665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var line;
88765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var column;
88837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    var condition;
88965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var pos;
89037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
891c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org    var request = this.createRequest('setbreakpoint');
892c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org
893d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // Break the args into target spec and condition if appropriate.
894d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
89565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    // Check for breakpoint condition.
89665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    pos = args.indexOf(' ');
89737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    if (pos > 0) {
89837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      target = args.substring(0, pos);
89937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      condition = args.substring(pos + 1, args.length);
90037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
90137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
90265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    // Check for script breakpoint (name:line[:column]). If no ':' in break
90365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    // specification it is considered a function break point.
90465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    pos = target.indexOf(':');
90565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    if (pos > 0) {
90665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      var tmp = target.substring(pos + 1, target.length);
90765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      target = target.substring(0, pos);
908ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      if (target[0] == '/' && target[target.length - 1] == '/') {
909ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org        type = 'scriptRegExp';
910ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org        target = target.substring(1, target.length - 1);
911ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      } else {
912ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org        type = 'script';
913ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      }
91425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
91565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      // Check for both line and column.
91665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      pos = tmp.indexOf(':');
91765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      if (pos > 0) {
91865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org        column = parseInt(tmp.substring(pos + 1, tmp.length)) - 1;
91965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org        line = parseInt(tmp.substring(0, pos)) - 1;
92065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      } else {
92165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org        line = parseInt(tmp) - 1;
92265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      }
92365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    } else if (target[0] == '#' && target[target.length - 1] == '#') {
92465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      type = 'handle';
92565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      target = target.substring(1, target.length - 1);
92665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    } else {
92765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      type = 'function';
92865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    }
92925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
93037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments = {};
93165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    request.arguments.type = type;
93237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments.target = target;
93365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    request.arguments.line = line;
93465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    request.arguments.column = column;
93537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments.condition = condition;
93637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } else {
937c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org    var request = this.createRequest('suspend');
93837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
93937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
94037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
94137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
94237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
94337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
944dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.orgDebugRequest.prototype.breakpointsCommandToJSONRequest_ = function(args) {
945dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  if (args && args.length > 0) {
946dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    throw new Error('Unexpected arguments.');
947dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  }
948dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  var request = this.createRequest('listbreakpoints');
949dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  return request.toJSONProtocol();
950dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org};
951dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
952dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
95337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Create a JSON request for the clear command.
95437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.clearCommandToJSONRequest_ = function(args) {
95537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Build a evaluate request from the text command.
95637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  var request = this.createRequest('clearbreakpoint');
95737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
95837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Process arguments if any.
95937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args && args.length > 0) {
96037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments = {};
96137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    request.arguments.breakpoint = parseInt(args);
96237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } else {
96337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    throw new Error('Invalid break arguments.');
96437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
96537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
96637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return request.toJSONProtocol();
96737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com};
96837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
96937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
970d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// Create a JSON request for the change breakpoint command.
971d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugRequest.prototype.changeBreakpointCommandToJSONRequest_ =
972d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    function(args, command) {
973d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
974d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var request;
975d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
976d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Check for exception breaks first:
977d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  //   en[able] exc[eptions] [all|unc[aught]]
978d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  //   en[able] [all|unc[aught]] exc[eptions]
979d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  //   dis[able] exc[eptions] [all|unc[aught]]
980d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  //   dis[able] [all|unc[aught]] exc[eptions]
981d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if ((command == 'enable' || command == 'disable') &&
982d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      args && args.length > 1) {
983d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var nextPos = args.indexOf(' ');
984d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var arg1 = (nextPos > 0) ? args.substring(0, nextPos) : args;
985d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var excType = null;
986d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
987d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // Check for:
988d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    //   en[able] exc[eptions] [all|unc[aught]]
989d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    //   dis[able] exc[eptions] [all|unc[aught]]
990d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if (arg1 == 'exc' || arg1 == 'exception' || arg1 == 'exceptions') {
991d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
992d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      var arg2 = (nextPos > 0) ?
993d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          args.substring(nextPos + 1, args.length) : 'all';
994d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (!arg2) {
995d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        arg2 = 'all'; // if unspecified, set for all.
996c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org      } else if (arg2 == 'unc') { // check for short cut.
997d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        arg2 = 'uncaught';
998d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      }
999d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      excType = arg2;
100028a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org
1001d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // Check for:
1002d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    //   en[able] [all|unc[aught]] exc[eptions]
1003d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    //   dis[able] [all|unc[aught]] exc[eptions]
1004d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    } else if (arg1 == 'all' || arg1 == 'unc' || arg1 == 'uncaught') {
1005d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1006d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      var arg2 = (nextPos > 0) ?
1007d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          args.substring(nextPos + 1, args.length) : null;
1008d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (arg2 == 'exc' || arg1 == 'exception' || arg1 == 'exceptions') {
1009d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        excType = arg1;
1010d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (excType == 'unc') {
1011d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          excType = 'uncaught';
1012d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
1013d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      }
1014d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
1015d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1016d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // If we matched one of the command formats, then excType will be non-null:
1017d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if (excType) {
1018d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      // Build a evaluate request from the text command.
1019d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      request = this.createRequest('setexceptionbreak');
1020d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1021d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      request.arguments = {};
1022d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      request.arguments.type = excType;
1023d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      request.arguments.enabled = (command == 'enable');
1024d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1025d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      return request.toJSONProtocol();
1026d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
1027d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1028d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1029d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Build a evaluate request from the text command.
1030d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  request = this.createRequest('changebreakpoint');
1031d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1032d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Process arguments if any.
1033d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (args && args.length > 0) {
1034d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    request.arguments = {};
1035d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var pos = args.indexOf(' ');
1036d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var breakpointArg = args;
1037d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var otherArgs;
1038d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if (pos > 0) {
1039d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      breakpointArg = args.substring(0, pos);
1040d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      otherArgs = args.substring(pos + 1, args.length);
1041d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
1042d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1043d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    request.arguments.breakpoint = parseInt(breakpointArg);
1044d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1045d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    switch(command) {
1046d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'cond':
1047d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        request.arguments.condition = otherArgs ? otherArgs : null;
1048d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1049d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'enable':
1050d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        request.arguments.enabled = true;
1051d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1052d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'disable':
1053d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        request.arguments.enabled = false;
1054d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1055d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'ignore':
1056d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        request.arguments.ignoreCount = parseInt(otherArgs);
1057d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1058d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      default:
105928a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org        throw new Error('Invalid arguments.');
1060d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
1061d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else {
1062d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    throw new Error('Invalid arguments.');
1063d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1064d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1065d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return request.toJSONProtocol();
1066d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
1067d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1068d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1069d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// Create a JSON request for the disconnect command.
1070d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugRequest.prototype.disconnectCommandToJSONRequest_ = function(args) {
1071d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var request;
1072d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  request = this.createRequest('disconnect');
1073d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return request.toJSONProtocol();
1074d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
1075d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1076d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1077d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// Create a JSON request for the info command.
1078d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugRequest.prototype.infoCommandToJSONRequest_ = function(args) {
1079d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var request;
1080d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (args && (args == 'break' || args == 'br')) {
1081d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // Build a evaluate request from the text command.
1082d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    request = this.createRequest('listbreakpoints');
1083d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    last_cmd = 'info break';
1084d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if (args && (args == 'locals' || args == 'lo')) {
1085d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // Build a evaluate request from the text command.
1086d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    request = this.createRequest('frame');
1087d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    last_cmd = 'info locals';
1088d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if (args && (args == 'args' || args == 'ar')) {
1089d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    // Build a evaluate request from the text command.
1090d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    request = this.createRequest('frame');
1091d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    last_cmd = 'info args';
1092d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else {
1093d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    throw new Error('Invalid info arguments.');
1094d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1095d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1096d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return request.toJSONProtocol();
1097d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
1098d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1099d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1100d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugRequest.prototype.v8FlagsToJSONRequest_ = function(args) {
1101d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var request;
1102d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  request = this.createRequest('v8flags');
1103d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  request.arguments = {};
1104d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  request.arguments.flags = args;
1105d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return request.toJSONProtocol();
1106d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
1107d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1108d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1109d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugRequest.prototype.gcToJSONRequest_ = function(args) {
1110d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var request;
1111d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (!args) {
1112d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    args = 'all';
1113d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1114d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var args = args.split(/\s+/g);
1115d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var cmd = args[0];
1116d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1117d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  switch(cmd) {
1118d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'all':
1119d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'quick':
1120d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'full':
1121d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'young':
1122d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'old':
1123d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'compact':
1124d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'sweep':
1125d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    case 'scavenge': {
1126d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (cmd == 'young') { cmd = 'quick'; }
1127d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      else if (cmd == 'old') { cmd = 'full'; }
1128d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1129d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      request = this.createRequest('gc');
1130d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      request.arguments = {};
1131d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      request.arguments.type = cmd;
1132d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      break;
1133d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
1134d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      // Else fall thru to the default case below to report the error.
1135d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    default:
1136d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      throw new Error('Missing arguments after ' + cmd + '.');
1137d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1138d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return request.toJSONProtocol();
1139d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
1140d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1141d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1142bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org// Create a JSON request for the threads command.
1143bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgDebugRequest.prototype.threadsCommandToJSONRequest_ = function(args) {
1144bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  // Build a threads request from the text command.
1145bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  var request = this.createRequest('threads');
1146bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  return request.toJSONProtocol();
1147bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org};
1148bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
1149bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
1150245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// Handle the trace command.
1151245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebugRequest.prototype.traceCommand_ = function(args) {
1152245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Process arguments.
1153245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (args && args.length > 0) {
1154245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    if (args == 'compile') {
1155245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      trace_compile = !trace_compile;
1156245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      print('Tracing of compiled scripts ' + (trace_compile ? 'on' : 'off'));
1157d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    } else if (args === 'debug json' || args === 'json' || args === 'packets') {
1158d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      trace_debug_json = !trace_debug_json;
1159d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      print('Tracing of debug json packets ' +
1160d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            (trace_debug_json ? 'on' : 'off'));
1161245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    } else {
1162245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      throw new Error('Invalid trace arguments.');
1163245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    }
1164245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  } else {
1165245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    throw new Error('Invalid trace arguments.');
1166245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
11671b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1168245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
1169245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// Handle the help command.
117037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comDebugRequest.prototype.helpCommand_ = function(args) {
117137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Help os quite simple.
117237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (args && args.length > 0) {
117337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    print('warning: arguments to \'help\' are ignored');
117437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
117537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
1176d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('Note: <> denotes symbollic values to be replaced with real values.');
1177d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('Note: [] denotes optional parts of commands, or optional options / arguments.');
1178d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('      e.g. d[elete] - you get the same command if you type d or delete.');
1179d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1180d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('[break] - break as soon as possible');
1181d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('b[reak] location [condition]');
1182d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('        - break on named function: location is a function name');
1183d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('        - break on function: location is #<id>#');
1184d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('        - break on script position: location is name:line[:column]');
1185d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1186d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('clear <breakpoint #>       - deletes the specified user defined breakpoint');
1187d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('d[elete]  <breakpoint #>   - deletes the specified user defined breakpoint');
1188d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('dis[able] <breakpoint #>   - disables the specified user defined breakpoint');
1189d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('dis[able] exc[eptions] [[all] | unc[aught]]');
1190d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('                           - disables breaking on exceptions');
1191d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('en[able]  <breakpoint #>   - enables the specified user defined breakpoint');
1192d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('en[able]  exc[eptions] [[all] | unc[aught]]');
1193d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('                           - enables breaking on exceptions');
1194d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1195d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('b[ack]t[race] [n] | [-n] | [from to]');
1196d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('                           - prints the stack back trace');
1197d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('f[rame]                    - prints info about the current frame context');
1198d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('f[rame] <frame #>          - set context to specified frame #');
1199eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  print('scopes');
1200eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  print('scope <scope #>');
1201d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1202d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('up                         - set context to caller of current frame');
1203d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('do[wn]                     - set context to callee of current frame');
1204d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('inf[o] br[eak]             - prints info about breakpoints in use');
1205d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('inf[o] ar[gs]              - prints info about arguments of the current function');
1206d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('inf[o] lo[cals]            - prints info about locals in the current function');
1207d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
120837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  print('step [in | next | out| min [step count]]');
1209d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('c[ontinue]                 - continue executing after a breakpoint');
1210d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('s[tep]   [<N>]             - step into the next N callees (default N is 1)');
1211d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('s[tep]i  [<N>]             - step into the next N callees (default N is 1)');
1212d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('n[ext]   [<N>]             - step over the next N callees (default N is 1)');
1213d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('fin[ish] [<N>]             - step out of N frames (default N is 1)');
1214d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1215d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('p[rint] <expression>       - prints the result of the specified expression');
1216d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('dir <expression>           - prints the object structure of the result');
1217d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('set <var> = <expression>   - executes the specified statement');
1218d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1219d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('l[ist]                     - list the source code around for the current pc');
1220d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('l[ist] [- | <start>,<end>] - list the specified range of source code');
122137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  print('source [from line [num lines]]');
1222d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('scr[ipts] [native|extensions|all]');
1223d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('scr[ipts] [<filter text>]  - list scripts with the specified text in its description');
1224d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1225d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('gc                         - runs the garbage collector');
1226d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1227245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  print('trace compile');
1228d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // hidden command: trace debug json - toggles tracing of debug json packets
1229d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('');
1230d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('disconnect|exit|quit       - disconnects and quits the debugger');
1231d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  print('help                       - prints this help information');
12321b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
123337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
123437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
1235ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction formatHandleReference_(value) {
1236eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  if (value.handle() >= 0) {
1237eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return '#' + value.handle() + '#';
1238eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  } else {
1239eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return '#Transient#';
1240eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
1241ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org}
1242ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1243ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1244245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgfunction formatObject_(value, include_properties) {
1245245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var result = '';
1246245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result += formatHandleReference_(value);
12471b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  result += ', type: object';
1248245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result += ', constructor ';
1249245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var ctor = value.constructorFunctionValue();
1250245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result += formatHandleReference_(ctor);
1251245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result += ', __proto__ ';
1252245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var proto = value.protoObjectValue();
1253245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result += formatHandleReference_(proto);
1254245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result += ', ';
1255245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result += value.propertyCount();
1256245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  result +=  ' properties.';
1257245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (include_properties) {
1258245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    result +=  '\n';
1259245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    for (var i = 0; i < value.propertyCount(); i++) {
1260245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      result += '  ';
1261245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      result += value.propertyName(i);
1262245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      result += ': ';
1263245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      var property_value = value.propertyValue(i);
1264eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      if (property_value instanceof ProtocolReference) {
1265245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        result += '<no type>';
1266eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      } else {
1267eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        if (property_value && property_value.type()) {
1268eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          result += property_value.type();
1269eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        } else {
1270eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          result += '<no type>';
1271eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        }
1272245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      }
1273245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      result += ' ';
1274245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      result += formatHandleReference_(property_value);
1275245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      result += '\n';
1276245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    }
1277245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
1278245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return result;
1279245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org}
1280245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
1281245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
1282eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction formatScope_(scope) {
1283eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var result = '';
1284eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var index = scope.index;
1285eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  result += '#' + (index <= 9 ? '0' : '') + index;
1286eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  result += ' ';
1287eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  switch (scope.type) {
1288eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    case Debug.ScopeType.Global:
1289eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      result += 'Global, ';
1290eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      result += '#' + scope.object.ref + '#';
1291eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      break;
1292eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    case Debug.ScopeType.Local:
1293eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      result += 'Local';
1294eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      break;
1295eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    case Debug.ScopeType.With:
1296eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      result += 'With, ';
1297eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      result += '#' + scope.object.ref + '#';
1298eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      break;
1299a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    case Debug.ScopeType.Catch:
1300a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org      result += 'Catch, ';
1301a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org      result += '#' + scope.object.ref + '#';
1302a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org      break;
1303eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    case Debug.ScopeType.Closure:
1304eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      result += 'Closure';
1305eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      break;
1306eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    default:
1307eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      result += 'UNKNOWN';
1308eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
1309eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return result;
1310eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
1311eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1312eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1313d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgfunction refObjectToString_(protocolPackage, handle) {
1314d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var value = protocolPackage.lookup(handle);
1315d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var result = '';
1316d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (value.isString()) {
1317d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    result = '"' + value.value() + '"';
1318d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if (value.isPrimitive()) {
1319d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    result = value.valueString();
1320d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if (value.isObject()) {
1321d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    result += formatObject_(value, true);
1322d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1323d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return result;
1324d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org}
1325d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1326d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1327d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org// Rounds number 'num' to 'length' decimal places.
1328d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgfunction roundNumber(num, length) {
1329d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var factor = Math.pow(10, length);
1330d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return Math.round(num * factor) / factor;
1331d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org}
1332d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1333d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
133437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// Convert a JSON response to text for display in a text based debugger.
13357be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgfunction DebugResponseDetails(response) {
1336ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  var details = { text: '', running: false };
133737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
133837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  try {
1339ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    if (!response.success()) {
1340ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      details.text = response.message();
134137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      return details;
134237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
134337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
134437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    // Get the running state.
1345ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    details.running = response.running();
134637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
1347ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    var body = response.body();
1348ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    var result = '';
1349ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    switch (response.command()) {
1350c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org      case 'suspend':
1351c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org        details.text = 'stopped';
1352c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org        break;
135342841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org
135437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'setbreakpoint':
135537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        result = 'set breakpoint #';
135637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        result += body.breakpoint;
135737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        details.text = result;
135837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
135925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
136037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'clearbreakpoint':
136137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        result = 'cleared breakpoint #';
136237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        result += body.breakpoint;
136337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        details.text = result;
136437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
136542841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org
1366d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'changebreakpoint':
1367d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        result = 'successfully changed breakpoint';
1368d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        details.text = result;
1369d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1370d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1371dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      case 'listbreakpoints':
1372dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org        result = 'breakpoints: (' + body.breakpoints.length + ')';
1373dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org        for (var i = 0; i < body.breakpoints.length; i++) {
1374dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          var breakpoint = body.breakpoints[i];
1375dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          result += '\n id=' + breakpoint.number;
1376dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          result += ' type=' + breakpoint.type;
1377dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          if (breakpoint.script_id) {
1378dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org              result += ' script_id=' + breakpoint.script_id;
1379dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          }
1380dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          if (breakpoint.script_name) {
1381dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org              result += ' script_name=' + breakpoint.script_name;
1382dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          }
1383ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org          if (breakpoint.script_regexp) {
1384ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org              result += ' script_regexp=' + breakpoint.script_regexp;
1385ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org          }
1386d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          result += ' line=' + (breakpoint.line + 1);
1387dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          if (breakpoint.column != null) {
1388d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            result += ' column=' + (breakpoint.column + 1);
1389dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          }
1390dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          if (breakpoint.groupId) {
1391dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org            result += ' groupId=' + breakpoint.groupId;
1392dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          }
1393dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          if (breakpoint.ignoreCount) {
1394dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org              result += ' ignoreCount=' + breakpoint.ignoreCount;
1395dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          }
1396dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          if (breakpoint.active === false) {
1397dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org            result += ' inactive';
1398dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          }
1399dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          if (breakpoint.condition) {
1400dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org            result += ' condition=' + breakpoint.condition;
1401dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          }
1402dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org          result += ' hit_count=' + breakpoint.hit_count;
1403dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org        }
1404d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (body.breakpoints.length === 0) {
1405d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          result = "No user defined breakpoints\n";
1406d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        } else {
1407d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          result += '\n';
1408d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
1409d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (body.breakOnExceptions) {
1410d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          result += '* breaking on ALL exceptions is enabled\n';
1411d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        } else if (body.breakOnUncaughtExceptions) {
1412d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          result += '* breaking on UNCAUGHT exceptions is enabled\n';
1413d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        } else {
141428a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org          result += '* all exception breakpoints are disabled\n';
1415d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
1416d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        details.text = result;
1417d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1418d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1419d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'setexceptionbreak':
1420d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        result = 'Break on ' + body.type + ' exceptions: ';
1421d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        result += body.enabled ? 'enabled' : 'disabled';
1422dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org        details.text = result;
1423dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org        break;
142425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
142537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'backtrace':
142637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        if (body.totalFrames == 0) {
142737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          result = '(empty stack)';
142837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        } else {
142937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          var result = 'Frames #' + body.fromFrame + ' to #' +
143037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com              (body.toFrame - 1) + ' of ' + body.totalFrames + '\n';
143137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          for (i = 0; i < body.frames.length; i++) {
143237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            if (i != 0) result += '\n';
143337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            result += body.frames[i].text;
143437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          }
143537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
143637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        details.text = result;
143737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
143825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
143937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'frame':
1440d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (last_cmd === 'info locals') {
1441d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          var locals = body.locals;
1442d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          if (locals.length === 0) {
1443d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            result = 'No locals';
1444d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          } else {
1445d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            for (var i = 0; i < locals.length; i++) {
1446d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              var local = locals[i];
1447d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              result += local.name + ' = ';
1448d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              result += refObjectToString_(response, local.value.ref);
1449d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              result += '\n';
1450d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            }
1451d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          }
1452d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        } else if (last_cmd === 'info args') {
1453d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          var args = body.arguments;
1454d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          if (args.length === 0) {
1455d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            result = 'No arguments';
1456d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          } else {
1457d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            for (var i = 0; i < args.length; i++) {
1458d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              var arg = args[i];
1459d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              result += arg.name + ' = ';
1460d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              result += refObjectToString_(response, arg.value.ref);
1461d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              result += '\n';
1462d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            }
1463d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          }
1464d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        } else {
1465d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          result = SourceUnderline(body.sourceLineText,
1466d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org                                   body.column);
1467d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          Debug.State.currentSourceLine = body.line;
1468d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          Debug.State.currentFrame = body.index;
1469d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          Debug.State.displaySourceStartLine = -1;
1470d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          Debug.State.displaySourceEndLine = -1;
1471d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
1472d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        details.text = result;
147337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
147425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
1475eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      case 'scopes':
1476eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        if (body.totalScopes == 0) {
1477eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          result = '(no scopes)';
1478eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        } else {
1479eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          result = 'Scopes #' + body.fromScope + ' to #' +
1480eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org                   (body.toScope - 1) + ' of ' + body.totalScopes + '\n';
1481eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          for (i = 0; i < body.scopes.length; i++) {
1482eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org            if (i != 0) {
1483eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org              result += '\n';
1484eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org            }
1485eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org            result += formatScope_(body.scopes[i]);
1486eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          }
1487eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        }
1488eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        details.text = result;
1489eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        break;
1490eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1491eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      case 'scope':
1492eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        result += formatScope_(body);
1493eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        result += '\n';
1494eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        var scope_object_value = response.lookup(body.object.ref);
1495eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        result += formatObject_(scope_object_value, true);
1496eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        details.text = result;
1497eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        break;
149825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
149937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'evaluate':
1500ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      case 'lookup':
15019ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org      case 'getobj':
1502ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        if (last_cmd == 'p' || last_cmd == 'print') {
1503381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org          result = body.text;
1504ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        } else {
1505eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          var value;
1506eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          if (lookup_handle) {
1507eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org            value = response.bodyValue(lookup_handle);
1508eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          } else {
1509eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org            value = response.bodyValue();
1510eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org          }
1511ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          if (value.isObject()) {
1512245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org            result += formatObject_(value, true);
1513ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          } else {
1514ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org            result += 'type: ';
1515ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org            result += value.type();
1516ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org            if (!value.isUndefined() && !value.isNull()) {
1517ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org              result += ', ';
1518ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org              if (value.isString()) {
1519ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org                result += '"';
1520ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org              }
1521ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org              result += value.value();
1522ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org              if (value.isString()) {
1523ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org                result += '"';
1524ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org              }
1525ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org            }
1526ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org            result += '\n';
1527ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          }
1528ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        }
1529ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        details.text = result;
153037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
1531245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
1532245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      case 'references':
1533245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        var count = body.length;
1534245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        result += 'found ' + count + ' objects';
1535245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        result += '\n';
1536245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        for (var i = 0; i < count; i++) {
1537245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org          var value = response.bodyValue(i);
1538245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org          result += formatObject_(value, false);
1539245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org          result += '\n';
1540245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        }
1541245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        details.text = result;
1542245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        break;
154325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
154437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'source':
154537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        // Get the source from the response.
1546ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        var source = body.source;
1547ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        var from_line = body.fromLine + 1;
154837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        var lines = source.split('\n');
154937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        var maxdigits = 1 + Math.floor(log10(from_line + lines.length));
155037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        if (maxdigits < 3) {
155137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          maxdigits = 3;
155237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
155337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        var result = '';
155437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        for (var num = 0; num < lines.length; num++) {
155537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          // Check if there's an extra newline at the end.
155637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          if (num == (lines.length - 1) && lines[num].length == 0) {
155737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            break;
155837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          }
155937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
156037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          var current_line = from_line + num;
15611456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org          var spacer = maxdigits - (1 + Math.floor(log10(current_line)));
156237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          if (current_line == Debug.State.currentSourceLine + 1) {
156337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            for (var i = 0; i < maxdigits; i++) {
156437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com              result += '>';
156537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            }
156637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            result += '  ';
156737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          } else {
156837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            for (var i = 0; i < spacer; i++) {
156937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com              result += ' ';
157037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            }
157137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            result += current_line + ': ';
157237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          }
157337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          result += lines[num];
157437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          result += '\n';
157537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
157637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        details.text = result;
157737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
157825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
157937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'scripts':
158037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        var result = '';
1581ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        for (i = 0; i < body.length; i++) {
158237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          if (i != 0) result += '\n';
15837be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          if (body[i].id) {
15847be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            result += body[i].id;
15857be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          } else {
15867be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            result += '[no id]';
15877be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          }
15887be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += ', ';
1589ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          if (body[i].name) {
1590ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org            result += body[i].name;
159137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          } else {
1592d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org            if (body[i].compilationType == Debug.ScriptCompilationType.Eval
1593d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org                && body[i].evalFromScript
1594d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org                ) {
1595e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org              result += 'eval from ';
1596e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org              var script_value = response.lookup(body[i].evalFromScript.ref);
1597e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org              result += ' ' + script_value.field('name');
1598e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org              result += ':' + (body[i].evalFromLocation.line + 1);
1599e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org              result += ':' + body[i].evalFromLocation.column;
1600e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org            } else if (body[i].compilationType ==
1601e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org                       Debug.ScriptCompilationType.JSON) {
1602e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org              result += 'JSON ';
1603e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org            } else {  // body[i].compilation == Debug.ScriptCompilationType.Host
1604e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org              result += '[unnamed] ';
1605e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org            }
160637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          }
160737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          result += ' (lines: ';
16087be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += body[i].lineCount;
160937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          result += ', length: ';
1610ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          result += body[i].sourceLength;
1611ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          if (body[i].type == Debug.ScriptType.Native) {
161237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            result += ', native';
1613ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org          } else if (body[i].type == Debug.ScriptType.Extension) {
161437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com            result += ', extension';
161537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com          }
16167be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += '), [';
16177be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          var sourceStart = body[i].sourceStart;
16187be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          if (sourceStart.length > 40) {
16197be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            sourceStart = sourceStart.substring(0, 37) + '...';
16207be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          }
16217be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += sourceStart;
16227be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          result += ']';
162337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        }
1624d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (body.length == 0) {
1625d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          result = "no matching scripts found";
1626d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
162737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        details.text = result;
162837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
162937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
1630bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org      case 'threads':
1631bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org        var result = 'Active V8 threads: ' + body.totalThreads + '\n';
1632bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org        body.threads.sort(function(a, b) { return a.id - b.id; });
1633bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org        for (i = 0; i < body.threads.length; i++) {
1634bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org          result += body.threads[i].current ? '*' : ' ';
1635bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org          result += ' ';
1636bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org          result += body.threads[i].id;
1637bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org          result += '\n';
1638bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org        }
1639bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org        details.text = result;
1640bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org        break;
1641bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
164237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      case 'continue':
164337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        details.text = "(running)";
164437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        break;
164525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
1646d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'v8flags':
1647d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        details.text = "flags set";
1648d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1649d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1650d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      case 'gc':
1651d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        details.text = "GC " + body.before + " => " + body.after;
1652d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (body.after > (1024*1024)) {
1653d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          details.text +=
1654d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              " (" + roundNumber(body.before/(1024*1024), 1) + "M => " +
1655d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org                     roundNumber(body.after/(1024*1024), 1) + "M)";
1656d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        } else if (body.after > 1024) {
1657d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          details.text +=
1658d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org              " (" + roundNumber(body.before/1024, 1) + "K => " +
1659d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org                     roundNumber(body.after/1024, 1) + "K)";
1660d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
1661d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        break;
1662d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
166337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com      default:
166437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com        details.text =
1665dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org            'Response for unknown command \'' + response.command() + '\'' +
1666dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org            ' (' + response.raw_json() + ')';
166737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    }
166837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  } catch (e) {
166937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    details.text = 'Error: "' + e + '" formatting response';
167037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
167125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
167237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  return details;
16731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
167437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
167537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
1676ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1677ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Protocol packages send from the debugger.
1678ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @param {string} json - raw protocol packet as JSON string.
1679ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @constructor
1680ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1681ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction ProtocolPackage(json) {
1682dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  this.raw_json_ = json;
168318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  this.packet_ = JSON.parse(json);
1684ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  this.refs_ = [];
1685ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  if (this.packet_.refs) {
1686ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    for (var i = 0; i < this.packet_.refs.length; i++) {
1687ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      this.refs_[this.packet_.refs[i].handle] = this.packet_.refs[i];
1688ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    }
1689ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
1690ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org}
1691ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1692ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1693ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1694ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the packet type.
1695ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {String} the packet type
1696ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1697ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.type = function() {
1698ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.type;
16991b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1700ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1701ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1702ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1703ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the packet event.
1704ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {Object} the packet event
1705ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1706ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.event = function() {
1707ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.event;
17081b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1709ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1710ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1711ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1712ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the packet request sequence.
1713ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {number} the packet request sequence
1714ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1715ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.requestSeq = function() {
1716ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.request_seq;
17171b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1718ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1719ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1720ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1721ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the packet request sequence.
1722ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {number} the packet request sequence
1723ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1724ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.running = function() {
1725ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.running ? true : false;
17261b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1727ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1728ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1729ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.success = function() {
1730ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.success ? true : false;
17311b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1732ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1733ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1734ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.message = function() {
1735ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.message;
17361b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1737ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1738ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1739ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.command = function() {
1740ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.command;
17411b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1742ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1743ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1744ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.body = function() {
1745ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.body;
17461b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1747ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1748ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1749245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgProtocolPackage.prototype.bodyValue = function(index) {
1750eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  if (index != null) {
1751245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return new ProtocolValue(this.packet_.body[index], this);
1752381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org  } else {
1753381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    return new ProtocolValue(this.packet_.body, this);
1754245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
17551b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1756ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1757ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1758ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.body = function() {
1759ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.body;
17601b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1761ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1762ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1763ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolPackage.prototype.lookup = function(handle) {
1764ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  var value = this.refs_[handle];
1765ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  if (value) {
1766ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    return new ProtocolValue(value, this);
1767ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  } else {
1768ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    return new ProtocolReference(handle);
1769ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
17701b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1771ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1772ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1773dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.orgProtocolPackage.prototype.raw_json = function() {
1774dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  return this.raw_json_;
17751b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1776dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
1777dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
1778ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction ProtocolValue(value, packet) {
1779ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  this.value_ = value;
1780ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  this.packet_ = packet;
1781ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org}
1782ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1783ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1784ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1785ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the value type.
1786ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {String} the value type
1787ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1788ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.type = function() {
1789ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.type;
17901b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1791ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1792ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1793ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
179425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org * Get a metadata field from a protocol value.
1795e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org * @return {Object} the metadata field value
1796e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org */
1797e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgProtocolValue.prototype.field = function(name) {
1798e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  return this.value_[name];
17991b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1800e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
1801e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
1802e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org/**
1803ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is a primitive value.
1804ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is primitive
1805ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1806ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.isPrimitive = function() {
1807ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.isUndefined() || this.isNull() || this.isBoolean() ||
1808ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org         this.isNumber() || this.isString();
18091b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1810ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1811ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1812ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1813ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the object handle.
1814ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {number} the value handle
1815ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1816ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.handle = function() {
1817ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.handle;
18181b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1819ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1820ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1821ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1822ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is undefined.
1823ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is undefined
1824ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1825ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.isUndefined = function() {
1826ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.type == 'undefined';
18271b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1828ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1829ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1830ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1831ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is null.
1832ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is null
1833ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1834ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.isNull = function() {
1835ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.type == 'null';
18361b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1837ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1838ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1839ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1840ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is a boolean.
1841ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is a boolean
1842ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1843ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.isBoolean = function() {
1844ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.type == 'boolean';
18451b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1846ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1847ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1848ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1849ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is a number.
1850ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is a number
1851ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1852ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.isNumber = function() {
1853ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.type == 'number';
18541b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1855ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1856ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1857ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1858ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is a string.
1859ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is a string
1860ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1861ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.isString = function() {
1862ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.type == 'string';
18631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1864ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1865ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1866ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1867ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is an object.
1868ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is an object
1869ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1870ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.isObject = function() {
1871ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.type == 'object' || this.value_.type == 'function' ||
1872ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org         this.value_.type == 'error' || this.value_.type == 'regexp';
18731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1874ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1875ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1876ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1877ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the constructor function
1878ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {ProtocolValue} constructor function
1879ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1880ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.constructorFunctionValue = function() {
1881ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  var ctor = this.value_.constructorFunction;
1882ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.lookup(ctor.ref);
18831b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1884ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1885ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1886ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1887ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the __proto__ value
1888ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {ProtocolValue} __proto__ value
1889ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1890ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.protoObjectValue = function() {
1891ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  var proto = this.value_.protoObject;
1892ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.lookup(proto.ref);
18931b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1894ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1895ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1896ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1897ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the number og properties.
1898ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {number} the number of properties
1899ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1900ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.propertyCount = function() {
1901ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.properties ? this.value_.properties.length : 0;
19021b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1903ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1904ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1905ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1906ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the specified property name.
1907ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {string} property name
1908ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1909ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.propertyName = function(index) {
1910ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  var property = this.value_.properties[index];
1911ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return property.name;
19121b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1913ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1914ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1915ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1916ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Return index for the property name.
1917ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @param name The property name to look for
1918ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {number} index for the property name
1919ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1920ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.propertyIndex = function(name) {
1921ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  for (var i = 0; i < this.propertyCount(); i++) {
1922ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    if (this.value_.properties[i].name == name) {
1923ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      return i;
1924ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    }
1925ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
1926ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return null;
19271b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1928ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1929ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1930ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1931ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Get the specified property value.
1932ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {ProtocolValue} property value
1933ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1934ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.propertyValue = function(index) {
1935ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  var property = this.value_.properties[index];
1936ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.packet_.lookup(property.ref);
19371b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1938ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1939ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1940ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/**
1941ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * Check is the value is a string.
1942ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * @return {boolean} true if the value is a string
1943ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
1944ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolValue.prototype.value = function() {
1945ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.value_.value;
19461b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1947ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1948ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1949d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgProtocolValue.prototype.valueString = function() {
1950d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  return this.value_.text;
19511b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1952d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1953d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1954ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgfunction ProtocolReference(handle) {
1955ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  this.handle_ = handle;
1956ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org}
1957ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1958ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1959ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgProtocolReference.prototype.handle = function() {
1960ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return this.handle_;
19611b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1962ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1963ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
1964876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org// A more universal stringify that supports more types than JSON.
1965876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org// Used by the d8 shell to output results.
1966876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgvar stringifyDepthLimit = 4;  // To avoid crashing on cyclic objects
1967876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
1968876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgfunction Stringify(x, depth) {
1969876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  if (depth === undefined)
1970876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    depth = stringifyDepthLimit;
1971876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  else if (depth === 0)
1972876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    return "*";
1973876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  switch (typeof x) {
1974876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    case "undefined":
1975876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      return "undefined";
1976876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    case "boolean":
1977876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    case "number":
1978876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    case "function":
1979876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      return x.toString();
1980876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    case "string":
1981876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      return "\"" + x.toString() + "\"";
1982f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    case "symbol":
19839bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org      return x.toString();
1984876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    case "object":
1985690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org      if (IS_NULL(x)) return "null";
1986876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      if (x.constructor && x.constructor.name === "Array") {
1987876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        var elems = [];
1988876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        for (var i = 0; i < x.length; ++i) {
1989876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org          elems.push(
1990876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org            {}.hasOwnProperty.call(x, i) ? Stringify(x[i], depth - 1) : "");
1991876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        }
1992876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        return "[" + elems.join(", ") + "]";
1993876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      }
1994876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      try {
1995876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        var string = String(x);
1996876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        if (string && string !== "[object Object]") return string;
1997876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      } catch(e) {}
1998876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      var props = [];
19999bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org      var names = Object.getOwnPropertyNames(x);
20003e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      names = names.concat(Object.getOwnPropertySymbols(x));
20019bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org      for (var i in names) {
20029bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org        var name = names[i];
2003876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        var desc = Object.getOwnPropertyDescriptor(x, name);
2004690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org        if (IS_UNDEFINED(desc)) continue;
20059bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org        if (IS_SYMBOL(name)) name = "[" + Stringify(name) + "]";
2006876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        if ("value" in desc) {
2007876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org          props.push(name + ": " + Stringify(desc.value, depth - 1));
2008876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        }
20099bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org        if (desc.get) {
20109bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org          var getter = Stringify(desc.get);
2011876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org          props.push("get " + name + getter.slice(getter.indexOf('(')));
2012876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        }
20139bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org        if (desc.set) {
20149bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org          var setter = Stringify(desc.set);
2015876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org          props.push("set " + name + setter.slice(setter.indexOf('(')));
2016876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        }
2017876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      }
2018876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      return "{" + props.join(", ") + "}";
2019876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    default:
2020876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org      return "[crazy non-standard shit]";
2021876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  }
2022876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org}
2023