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