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