debug-debugger.js revision 3fb3ca8c7ca439d408449a395897395c0faae8d1
13100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Copyright 2006-2008 the V8 project authors. All rights reserved. 23100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Redistribution and use in source and binary forms, with or without 33100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// modification, are permitted provided that the following conditions are 43100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// met: 53100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// 63100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// * Redistributions of source code must retain the above copyright 73100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// notice, this list of conditions and the following disclaimer. 83100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// * Redistributions in binary form must reproduce the above 93100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// copyright notice, this list of conditions and the following 103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// disclaimer in the documentation and/or other materials provided 113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// with the distribution. 123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// * Neither the name of Google Inc. nor the names of its 133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// contributors may be used to endorse or promote products derived 143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// from this software without specific prior written permission. 153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// 163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Default number of frames to include in the response to backtrace request. 293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuconst kDefaultBacktraceLength = 10; 303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuconst Debug = {}; 323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Regular expression to skip "crud" at the beginning of a source line which is 343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// not really code. Currently the regular expression matches whitespace and 353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// comments. 363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuconst sourceLineBeginningSkip = /^(?:\s*(?:\/\*.*?\*\/)*)*/; 373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Debug events which can occour in the V8 JavaScript engine. These originate 393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// from the API include file debug.h. 403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.DebugEvent = { Break: 1, 413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Exception: 2, 423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu NewFunction: 3, 433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu BeforeCompile: 4, 443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu AfterCompile: 5, 453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu ScriptCollected: 6 }; 463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Types of exceptions that can be broken upon. 480d5e116f6aee03185f237311a943491bb079a768Kristian MonsenDebug.ExceptionBreak = { Caught : 0, 493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Uncaught: 1 }; 503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// The different types of steps. 523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.StepAction = { StepOut: 0, 533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu StepNext: 1, 543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu StepIn: 2, 553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu StepMin: 3, 563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu StepInMin: 4 }; 573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// The different types of scripts matching enum ScriptType in objects.h. 593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.ScriptType = { Native: 0, 603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Extension: 1, 613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Normal: 2 }; 623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// The different types of script compilations matching enum 643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Script::CompilationType in objects.h. 653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.ScriptCompilationType = { Host: 0, 663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Eval: 1, 673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu JSON: 2 }; 683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// The different script break point types. 703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.ScriptBreakPointType = { ScriptId: 0, 713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ScriptName: 1, 723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ScriptRegExp: 2 }; 733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ScriptTypeFlag(type) { 753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return (1 << type); 763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Globals. 793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvar next_response_seq = 0; 803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvar next_break_point_number = 1; 813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvar break_points = []; 823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvar script_break_points = []; 83bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdochvar debugger_flags = { 84bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch breakPointsActive: { 85bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch value: true, 86bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch getValue: function() { return this.value; }, 87bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch setValue: function(value) { 88bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch this.value = !!value; 89bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch %SetDisableBreak(!this.value); 90bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 910d5e116f6aee03185f237311a943491bb079a768Kristian Monsen }, 920d5e116f6aee03185f237311a943491bb079a768Kristian Monsen breakOnCaughtException: { 930d5e116f6aee03185f237311a943491bb079a768Kristian Monsen getValue: function() { return Debug.isBreakOnException(); }, 940d5e116f6aee03185f237311a943491bb079a768Kristian Monsen setValue: function(value) { 950d5e116f6aee03185f237311a943491bb079a768Kristian Monsen if (value) { 960d5e116f6aee03185f237311a943491bb079a768Kristian Monsen Debug.setBreakOnException(); 970d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } else { 980d5e116f6aee03185f237311a943491bb079a768Kristian Monsen Debug.clearBreakOnException(); 990d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } 1000d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } 1010d5e116f6aee03185f237311a943491bb079a768Kristian Monsen }, 1020d5e116f6aee03185f237311a943491bb079a768Kristian Monsen breakOnUncaughtException: { 1030d5e116f6aee03185f237311a943491bb079a768Kristian Monsen getValue: function() { return Debug.isBreakOnUncaughtException(); }, 1040d5e116f6aee03185f237311a943491bb079a768Kristian Monsen setValue: function(value) { 1050d5e116f6aee03185f237311a943491bb079a768Kristian Monsen if (value) { 1060d5e116f6aee03185f237311a943491bb079a768Kristian Monsen Debug.setBreakOnUncaughtException(); 1070d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } else { 1080d5e116f6aee03185f237311a943491bb079a768Kristian Monsen Debug.clearBreakOnUncaughtException(); 1090d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } 1100d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } 1110d5e116f6aee03185f237311a943491bb079a768Kristian Monsen }, 112bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch}; 113e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvar lol_is_enabled = %HasLOLEnabled(); 1143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Create a new break point object and add it to the list of break points. 117b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochfunction MakeBreakPoint(source_position, opt_script_break_point) { 118b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch var break_point = new BreakPoint(source_position, opt_script_break_point); 1193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_points.push(break_point); 1203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return break_point; 1213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 1223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Object representing a break point. 1253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// NOTE: This object does not have a reference to the function having break 1263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// point as this would cause function not to be garbage collected when it is 1273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// not used any more. We do not want break points to keep functions alive. 128b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochfunction BreakPoint(source_position, opt_script_break_point) { 1293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.source_position_ = source_position; 1303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (opt_script_break_point) { 1313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.script_break_point_ = opt_script_break_point; 1323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 1333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.number_ = next_break_point_number++; 1343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 1353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.hit_count_ = 0; 1363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.active_ = true; 1373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.condition_ = null; 1383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.ignoreCount_ = 0; 1393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 1403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.number = function() { 1433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.number_; 1443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.func = function() { 1483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.func_; 1493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.source_position = function() { 1533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.source_position_; 1543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.hit_count = function() { 1583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.hit_count_; 1593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.active = function() { 1633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.script_break_point()) { 1643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_break_point().active(); 1653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 1663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.active_; 1673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.condition = function() { 1713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.script_break_point() && this.script_break_point().condition()) { 1723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_break_point().condition(); 1733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 1743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.condition_; 1753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.ignoreCount = function() { 1793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.ignoreCount_; 1803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.script_break_point = function() { 1843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_break_point_; 1853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.enable = function() { 1893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.active_ = true; 1903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.disable = function() { 1943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.active_ = false; 1953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.setCondition = function(condition) { 1993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.condition_ = condition; 2003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 2013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.setIgnoreCount = function(ignoreCount) { 2043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.ignoreCount_ = ignoreCount; 2053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 2063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.isTriggered = function(exec_state) { 2093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Break point not active - not triggered. 2103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!this.active()) return false; 2113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for conditional break point. 2133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.condition()) { 2143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If break point has condition try to evaluate it in the top frame. 2153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 2163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var mirror = exec_state.frame(0).evaluate(this.condition()); 2173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If no sensible mirror or non true value break point not triggered. 2183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!(mirror instanceof ValueMirror) || !%ToBoolean(mirror.value_)) { 2193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return false; 2203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch (e) { 2223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Exception evaluating condition counts as not triggered. 2233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return false; 2243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Update the hit count. 2283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.hit_count_++; 2293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.script_break_point_) { 2303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.script_break_point_.hit_count_++; 2313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If the break point has an ignore count it is not triggered. 2343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.ignoreCount_ > 0) { 2353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.ignoreCount_--; 2363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return false; 2373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Break point triggered. 2403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return true; 2413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 2423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Function called from the runtime when a break point is hit. Returns true if 2453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// the break point is triggered and supposed to break execution. 2463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction IsBreakPointTriggered(break_id, break_point) { 2473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return break_point.isTriggered(MakeExecutionState(break_id)); 2483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 2493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Object representing a script break point. The script is referenced by its 2523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// script name or script id and the break point is represented as line and 2533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// column. 2543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column, 2553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_groupId) { 2563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.type_ = type; 2573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (type == Debug.ScriptBreakPointType.ScriptId) { 2583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.script_id_ = script_id_or_name; 2593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (type == Debug.ScriptBreakPointType.ScriptName) { 2603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.script_name_ = script_id_or_name; 2613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (type == Debug.ScriptBreakPointType.ScriptRegExp) { 2623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch this.script_regexp_object_ = new RegExp(script_id_or_name); 2633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 2643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch throw new Error("Unexpected breakpoint type " + type); 2653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.line_ = opt_line || 0; 2673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.column_ = opt_column; 2683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.groupId_ = opt_groupId; 2693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.hit_count_ = 0; 2703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.active_ = true; 2713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.condition_ = null; 2723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.ignoreCount_ = 0; 2738defd9ff6930b4e24729971a61cf7469daf119beSteve Block this.break_points_ = []; 2743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 2753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//Creates a clone of script breakpoint that is linked to another script. 2786ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockScriptBreakPoint.prototype.cloneForOtherScript = function (other_script) { 2796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var copy = new ScriptBreakPoint(Debug.ScriptBreakPointType.ScriptId, 2806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block other_script.id, this.line_, this.column_, this.groupId_); 2816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block copy.number_ = next_break_point_number++; 2826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block script_break_points.push(copy); 283bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 2846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block copy.hit_count_ = this.hit_count_; 2856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block copy.active_ = this.active_; 2866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block copy.condition_ = this.condition_; 2876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block copy.ignoreCount_ = this.ignoreCount_; 2886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return copy; 2896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 2906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.number = function() { 2933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.number_; 2943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 2953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.groupId = function() { 2983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.groupId_; 2993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.type = function() { 3033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.type_; 3043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.script_id = function() { 3083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_id_; 3093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.script_name = function() { 3133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_name_; 3143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3173fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochScriptBreakPoint.prototype.script_regexp_object = function() { 3183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return this.script_regexp_object_; 3193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 3203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.line = function() { 3233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.line_; 3243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.column = function() { 3283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.column_; 3293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3328defd9ff6930b4e24729971a61cf7469daf119beSteve BlockScriptBreakPoint.prototype.actual_locations = function() { 3338defd9ff6930b4e24729971a61cf7469daf119beSteve Block var locations = []; 3348defd9ff6930b4e24729971a61cf7469daf119beSteve Block for (var i = 0; i < this.break_points_.length; i++) { 3358defd9ff6930b4e24729971a61cf7469daf119beSteve Block locations.push(this.break_points_[i].actual_location); 3368defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 3378defd9ff6930b4e24729971a61cf7469daf119beSteve Block return locations; 3388defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 3398defd9ff6930b4e24729971a61cf7469daf119beSteve Block 3408defd9ff6930b4e24729971a61cf7469daf119beSteve Block 3416ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockScriptBreakPoint.prototype.update_positions = function(line, column) { 3426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block this.line_ = line; 3436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block this.column_ = column; 3446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 3456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 3466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 3473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.hit_count = function() { 3483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.hit_count_; 3493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.active = function() { 3533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.active_; 3543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.condition = function() { 3583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.condition_; 3593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.ignoreCount = function() { 3633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.ignoreCount_; 3643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.enable = function() { 3683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.active_ = true; 3693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.disable = function() { 3733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.active_ = false; 3743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.setCondition = function(condition) { 3783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.condition_ = condition; 3793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.setIgnoreCount = function(ignoreCount) { 3833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.ignoreCount_ = ignoreCount; 3843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set ignore count on all break points created from this script break point. 3868defd9ff6930b4e24729971a61cf7469daf119beSteve Block for (var i = 0; i < this.break_points_.length; i++) { 3878defd9ff6930b4e24729971a61cf7469daf119beSteve Block this.break_points_[i].setIgnoreCount(ignoreCount); 3883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 3893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Check whether a script matches this script break point. Currently this is 3933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// only based on script name. 3943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.matchesScript = function(script) { 3953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.type_ == Debug.ScriptBreakPointType.ScriptId) { 3963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_id_ == script.id; 3973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 3983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // We might want to account columns here as well. 3993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (!(script.line_offset <= this.line_ && 4003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch this.line_ < script.line_offset + script.lineCount())) { 4013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return false; 4023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 4033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (this.type_ == Debug.ScriptBreakPointType.ScriptName) { 4043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return this.script_name_ == script.nameOrSourceURL(); 4053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (this.type_ == Debug.ScriptBreakPointType.ScriptRegExp) { 4063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return this.script_regexp_object_.test(script.nameOrSourceURL()); 4073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 4083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch throw new Error("Unexpected breakpoint type " + this.type_); 4093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 4103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 4123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Set the script break point in a script. 4153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.set = function (script) { 4163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var column = this.column(); 4173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var line = this.line(); 4183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If the column is undefined the break is on the line. To help locate the 4193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // first piece of breakable code on the line try to find the column on the 4203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // line which contains some source. 4213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(column)) { 4223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var source_line = script.sourceLine(this.line()); 4233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Allocate array for caching the columns where the actual source starts. 4253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!script.sourceColumnStart_) { 4263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script.sourceColumnStart_ = new Array(script.lineCount()); 4273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Fill cache if needed and get column where the actual source starts. 4303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(script.sourceColumnStart_[line])) { 4313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script.sourceColumnStart_[line] = 4323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu source_line.match(sourceLineBeginningSkip)[0].length; 4333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu column = script.sourceColumnStart_[line]; 4353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Convert the line and column into an absolute position within the script. 4388defd9ff6930b4e24729971a61cf7469daf119beSteve Block var position = Debug.findScriptSourcePosition(script, this.line(), column); 4393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If the position is not found in the script (the script might be shorter 4413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // than it used to be) just ignore it. 4428defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (position === null) return; 4433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create a break point object and set the break point. 445b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch break_point = MakeBreakPoint(position, this); 4463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point.setIgnoreCount(this.ignoreCount()); 4478defd9ff6930b4e24729971a61cf7469daf119beSteve Block var actual_position = %SetScriptBreakPoint(script, position, break_point); 4488defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (IS_UNDEFINED(actual_position)) { 4498defd9ff6930b4e24729971a61cf7469daf119beSteve Block actual_position = position; 4508defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 4518defd9ff6930b4e24729971a61cf7469daf119beSteve Block var actual_location = script.locationFromPosition(actual_position, true); 4528defd9ff6930b4e24729971a61cf7469daf119beSteve Block break_point.actual_location = { line: actual_location.line, 4533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch column: actual_location.column, 4543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch script_id: script.id }; 4558defd9ff6930b4e24729971a61cf7469daf119beSteve Block this.break_points_.push(break_point); 4563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return break_point; 4573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 4583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Clear all the break points created from this script break point 4613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.clear = function () { 4623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var remaining_break_points = []; 4633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < break_points.length; i++) { 4643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_points[i].script_break_point() && 4653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_points[i].script_break_point() === this) { 4663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %ClearBreakPoint(break_points[i]); 4673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 4683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu remaining_break_points.push(break_points[i]); 4693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_points = remaining_break_points; 4728defd9ff6930b4e24729971a61cf7469daf119beSteve Block this.break_points_ = []; 4733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 4743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Function called from runtime when a new script is compiled to set any script 4773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// break points set in this script. 4783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction UpdateScriptBreakPoints(script) { 4793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < script_break_points.length; i++) { 4803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script_break_points[i].type() == Debug.ScriptBreakPointType.ScriptName && 4813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_points[i].matchesScript(script)) { 4823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_points[i].set(script); 4833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 4863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4886ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockfunction GetScriptBreakPoints(script) { 4896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var result = []; 4906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (var i = 0; i < script_break_points.length; i++) { 4916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (script_break_points[i].matchesScript(script)) { 4926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block result.push(script_break_points[i]); 4936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 4946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 4956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return result; 4966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 4976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 4986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 4993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setListener = function(listener, opt_data) { 5003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(listener) && !IS_UNDEFINED(listener) && !IS_NULL(listener)) { 5013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Parameters have wrong types.'); 5023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %SetDebugEventListener(listener, opt_data); 5043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.breakExecution = function(f) { 5083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %Break(); 5093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.breakLocations = function(f) { 5123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %GetBreakLocations(f); 5143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Returns a Script object. If the parameter is a function the return value 5173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// is the script in which the function is defined. If the parameter is a string 5183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// the return value is the script for which the script name has that string 5193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// value. If it is a regexp and there is a unique script whose name matches 5203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// we return that, otherwise undefined. 5213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findScript = function(func_or_script_name) { 5223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_FUNCTION(func_or_script_name)) { 5233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %FunctionGetScript(func_or_script_name); 5243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (IS_REGEXP(func_or_script_name)) { 5253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scripts = Debug.scripts(); 5263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var last_result = null; 5273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var result_count = 0; 5283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i in scripts) { 5293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = scripts[i]; 5303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (func_or_script_name.test(script.name)) { 5313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu last_result = script; 5323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result_count++; 5333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Return the unique script matching the regexp. If there are more 5363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // than one we don't return a value since there is no good way to 5373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // decide which one to return. Returning a "random" one, say the 5383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // first, would introduce nondeterminism (or something close to it) 5393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // because the order is the heap iteration order. 5403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (result_count == 1) { 5413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return last_result; 5423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 5433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return undefined; 5443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 5463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %GetScript(func_or_script_name); 5473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Returns the script source. If the parameter is a function the return value 5513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// is the script source for the script in which the function is defined. If the 5523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// parameter is a string the return value is the script for which the script 5533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// name has that string value. 5543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.scriptSource = function(func_or_script_name) { 5553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.findScript(func_or_script_name).source; 5563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.source = function(f) { 5593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %FunctionGetSourceCode(f); 5613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.disassemble = function(f) { 5643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %DebugDisassembleFunction(f); 5663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.disassembleConstructor = function(f) { 5693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %DebugDisassembleConstructor(f); 5713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5736ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockDebug.ExecuteInDebugContext = function(f, without_debugger) { 5746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return %ExecuteInDebugContext(f, !!without_debugger); 5766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 5776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 5783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.sourcePosition = function(f) { 5793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %FunctionGetScriptSourcePosition(f); 5813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findFunctionSourceLocation = function(func, opt_line, opt_column) { 5853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = %FunctionGetScript(func); 5863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_offset = %FunctionGetScriptSourcePosition(func); 5873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return script.locationFromLine(opt_line, opt_column, script_offset); 5883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 5893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Returns the character position in a script based on a line number and an 5923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// optional position within that line. 5933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findScriptSourcePosition = function(script, opt_line, opt_column) { 5943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var location = script.locationFromLine(opt_line, opt_column); 5953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return location ? location.position : null; 5963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 5973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findBreakPoint = function(break_point_number, remove) { 6003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point; 6013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < break_points.length; i++) { 6023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_points[i].number() == break_point_number) { 6033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point = break_points[i]; 6043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Remove the break point from the list if requested. 6053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (remove) { 6063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_points.splice(i, 1); 6073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break; 6093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_point) { 6123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return break_point; 6133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 6143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.findScriptBreakPoint(break_point_number, remove); 6153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 6173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6188defd9ff6930b4e24729971a61cf7469daf119beSteve BlockDebug.findBreakPointActualLocations = function(break_point_number) { 6198defd9ff6930b4e24729971a61cf7469daf119beSteve Block for (var i = 0; i < script_break_points.length; i++) { 6208defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (script_break_points[i].number() == break_point_number) { 6218defd9ff6930b4e24729971a61cf7469daf119beSteve Block return script_break_points[i].actual_locations(); 6228defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 6238defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 6248defd9ff6930b4e24729971a61cf7469daf119beSteve Block for (var i = 0; i < break_points.length; i++) { 6258defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (break_points[i].number() == break_point_number) { 6268defd9ff6930b4e24729971a61cf7469daf119beSteve Block return [break_points[i].actual_location]; 6278defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 6288defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 6298defd9ff6930b4e24729971a61cf7469daf119beSteve Block return []; 6308defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 6313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setBreakPoint = function(func, opt_line, opt_column, opt_condition) { 6333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(func)) throw new Error('Parameters have wrong types.'); 6343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Break points in API functions are not supported. 6353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (%FunctionIsAPIFunction(func)) { 6363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Cannot set break point in native code.'); 6373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find source position relative to start of the function 6393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_position = 6403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.findFunctionSourceLocation(func, opt_line, opt_column).position; 6413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var source_position = break_position - this.sourcePosition(func); 6423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find the script for the function. 6433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = %FunctionGetScript(func); 6443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Break in builtin JavaScript code is not supported. 6453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script.type == Debug.ScriptType.Native) { 6463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Cannot set break point in native code.'); 6473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If the script for the function has a name convert this to a script break 6493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // point. 6503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script && script.id) { 6513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Adjust the source position to be script relative. 6523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu source_position += %FunctionGetScriptSourcePosition(func); 6533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find line and column for the position in the script and set a script 6543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // break point from that. 6553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var location = script.locationFromPosition(source_position, false); 6563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.setScriptBreakPointById(script.id, 6573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu location.line, location.column, 6583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition); 6593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 6603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set a break point directly on the function. 661b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch var break_point = MakeBreakPoint(source_position); 6628defd9ff6930b4e24729971a61cf7469daf119beSteve Block var actual_position = 6638defd9ff6930b4e24729971a61cf7469daf119beSteve Block %SetFunctionBreakPoint(func, source_position, break_point); 6648defd9ff6930b4e24729971a61cf7469daf119beSteve Block actual_position += this.sourcePosition(func); 6658defd9ff6930b4e24729971a61cf7469daf119beSteve Block var actual_location = script.locationFromPosition(actual_position, true); 6668defd9ff6930b4e24729971a61cf7469daf119beSteve Block break_point.actual_location = { line: actual_location.line, 6673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch column: actual_location.column, 6683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch script_id: script.id }; 6693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point.setCondition(opt_condition); 6703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return break_point.number(); 6713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 6733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 675b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochDebug.setBreakPointByScriptIdAndPosition = function(script_id, position, 676b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch condition, enabled) 677b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch{ 678b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch break_point = MakeBreakPoint(position); 679b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch break_point.setCondition(condition); 680b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (!enabled) 681b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch break_point.disable(); 682b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch var scripts = this.scripts(); 683b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (var i = 0; i < scripts.length; i++) { 684b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (script_id == scripts[i].id) { 685b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch break_point.actual_position = %SetScriptBreakPoint(scripts[i], position, 686b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch break_point); 687b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch break; 688b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 689b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 690b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return break_point; 691b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}; 692b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 693b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 6943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.enableBreakPoint = function(break_point_number) { 6953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, false); 696086aeeaae12517475c22695a200be45495516549Ben Murdoch // Only enable if the breakpoint hasn't been deleted: 697086aeeaae12517475c22695a200be45495516549Ben Murdoch if (break_point) { 698086aeeaae12517475c22695a200be45495516549Ben Murdoch break_point.enable(); 699086aeeaae12517475c22695a200be45495516549Ben Murdoch } 7003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.disableBreakPoint = function(break_point_number) { 7043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, false); 705086aeeaae12517475c22695a200be45495516549Ben Murdoch // Only enable if the breakpoint hasn't been deleted: 706086aeeaae12517475c22695a200be45495516549Ben Murdoch if (break_point) { 707086aeeaae12517475c22695a200be45495516549Ben Murdoch break_point.disable(); 708086aeeaae12517475c22695a200be45495516549Ben Murdoch } 7093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.changeBreakPointCondition = function(break_point_number, condition) { 7133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, false); 7143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point.setCondition(condition); 7153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.changeBreakPointIgnoreCount = function(break_point_number, ignoreCount) { 7193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (ignoreCount < 0) { 7203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid argument'); 7213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, false); 7233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point.setIgnoreCount(ignoreCount); 7243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearBreakPoint = function(break_point_number) { 7283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, true); 7293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_point) { 7303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %ClearBreakPoint(break_point); 7313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 7323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point = this.findScriptBreakPoint(break_point_number, true); 7333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!break_point) { 7343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid breakpoint'); 7353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearAllBreakPoints = function() { 7413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < break_points.length; i++) { 7423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point = break_points[i]; 7433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %ClearBreakPoint(break_point); 7443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_points = []; 7463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 749086aeeaae12517475c22695a200be45495516549Ben MurdochDebug.disableAllBreakPoints = function() { 750086aeeaae12517475c22695a200be45495516549Ben Murdoch // Disable all user defined breakpoints: 751086aeeaae12517475c22695a200be45495516549Ben Murdoch for (var i = 1; i < next_break_point_number; i++) { 752086aeeaae12517475c22695a200be45495516549Ben Murdoch Debug.disableBreakPoint(i); 753086aeeaae12517475c22695a200be45495516549Ben Murdoch } 754086aeeaae12517475c22695a200be45495516549Ben Murdoch // Disable all exception breakpoints: 755086aeeaae12517475c22695a200be45495516549Ben Murdoch %ChangeBreakOnException(Debug.ExceptionBreak.Caught, false); 756086aeeaae12517475c22695a200be45495516549Ben Murdoch %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, false); 757086aeeaae12517475c22695a200be45495516549Ben Murdoch}; 758086aeeaae12517475c22695a200be45495516549Ben Murdoch 759086aeeaae12517475c22695a200be45495516549Ben Murdoch 7603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findScriptBreakPoint = function(break_point_number, remove) { 7613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point; 7623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < script_break_points.length; i++) { 7633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script_break_points[i].number() == break_point_number) { 7643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point = script_break_points[i]; 7653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Remove the break point from the list if requested. 7663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (remove) { 7673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.clear(); 7683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_points.splice(i,1); 7693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break; 7713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return script_break_point; 7743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 7753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Sets a breakpoint in a script identified through id or name at the 7783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// specified source line and column within that line. 7793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setScriptBreakPoint = function(type, script_id_or_name, 7803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_line, opt_column, opt_condition, 7813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_groupId) { 7823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create script break point object. 7833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = 7843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu new ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column, 7853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_groupId); 7863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Assign number to the new script break point and add it. 7883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.number_ = next_break_point_number++; 7893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.setCondition(opt_condition); 7903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_points.push(script_break_point); 7913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Run through all scripts to see if this script break point matches any 7933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // loaded scripts. 7943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scripts = this.scripts(); 7953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < scripts.length; i++) { 7963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script_break_point.matchesScript(scripts[i])) { 7973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.set(scripts[i]); 7983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 8003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return script_break_point.number(); 8023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 8033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setScriptBreakPointById = function(script_id, 8063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_line, opt_column, 8073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition, opt_groupId) { 8083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptId, 8093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_id, opt_line, opt_column, 8103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition, opt_groupId); 8113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 8123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setScriptBreakPointByName = function(script_name, 8153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_line, opt_column, 8163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition, opt_groupId) { 8173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptName, 8183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_name, opt_line, opt_column, 8193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition, opt_groupId); 8203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 8213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8233fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochDebug.setScriptBreakPointByRegExp = function(script_regexp, 8243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch opt_line, opt_column, 8253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch opt_condition, opt_groupId) { 8263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptRegExp, 8273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch script_regexp, opt_line, opt_column, 8283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch opt_condition, opt_groupId); 8293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 8303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.enableScriptBreakPoint = function(break_point_number) { 8333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = this.findScriptBreakPoint(break_point_number, false); 8343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.enable(); 8353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.disableScriptBreakPoint = function(break_point_number) { 8393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = this.findScriptBreakPoint(break_point_number, false); 8403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.disable(); 8413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.changeScriptBreakPointCondition = function(break_point_number, condition) { 8453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = this.findScriptBreakPoint(break_point_number, false); 8463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.setCondition(condition); 8473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.changeScriptBreakPointIgnoreCount = function(break_point_number, ignoreCount) { 8513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (ignoreCount < 0) { 8523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid argument'); 8533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 8543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = this.findScriptBreakPoint(break_point_number, false); 8553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.setIgnoreCount(ignoreCount); 8563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.scriptBreakPoints = function() { 8603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return script_break_points; 8613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 8623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearStepping = function() { 8653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %ClearStepping(); 8663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 8673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setBreakOnException = function() { 8690d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return %ChangeBreakOnException(Debug.ExceptionBreak.Caught, true); 8703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearBreakOnException = function() { 8730d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return %ChangeBreakOnException(Debug.ExceptionBreak.Caught, false); 8740d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}; 8750d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 8760d5e116f6aee03185f237311a943491bb079a768Kristian MonsenDebug.isBreakOnException = function() { 8770d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return !!%IsBreakOnException(Debug.ExceptionBreak.Caught); 8783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setBreakOnUncaughtException = function() { 8813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, true); 8823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearBreakOnUncaughtException = function() { 8853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, false); 8863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8880d5e116f6aee03185f237311a943491bb079a768Kristian MonsenDebug.isBreakOnUncaughtException = function() { 8890d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return !!%IsBreakOnException(Debug.ExceptionBreak.Uncaught); 8900d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}; 8910d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 8923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.showBreakPoints = function(f, full) { 8933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 8943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var source = full ? this.scriptSource(f) : this.source(f); 8953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var offset = full ? this.sourcePosition(f) : 0; 8963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var locations = this.breakLocations(f); 8973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!locations) return source; 8983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu locations.sort(function(x, y) { return x - y; }); 8993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var result = ""; 9003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var prev_pos = 0; 9013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var pos; 9023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < locations.length; i++) { 9033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu pos = locations[i] - offset; 9043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result += source.slice(prev_pos, pos); 9053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result += "[B" + i + "]"; 9063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu prev_pos = pos; 9073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 9083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu pos = source.length; 9093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result += source.substring(prev_pos, pos); 9103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return result; 9113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Get all the scripts currently loaded. Locating all the scripts is based on 9153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// scanning the heap. 9163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.scripts = function() { 9173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Collect all scripts in the heap. 9183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %DebugGetLoadedScripts(); 919bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch}; 920bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 921bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 922bb769b257e753aafcbd96767abb2abc645eaa20cBen MurdochDebug.debuggerFlags = function() { 923bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch return debugger_flags; 924bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch}; 925bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochDebug.MakeMirror = MakeMirror; 9273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeExecutionState(break_id) { 9293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new ExecutionState(break_id); 9303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 9313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ExecutionState(break_id) { 9333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.break_id = break_id; 9343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.selected_frame = 0; 9353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 9363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.prepareStep = function(opt_action, opt_count) { 9383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var action = Debug.StepAction.StepIn; 9393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(opt_action)) action = %ToNumber(opt_action); 9403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var count = opt_count ? %ToNumber(opt_count) : 1; 9413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %PrepareStep(this.break_id, action, count); 9433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 9443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochExecutionState.prototype.evaluateGlobal = function(source, disable_break, 946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch opt_additional_context) { 947b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return MakeMirror(%DebugEvaluateGlobal(this.break_id, source, 948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Boolean(disable_break), 949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch opt_additional_context)); 9503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.frameCount = function() { 9533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %GetFrameCount(this.break_id); 9543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.threadCount = function() { 9573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %GetThreadCount(this.break_id); 9583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.frame = function(opt_index) { 9613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If no index supplied return the selected frame. 9623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (opt_index == null) opt_index = this.selected_frame; 9636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (opt_index < 0 || opt_index >= this.frameCount()) 9646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block throw new Error('Illegal frame index.'); 9653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new FrameMirror(this.break_id, opt_index); 9663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.setSelectedFrame = function(index) { 9693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var i = %ToNumber(index); 9703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (i < 0 || i >= this.frameCount()) throw new Error('Illegal frame index.'); 9713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.selected_frame = i; 9723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.selectedFrame = function() { 9753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.selected_frame; 9763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.debugCommandProcessor = function(opt_is_running) { 9793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new DebugCommandProcessor(this, opt_is_running); 9803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeBreakEvent(exec_state, break_points_hit) { 9843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new BreakEvent(exec_state, break_points_hit); 9853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 9863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction BreakEvent(exec_state, break_points_hit) { 9893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 9903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.break_points_hit_ = break_points_hit; 9913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 9923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.executionState = function() { 9953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_; 9963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.eventType = function() { 10003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.Break; 10013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.func = function() { 10053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).func(); 10063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.sourceLine = function() { 10103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceLine(); 10113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.sourceColumn = function() { 10153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceColumn(); 10163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.sourceLineText = function() { 10203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceLineText(); 10213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.breakPointsHit = function() { 10253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.break_points_hit_; 10263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.toJSONProtocol = function() { 10303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = { seq: next_response_seq++, 10313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu type: "event", 10323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu event: "break", 10333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu body: { invocationText: this.exec_state_.frame(0).invocationText(), 10343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 10353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu }; 10363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add script related information to the event if available. 10383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = this.func().script(); 10393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script) { 10403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLine = this.sourceLine(), 10413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceColumn = this.sourceColumn(), 10423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLineText = this.sourceLineText(), 10433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.script = MakeScriptObject_(script, false); 10443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 10453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add an Array of break points hit if any. 10473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.breakPointsHit()) { 10483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.breakpoints = []; 10493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < this.breakPointsHit().length; i++) { 10503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find the break point number. For break points originating from a 10513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // script break point supply the script break point number. 10523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var breakpoint = this.breakPointsHit()[i]; 10533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = breakpoint.script_break_point(); 10543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var number; 10553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script_break_point) { 10563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu number = script_break_point.number(); 10573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 10583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu number = breakpoint.number(); 10593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 10603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.breakpoints.push(number); 10613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 10623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 10633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return JSON.stringify(ObjectToProtocolObject_(o)); 10643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeExceptionEvent(exec_state, exception, uncaught) { 10683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new ExceptionEvent(exec_state, exception, uncaught); 10693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 10703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ExceptionEvent(exec_state, exception, uncaught) { 10733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 10743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exception_ = exception; 10753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.uncaught_ = uncaught; 10763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 10773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.executionState = function() { 10803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_; 10813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.eventType = function() { 10853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.Exception; 10863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.exception = function() { 10903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exception_; 10913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 10923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.uncaught = function() { 10953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.uncaught_; 10963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 10973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.func = function() { 11003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).func(); 11013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.sourceLine = function() { 11053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceLine(); 11063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.sourceColumn = function() { 11103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceColumn(); 11113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.sourceLineText = function() { 11153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceLineText(); 11163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.toJSONProtocol = function() { 11203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = new ProtocolMessage(); 11213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.event = "exception"; 11223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body = { uncaught: this.uncaught_, 11233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu exception: MakeMirror(this.exception_) 11243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu }; 11253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Exceptions might happen whithout any JavaScript frames. 11273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() > 0) { 11283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLine = this.sourceLine(); 11293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceColumn = this.sourceColumn(); 11303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLineText = this.sourceLineText(); 11313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add script information to the event if available. 11333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = this.func().script(); 11343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script) { 11353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.script = MakeScriptObject_(script, false); 11363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 11373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 11383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLine = -1; 11393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 11403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return o.toJSONProtocol(); 11423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeCompileEvent(exec_state, script, before) { 11463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new CompileEvent(exec_state, script, before); 11473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 11483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction CompileEvent(exec_state, script, before) { 11513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 11523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.script_ = MakeMirror(script); 11533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.before_ = before; 11543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 11553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuCompileEvent.prototype.executionState = function() { 11583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_; 11593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuCompileEvent.prototype.eventType = function() { 11633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.before_) { 11643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.BeforeCompile; 11653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 11663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.AfterCompile; 11673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 11683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuCompileEvent.prototype.script = function() { 11723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_; 11733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuCompileEvent.prototype.toJSONProtocol = function() { 11773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = new ProtocolMessage(); 11783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.running = true; 11793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.before_) { 11803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.event = "beforeCompile"; 11813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 11823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.event = "afterCompile"; 11833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 11843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body = {}; 11853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.script = this.script_; 11863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return o.toJSONProtocol(); 11883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 11893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeNewFunctionEvent(func) { 11923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new NewFunctionEvent(func); 11933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 11943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction NewFunctionEvent(func) { 11973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.func = func; 11983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 11993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuNewFunctionEvent.prototype.eventType = function() { 12023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.NewFunction; 12033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 12043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuNewFunctionEvent.prototype.name = function() { 12073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.func.name; 12083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 12093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuNewFunctionEvent.prototype.setBreakPoint = function(p) { 12123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.setBreakPoint(this.func, p || 0); 12133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 12143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeScriptCollectedEvent(exec_state, id) { 12173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new ScriptCollectedEvent(exec_state, id); 12183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 12193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ScriptCollectedEvent(exec_state, id) { 12223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 12233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.id_ = id; 12243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 12253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptCollectedEvent.prototype.id = function() { 12283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.id_; 12293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 12303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptCollectedEvent.prototype.executionState = function() { 12333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_; 12343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 12353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptCollectedEvent.prototype.toJSONProtocol = function() { 12383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = new ProtocolMessage(); 12393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.running = true; 12403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.event = "scriptCollected"; 12413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body = {}; 12423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.script = { id: this.id() }; 12433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return o.toJSONProtocol(); 12443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 12453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeScriptObject_(script, include_source) { 12483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = { id: script.id(), 12493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu name: script.name(), 12503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu lineOffset: script.lineOffset(), 12513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu columnOffset: script.columnOffset(), 12523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu lineCount: script.lineCount(), 12533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu }; 12543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(script.data())) { 12553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.data = script.data(); 12563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (include_source) { 12583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.source = script.source(); 12593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return o; 12613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 12623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction DebugCommandProcessor(exec_state, opt_is_running) { 12653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 12663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.running_ = opt_is_running || false; 12673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 12683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.processDebugRequest = function (request) { 12713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.processDebugJSONRequest(request); 12723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 12733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ProtocolMessage(request) { 12763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Update sequence number. 12773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.seq = next_response_seq++; 12783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request) { 12803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If message is based on a request this is a response. Fill the initial 12813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // response from the request. 12823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.type = 'response'; 12833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.request_seq = request.seq; 12843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.command = request.command; 12853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 12863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If message is not based on a request it is a dabugger generated event. 12873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.type = 'event'; 12883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.success = true; 12903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Handler may set this field to control debugger state. 12913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.running = undefined; 12923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 12933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuProtocolMessage.prototype.setOption = function(name, value) { 12963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!this.options_) { 12973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.options_ = {}; 12983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.options_[name] = value; 13003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 13013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuProtocolMessage.prototype.failed = function(message) { 13043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.success = false; 13053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.message = message; 13063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 13073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuProtocolMessage.prototype.toJSONProtocol = function() { 13103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Encode the protocol header. 13113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var json = {}; 13123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.seq= this.seq; 13133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.request_seq) { 13143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.request_seq = this.request_seq; 13153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.type = this.type; 13173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.event) { 13183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.event = this.event; 13193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.command) { 13213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.command = this.command; 13223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.success) { 13243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.success = this.success; 13253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 13263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.success = false; 13273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.body) { 13293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Encode the body part. 13303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var bodyJson; 13313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var serializer = MakeMirrorSerializer(true, this.options_); 13323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.body instanceof Mirror) { 13333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson = serializer.serializeValue(this.body); 13343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (this.body instanceof Array) { 13353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson = []; 13363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < this.body.length; i++) { 13373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.body[i] instanceof Mirror) { 13383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson.push(serializer.serializeValue(this.body[i])); 13393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 13403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson.push(ObjectToProtocolObject_(this.body[i], serializer)); 13413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 13443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson = ObjectToProtocolObject_(this.body, serializer); 13453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.body = bodyJson; 13473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.refs = serializer.serializeReferencedObjects(); 13483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.message) { 13503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.message = this.message; 13513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.running = this.running; 13533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return JSON.stringify(json); 13543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 13553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.createResponse = function(request) { 13583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new ProtocolMessage(request); 13593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 13603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.processDebugJSONRequest = function(json_request) { 13633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var request; // Current request. 13643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var response; // Generated response. 13653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 13663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 13673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Convert the JSON string to an object. 1368257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch request = JSON.parse(json_request); 13693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create an initial response. 13713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response = this.createResponse(request); 13723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.type) { 13743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Type not specified'); 13753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.type != 'request') { 13783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error("Illegal type '" + request.type + "' in request"); 13793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.command) { 13823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Command not specified'); 13833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1385402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu if (request.arguments) { 1386402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu var args = request.arguments; 1387402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu // TODO(yurys): remove request.arguments.compactFormat check once 1388402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu // ChromeDevTools are switched to 'inlineRefs' 1389402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu if (args.inlineRefs || args.compactFormat) { 1390402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu response.setOption('inlineRefs', true); 1391402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu } 1392402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu if (!IS_UNDEFINED(args.maxStringLength)) { 1393402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu response.setOption('maxStringLength', args.maxStringLength); 1394402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu } 13953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.command == 'continue') { 13983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.continueRequest_(request, response); 13993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'break') { 14003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.breakRequest_(request, response); 14013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'setbreakpoint') { 14023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.setBreakPointRequest_(request, response); 14033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'changebreakpoint') { 14043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.changeBreakPointRequest_(request, response); 14053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'clearbreakpoint') { 14063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.clearBreakPointRequest_(request, response); 14073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'clearbreakpointgroup') { 14083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.clearBreakPointGroupRequest_(request, response); 1409086aeeaae12517475c22695a200be45495516549Ben Murdoch } else if (request.command == 'disconnect') { 1410086aeeaae12517475c22695a200be45495516549Ben Murdoch this.disconnectRequest_(request, response); 1411086aeeaae12517475c22695a200be45495516549Ben Murdoch } else if (request.command == 'setexceptionbreak') { 1412086aeeaae12517475c22695a200be45495516549Ben Murdoch this.setExceptionBreakRequest_(request, response); 141325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen } else if (request.command == 'listbreakpoints') { 141425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen this.listBreakpointsRequest_(request, response); 14153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'backtrace') { 14163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.backtraceRequest_(request, response); 14173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'frame') { 14183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.frameRequest_(request, response); 14193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'scopes') { 14203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.scopesRequest_(request, response); 14213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'scope') { 14223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.scopeRequest_(request, response); 14233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'evaluate') { 14243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.evaluateRequest_(request, response); 1425e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'getobj') { 1426e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.getobjRequest_(request, response); 14273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'lookup') { 14283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.lookupRequest_(request, response); 14293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'references') { 14303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.referencesRequest_(request, response); 14313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'source') { 14323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.sourceRequest_(request, response); 14333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'scripts') { 14343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.scriptsRequest_(request, response); 14353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'threads') { 14363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.threadsRequest_(request, response); 14373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'suspend') { 14383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.suspendRequest_(request, response); 14393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'version') { 14403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.versionRequest_(request, response); 14413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'profile') { 1442bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch this.profileRequest_(request, response); 14436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } else if (request.command == 'changelive') { 1444bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch this.changeLiveRequest_(request, response); 1445bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } else if (request.command == 'flags') { 1446bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch this.debuggerFlagsRequest_(request, response); 1447086aeeaae12517475c22695a200be45495516549Ben Murdoch } else if (request.command == 'v8flags') { 1448086aeeaae12517475c22695a200be45495516549Ben Murdoch this.v8FlagsRequest_(request, response); 1449086aeeaae12517475c22695a200be45495516549Ben Murdoch 1450086aeeaae12517475c22695a200be45495516549Ben Murdoch // GC tools: 1451086aeeaae12517475c22695a200be45495516549Ben Murdoch } else if (request.command == 'gc') { 1452086aeeaae12517475c22695a200be45495516549Ben Murdoch this.gcRequest_(request, response); 1453086aeeaae12517475c22695a200be45495516549Ben Murdoch 1454e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // LiveObjectList tools: 1455e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-capture') { 1456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolCaptureRequest_(request, response); 1457e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-delete') { 1458e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolDeleteRequest_(request, response); 1459e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-diff') { 1460e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolDiffRequest_(request, response); 1461e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-getid') { 1462e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolGetIdRequest_(request, response); 1463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-info') { 1464e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolInfoRequest_(request, response); 1465e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-reset') { 1466e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolResetRequest_(request, response); 1467e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-retainers') { 1468e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolRetainersRequest_(request, response); 1469e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-path') { 1470e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolPathRequest_(request, response); 1471e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-print') { 1472e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolPrintRequest_(request, response); 1473e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-stats') { 1474e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolStatsRequest_(request, response); 1475e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 14763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 14773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Unknown command "' + request.command + '" in request'); 14783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch (e) { 14803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If there is no response object created one (without command). 14813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!response) { 14823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response = this.createResponse(); 14833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.success = false; 14853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.message = %ToString(e); 14863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 14883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Return the response as a JSON encoded string. 14893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 14903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(response.running)) { 14913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Response controls running state. 14923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.running_ = response.running; 14933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block response.running = this.running_; 14953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.toJSONProtocol(); 14963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch (e) { 14973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Failed to generate response - return generic error. 14983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return '{"seq":' + response.seq + ',' + 14993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '"request_seq":' + request.seq + ',' + 15003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '"type":"response",' + 15013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '"success":false,' + 15023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '"message":"Internal error: ' + %ToString(e) + '"}'; 15033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch (e) { 15053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Failed in one of the catch blocks above - most generic error. 15063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return '{"seq":0,"type":"response","success":false,"message":"Internal error"}'; 15073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 15093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.continueRequest_ = function(request, response) { 15123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for arguments for continue. 15133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 15143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var count = 1; 15153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var action = Debug.StepAction.StepIn; 15163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 15183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var stepaction = request.arguments.stepaction; 15193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var stepcount = request.arguments.stepcount; 15203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the stepcount argument if any. 15223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (stepcount) { 15233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu count = %ToNumber(stepcount); 15243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (count < 0) { 15253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid stepcount argument "' + stepcount + '".'); 15263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the stepaction argument. 15303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (stepaction) { 15313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (stepaction == 'in') { 15323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu action = Debug.StepAction.StepIn; 15333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (stepaction == 'min') { 15343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu action = Debug.StepAction.StepMin; 15353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (stepaction == 'next') { 15363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu action = Debug.StepAction.StepNext; 15373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (stepaction == 'out') { 15383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu action = Debug.StepAction.StepOut; 15393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 15403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid stepaction argument "' + stepaction + '".'); 15413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Setup the VM for stepping. 15453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_.prepareStep(action, count); 15463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // VM should be running after executing this request. 15493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.running = true; 15503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 15513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.breakRequest_ = function(request, response) { 15543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Ignore as break command does not do anything when broken. 15553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 15563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.setBreakPointRequest_ = 15593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu function(request, response) { 15603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal request. 15613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 15623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing arguments'); 15633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 15643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 15673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var type = request.arguments.type; 15683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var target = request.arguments.target; 15693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var line = request.arguments.line; 15703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var column = request.arguments.column; 15713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var enabled = IS_UNDEFINED(request.arguments.enabled) ? 15723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu true : request.arguments.enabled; 15733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var condition = request.arguments.condition; 15743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var ignoreCount = request.arguments.ignoreCount; 15753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var groupId = request.arguments.groupId; 15763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 15783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!type || IS_UNDEFINED(target)) { 15793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing argument "type" or "target"'); 15803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 15813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 15833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Either function or script break point. 15843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point_number; 15853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (type == 'function') { 15863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Handle function break point. 15873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_STRING(target)) { 15883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Argument "target" is not a string value'); 15893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 15903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var f; 15923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 15933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find the function through a global evaluate. 15943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu f = this.exec_state_.evaluateGlobal(target).value(); 15953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch (e) { 15963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Error: "' + %ToString(e) + 15973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '" evaluating "' + target + '"'); 15983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 15993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) { 16013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('"' + target + '" does not evaluate to a function'); 16023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 16033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set function break point. 16063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point_number = Debug.setBreakPoint(f, line, column, condition); 16073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (type == 'handle') { 16083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find the object pointed by the specified handle. 16093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var handle = parseInt(target, 10); 16103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var mirror = LookupMirror(handle); 16113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!mirror) { 16123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Object #' + handle + '# not found'); 16133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!mirror.isFunction()) { 16153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Object #' + handle + '# is not a function'); 16163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set function break point. 16193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point_number = Debug.setBreakPoint(mirror.value(), 16203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu line, column, condition); 16213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (type == 'script') { 16223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // set script break point. 16233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point_number = 16243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.setScriptBreakPointByName(target, line, column, condition, 16253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu groupId); 16263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (type == 'scriptId') { 16273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point_number = 16283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.setScriptBreakPointById(target, line, column, condition, groupId); 16293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (type == 'scriptRegExp') { 16303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch break_point_number = 16313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Debug.setScriptBreakPointByRegExp(target, line, column, condition, 16323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch groupId); 16333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 16343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch response.failed('Illegal type "' + type + '"'); 16353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return; 16363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set additional break point properties. 16393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = Debug.findBreakPoint(break_point_number); 16403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (ignoreCount) { 16413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.changeBreakPointIgnoreCount(break_point_number, ignoreCount); 16423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!enabled) { 16443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.disableBreakPoint(break_point_number); 16453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add the break point number to the response. 16483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { type: type, 16493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu breakpoint: break_point_number } 16503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add break point information to the response. 16523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_point instanceof ScriptBreakPoint) { 16533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_point.type() == Debug.ScriptBreakPointType.ScriptId) { 16543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.type = 'scriptId'; 16553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.script_id = break_point.script_id(); 16563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptName) { 16573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.type = 'scriptName'; 16583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.script_name = break_point.script_name(); 16593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptRegExp) { 16603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch response.body.type = 'scriptRegExp'; 16613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch response.body.script_regexp = break_point.script_regexp_object().source; 16623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 16633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch throw new Error("Internal error: Unexpected breakpoint type: " + break_point.type()); 16643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.line = break_point.line(); 16663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.column = break_point.column(); 16678defd9ff6930b4e24729971a61cf7469daf119beSteve Block response.body.actual_locations = break_point.actual_locations(); 16683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 16693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.type = 'function'; 16708defd9ff6930b4e24729971a61cf7469daf119beSteve Block response.body.actual_locations = [break_point.actual_location]; 16713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 16733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.changeBreakPointRequest_ = function(request, response) { 16763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal request. 16773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 16783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing arguments'); 16793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 16803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 16833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = %ToNumber(request.arguments.breakpoint); 16843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var enabled = request.arguments.enabled; 16853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var condition = request.arguments.condition; 16863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var ignoreCount = request.arguments.ignoreCount; 16873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 16893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!break_point) { 16903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing argument "breakpoint"'); 16913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 16923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Change enabled state if supplied. 16953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(enabled)) { 16963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (enabled) { 16973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.enableBreakPoint(break_point); 16983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 16993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.disableBreakPoint(break_point); 17003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Change condition if supplied 17043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(condition)) { 17053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.changeBreakPointCondition(break_point, condition); 17063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Change ignore count if supplied 17093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(ignoreCount)) { 17103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.changeBreakPointIgnoreCount(break_point, ignoreCount); 17113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 17133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.clearBreakPointGroupRequest_ = function(request, response) { 17163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal request. 17173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 17183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing arguments'); 17193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 17203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 17233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var group_id = request.arguments.groupId; 17243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 17263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!group_id) { 17273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing argument "groupId"'); 17283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 17293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var cleared_break_points = []; 17323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var new_script_break_points = []; 17333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < script_break_points.length; i++) { 17343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var next_break_point = script_break_points[i]; 17353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (next_break_point.groupId() == group_id) { 17363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu cleared_break_points.push(next_break_point.number()); 17373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu next_break_point.clear(); 17383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 17393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu new_script_break_points.push(next_break_point); 17403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_points = new_script_break_points; 17433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add the cleared break point numbers to the response. 17453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { breakpoints: cleared_break_points }; 17463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 17473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.clearBreakPointRequest_ = function(request, response) { 17503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal request. 17513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 17523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing arguments'); 17533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 17543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 17573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = %ToNumber(request.arguments.breakpoint); 17583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 17603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!break_point) { 17613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing argument "breakpoint"'); 17623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 17633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Clear break point. 17663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.clearBreakPoint(break_point); 17673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add the cleared break point number to the response. 17693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { breakpoint: break_point } 17703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 17713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1772bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 177325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian MonsenDebugCommandProcessor.prototype.listBreakpointsRequest_ = function(request, response) { 177425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen var array = []; 177525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen for (var i = 0; i < script_break_points.length; i++) { 177625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen var break_point = script_break_points[i]; 177725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 177825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen var description = { 177925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen number: break_point.number(), 178025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen line: break_point.line(), 178125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen column: break_point.column(), 178225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen groupId: break_point.groupId(), 178325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen hit_count: break_point.hit_count(), 178425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen active: break_point.active(), 178525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen condition: break_point.condition(), 17868defd9ff6930b4e24729971a61cf7469daf119beSteve Block ignoreCount: break_point.ignoreCount(), 17878defd9ff6930b4e24729971a61cf7469daf119beSteve Block actual_locations: break_point.actual_locations() 178825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen } 1789bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 179025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen if (break_point.type() == Debug.ScriptBreakPointType.ScriptId) { 179125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen description.type = 'scriptId'; 179225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen description.script_id = break_point.script_id(); 17933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptName) { 179425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen description.type = 'scriptName'; 179525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen description.script_name = break_point.script_name(); 17963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptRegExp) { 17973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch description.type = 'scriptRegExp'; 17983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch description.script_regexp = break_point.script_regexp_object().source; 17993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 18003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch throw new Error("Internal error: Unexpected breakpoint type: " + break_point.type()); 180125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen } 180225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen array.push(description); 180325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen } 1804bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 1805086aeeaae12517475c22695a200be45495516549Ben Murdoch response.body = { 1806086aeeaae12517475c22695a200be45495516549Ben Murdoch breakpoints: array, 1807086aeeaae12517475c22695a200be45495516549Ben Murdoch breakOnExceptions: Debug.isBreakOnException(), 1808086aeeaae12517475c22695a200be45495516549Ben Murdoch breakOnUncaughtExceptions: Debug.isBreakOnUncaughtException() 1809086aeeaae12517475c22695a200be45495516549Ben Murdoch } 1810086aeeaae12517475c22695a200be45495516549Ben Murdoch} 1811086aeeaae12517475c22695a200be45495516549Ben Murdoch 1812086aeeaae12517475c22695a200be45495516549Ben Murdoch 1813086aeeaae12517475c22695a200be45495516549Ben MurdochDebugCommandProcessor.prototype.disconnectRequest_ = 1814086aeeaae12517475c22695a200be45495516549Ben Murdoch function(request, response) { 1815086aeeaae12517475c22695a200be45495516549Ben Murdoch Debug.disableAllBreakPoints(); 1816086aeeaae12517475c22695a200be45495516549Ben Murdoch this.continueRequest_(request, response); 1817086aeeaae12517475c22695a200be45495516549Ben Murdoch} 1818086aeeaae12517475c22695a200be45495516549Ben Murdoch 1819086aeeaae12517475c22695a200be45495516549Ben Murdoch 1820086aeeaae12517475c22695a200be45495516549Ben MurdochDebugCommandProcessor.prototype.setExceptionBreakRequest_ = 1821086aeeaae12517475c22695a200be45495516549Ben Murdoch function(request, response) { 1822086aeeaae12517475c22695a200be45495516549Ben Murdoch // Check for legal request. 1823086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!request.arguments) { 1824086aeeaae12517475c22695a200be45495516549Ben Murdoch response.failed('Missing arguments'); 1825086aeeaae12517475c22695a200be45495516549Ben Murdoch return; 1826086aeeaae12517475c22695a200be45495516549Ben Murdoch } 1827086aeeaae12517475c22695a200be45495516549Ben Murdoch 1828086aeeaae12517475c22695a200be45495516549Ben Murdoch // Pull out and check the 'type' argument: 1829086aeeaae12517475c22695a200be45495516549Ben Murdoch var type = request.arguments.type; 1830086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!type) { 1831086aeeaae12517475c22695a200be45495516549Ben Murdoch response.failed('Missing argument "type"'); 1832086aeeaae12517475c22695a200be45495516549Ben Murdoch return; 1833086aeeaae12517475c22695a200be45495516549Ben Murdoch } 1834086aeeaae12517475c22695a200be45495516549Ben Murdoch 1835086aeeaae12517475c22695a200be45495516549Ben Murdoch // Initialize the default value of enable: 1836086aeeaae12517475c22695a200be45495516549Ben Murdoch var enabled; 1837086aeeaae12517475c22695a200be45495516549Ben Murdoch if (type == 'all') { 1838086aeeaae12517475c22695a200be45495516549Ben Murdoch enabled = !Debug.isBreakOnException(); 1839086aeeaae12517475c22695a200be45495516549Ben Murdoch } else if (type == 'uncaught') { 1840086aeeaae12517475c22695a200be45495516549Ben Murdoch enabled = !Debug.isBreakOnUncaughtException(); 1841086aeeaae12517475c22695a200be45495516549Ben Murdoch } 1842086aeeaae12517475c22695a200be45495516549Ben Murdoch 1843086aeeaae12517475c22695a200be45495516549Ben Murdoch // Pull out and check the 'enabled' argument if present: 1844086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!IS_UNDEFINED(request.arguments.enabled)) { 1845086aeeaae12517475c22695a200be45495516549Ben Murdoch enabled = request.arguments.enabled; 1846086aeeaae12517475c22695a200be45495516549Ben Murdoch if ((enabled != true) && (enabled != false)) { 1847086aeeaae12517475c22695a200be45495516549Ben Murdoch response.failed('Illegal value for "enabled":"' + enabled + '"'); 1848086aeeaae12517475c22695a200be45495516549Ben Murdoch } 1849086aeeaae12517475c22695a200be45495516549Ben Murdoch } 1850086aeeaae12517475c22695a200be45495516549Ben Murdoch 1851086aeeaae12517475c22695a200be45495516549Ben Murdoch // Now set the exception break state: 1852086aeeaae12517475c22695a200be45495516549Ben Murdoch if (type == 'all') { 1853086aeeaae12517475c22695a200be45495516549Ben Murdoch %ChangeBreakOnException(Debug.ExceptionBreak.Caught, enabled); 1854086aeeaae12517475c22695a200be45495516549Ben Murdoch } else if (type == 'uncaught') { 1855086aeeaae12517475c22695a200be45495516549Ben Murdoch %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, enabled); 1856086aeeaae12517475c22695a200be45495516549Ben Murdoch } else { 1857086aeeaae12517475c22695a200be45495516549Ben Murdoch response.failed('Unknown "type":"' + type + '"'); 1858086aeeaae12517475c22695a200be45495516549Ben Murdoch } 1859086aeeaae12517475c22695a200be45495516549Ben Murdoch 1860086aeeaae12517475c22695a200be45495516549Ben Murdoch // Add the cleared break point number to the response. 1861086aeeaae12517475c22695a200be45495516549Ben Murdoch response.body = { 'type': type, 'enabled': enabled }; 186225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen} 186325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 18643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.backtraceRequest_ = function(request, response) { 18663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the number of frames. 18673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var total_frames = this.exec_state_.frameCount(); 18683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create simple response if there are no frames. 18703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (total_frames == 0) { 18713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 18723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu totalFrames: total_frames 18733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 18753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Default frame range to include in backtrace. 18783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var from_index = 0 18793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var to_index = kDefaultBacktraceLength; 18803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the range from the arguments. 18823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 18833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments.fromFrame) { 18843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu from_index = request.arguments.fromFrame; 18853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments.toFrame) { 18873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu to_index = request.arguments.toFrame; 18883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments.bottom) { 18903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var tmp_index = total_frames - from_index; 18913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu from_index = total_frames - to_index 18923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu to_index = tmp_index; 18933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (from_index < 0 || to_index < 0) { 18953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame number'); 18963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Adjust the index. 19003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu to_index = Math.min(total_frames, to_index); 19013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (to_index <= from_index) { 19033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var error = 'Invalid frame range'; 19043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed(error); 19053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create the response body. 19083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frames = []; 19093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = from_index; i < to_index; i++) { 19103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu frames.push(this.exec_state_.frame(i)); 19113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 19133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu fromFrame: from_index, 19143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu toFrame: to_index, 19153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu totalFrames: total_frames, 19163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu frames: frames 19173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 19193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.frameRequest_ = function(request, response) { 19223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no source. 19233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 19243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No frames'); 19253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // With no arguments just keep the selected frame. 19283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 19293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var index = request.arguments.number; 19303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (index < 0 || this.exec_state_.frameCount() <= index) { 19313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame number'); 19323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_.setSelectedFrame(request.arguments.number); 19353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = this.exec_state_.frame(); 19373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 19383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.frameForScopeRequest_ = function(request) { 19413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the frame for which the scope or scopes are requested. With no frameNumber 19423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // argument use the currently selected frame. 19433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments && !IS_UNDEFINED(request.arguments.frameNumber)) { 19443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu frame_index = request.arguments.frameNumber; 19453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (frame_index < 0 || this.exec_state_.frameCount() <= frame_index) { 19463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame number'); 19473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(frame_index); 19493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 19503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(); 19513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 19533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.scopesRequest_ = function(request, response) { 19563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no scopes. 19573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 19583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No scopes'); 19593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the frame for which the scopes are requested. 19623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame = this.frameForScopeRequest_(request); 19633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Fill all scopes for this frame. 19653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var total_scopes = frame.scopeCount(); 19663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scopes = []; 19673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < total_scopes; i++) { 19683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu scopes.push(frame.scope(i)); 19693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 19713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu fromScope: 0, 19723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu toScope: total_scopes, 19733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu totalScopes: total_scopes, 19743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu scopes: scopes 19753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 19773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.scopeRequest_ = function(request, response) { 19803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no scopes. 19813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 19823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No scopes'); 19833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the frame for which the scope is requested. 19863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame = this.frameForScopeRequest_(request); 19873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // With no scope argument just return top scope. 19893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scope_index = 0; 19903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments && !IS_UNDEFINED(request.arguments.number)) { 19913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu scope_index = %ToNumber(request.arguments.number); 19923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (scope_index < 0 || frame.scopeCount() <= scope_index) { 19933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid scope number'); 19943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = frame.scope(scope_index); 19983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 19993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.evaluateRequest_ = function(request, response) { 20023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 20033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Missing arguments'); 20043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 20073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var expression = request.arguments.expression; 20083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame = request.arguments.frame; 20093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var global = request.arguments.global; 20103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var disable_break = request.arguments.disable_break; 2011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch var additional_context = request.arguments.additional_context; 20123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // The expression argument could be an integer so we convert it to a 20143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // string. 20153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 20163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu expression = String(expression); 20173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch(e) { 20183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Failed to convert expression argument to string'); 20193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 20223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(frame) && global) { 20233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Arguments "frame" and "global" are exclusive'); 20243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch var additional_context_object; 2027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (additional_context) { 2028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch additional_context_object = {}; 2029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (var i = 0; i < additional_context.length; i++) { 2030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch var mapping = additional_context[i]; 2031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!IS_STRING(mapping.name) || !IS_NUMBER(mapping.handle)) { 2032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return response.failed("Context element #" + i + 2033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch " must contain name:string and handle:number"); 2034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch var context_value_mirror = LookupMirror(mapping.handle); 2036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!context_value_mirror) { 2037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return response.failed("Context object '" + mapping.name + 2038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch "' #" + mapping.handle + "# not found"); 2039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch additional_context_object[mapping.name] = context_value_mirror.value(); 2041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 20433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Global evaluate. 20453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (global) { 20463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Evaluate in the global context. 2047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch response.body = this.exec_state_.evaluateGlobal( 2048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch expression, Boolean(disable_break), additional_context_object); 20493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 20503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Default value for disable_break is true. 20533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(disable_break)) { 20543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu disable_break = true; 20553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no evaluate in frame. 20583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 20593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No frames'); 20603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check whether a frame was specified. 20633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(frame)) { 20643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame_number = %ToNumber(frame); 20653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (frame_number < 0 || frame_number >= this.exec_state_.frameCount()) { 20663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame "' + frame + '"'); 20673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Evaluate in the specified frame. 20693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = this.exec_state_.frame(frame_number).evaluate( 2070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch expression, Boolean(disable_break), additional_context_object); 20713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 20723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 20733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Evaluate in the selected frame. 20743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = this.exec_state_.frame().evaluate( 2075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch expression, Boolean(disable_break), additional_context_object); 20763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 20773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 20793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2081e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.getobjRequest_ = function(request, response) { 2082e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (!request.arguments) { 2083e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return response.failed('Missing arguments'); 2084e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2085e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2086e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Pull out arguments. 2087e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var obj_id = request.arguments.obj_id; 2088e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2089e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Check for legal arguments. 2090e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (IS_UNDEFINED(obj_id)) { 2091e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return response.failed('Argument "obj_id" missing'); 2092e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2093e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2094e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Dump the object. 2095e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = MakeMirror(%GetLOLObj(obj_id)); 2096e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2097e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2098e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 20993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.lookupRequest_ = function(request, response) { 21003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 21013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Missing arguments'); 21023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 21053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var handles = request.arguments.handles; 21063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 21083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(handles)) { 21093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Argument "handles" missing'); 21103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set 'includeSource' option for script lookup. 21133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(request.arguments.includeSource)) { 21143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu includeSource = %ToBoolean(request.arguments.includeSource); 21153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.setOption('includeSource', includeSource); 21163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Lookup handles. 21193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var mirrors = {}; 21203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < handles.length; i++) { 21213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var handle = handles[i]; 21223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var mirror = LookupMirror(handle); 21233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!mirror) { 21243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Object #' + handle + '# not found'); 21253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu mirrors[handle] = mirror; 21273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = mirrors; 21293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 21303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.referencesRequest_ = 21333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu function(request, response) { 21343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 21353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Missing arguments'); 21363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 21393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var type = request.arguments.type; 21403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var handle = request.arguments.handle; 21413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 21433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(type)) { 21443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Argument "type" missing'); 21453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(handle)) { 21473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Argument "handle" missing'); 21483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (type != 'referencedBy' && type != 'constructedBy') { 21503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid type "' + type + '"'); 21513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Lookup handle and return objects with references the object. 21543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var mirror = LookupMirror(handle); 21553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (mirror) { 21563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (type == 'referencedBy') { 21573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = mirror.referencedBy(); 21583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 21593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = mirror.constructedBy(); 21603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 21623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Object #' + handle + '# not found'); 21633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 21653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.sourceRequest_ = function(request, response) { 21683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no source. 21693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 21703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No source'); 21713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var from_line; 21743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var to_line; 21753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame = this.exec_state_.frame(); 21763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 21773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 21783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu from_line = request.arguments.fromLine; 21793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu to_line = request.arguments.toLine; 21803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(request.arguments.frame)) { 21823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame_number = %ToNumber(request.arguments.frame); 21833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (frame_number < 0 || frame_number >= this.exec_state_.frameCount()) { 21843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame "' + frame + '"'); 21853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu frame = this.exec_state_.frame(frame_number); 21873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the script selected. 21913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = frame.func().script(); 21923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!script) { 21933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No source'); 21943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the source slice and fill it into the response. 21973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var slice = script.sourceSlice(from_line, to_line); 21983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!slice) { 21993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid line interval'); 22003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = {}; 22023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.source = slice.sourceText(); 22033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.fromLine = slice.from_line; 22043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.toLine = slice.to_line; 22053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.fromPosition = slice.from_position; 22063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.toPosition = slice.to_position; 22073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.totalLines = script.lineCount(); 22083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 22093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.scriptsRequest_ = function(request, response) { 22123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var types = ScriptTypeFlag(Debug.ScriptType.Normal); 22133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var includeSource = false; 22143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var idsToInclude = null; 22153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 22163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 22173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(request.arguments.types)) { 22183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu types = %ToNumber(request.arguments.types); 22193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (isNaN(types) || types < 0) { 22203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid types "' + request.arguments.types + '"'); 22213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(request.arguments.includeSource)) { 22253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu includeSource = %ToBoolean(request.arguments.includeSource); 22263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.setOption('includeSource', includeSource); 22273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_ARRAY(request.arguments.ids)) { 22303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu idsToInclude = {}; 22313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var ids = request.arguments.ids; 22323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < ids.length; i++) { 22333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu idsToInclude[ids[i]] = true; 22343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2236086aeeaae12517475c22695a200be45495516549Ben Murdoch 2237086aeeaae12517475c22695a200be45495516549Ben Murdoch var filterStr = null; 2238086aeeaae12517475c22695a200be45495516549Ben Murdoch var filterNum = null; 2239086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!IS_UNDEFINED(request.arguments.filter)) { 2240086aeeaae12517475c22695a200be45495516549Ben Murdoch var num = %ToNumber(request.arguments.filter); 2241086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!isNaN(num)) { 2242086aeeaae12517475c22695a200be45495516549Ben Murdoch filterNum = num; 2243086aeeaae12517475c22695a200be45495516549Ben Murdoch } 2244086aeeaae12517475c22695a200be45495516549Ben Murdoch filterStr = request.arguments.filter; 2245086aeeaae12517475c22695a200be45495516549Ben Murdoch } 22463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Collect all scripts in the heap. 22493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scripts = %DebugGetLoadedScripts(); 22503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = []; 22523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < scripts.length; i++) { 22543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (idsToInclude && !idsToInclude[scripts[i].id]) { 22553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu continue; 22563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2257086aeeaae12517475c22695a200be45495516549Ben Murdoch if (filterStr || filterNum) { 2258086aeeaae12517475c22695a200be45495516549Ben Murdoch var script = scripts[i]; 2259086aeeaae12517475c22695a200be45495516549Ben Murdoch var found = false; 2260086aeeaae12517475c22695a200be45495516549Ben Murdoch if (filterNum && !found) { 2261086aeeaae12517475c22695a200be45495516549Ben Murdoch if (script.id && script.id === filterNum) { 2262086aeeaae12517475c22695a200be45495516549Ben Murdoch found = true; 2263086aeeaae12517475c22695a200be45495516549Ben Murdoch } 2264086aeeaae12517475c22695a200be45495516549Ben Murdoch } 2265086aeeaae12517475c22695a200be45495516549Ben Murdoch if (filterStr && !found) { 2266086aeeaae12517475c22695a200be45495516549Ben Murdoch if (script.name && script.name.indexOf(filterStr) >= 0) { 2267086aeeaae12517475c22695a200be45495516549Ben Murdoch found = true; 2268086aeeaae12517475c22695a200be45495516549Ben Murdoch } 2269086aeeaae12517475c22695a200be45495516549Ben Murdoch } 2270086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!found) continue; 2271086aeeaae12517475c22695a200be45495516549Ben Murdoch } 22723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (types & ScriptTypeFlag(scripts[i].type)) { 22733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.push(MakeMirror(scripts[i])); 22743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 22773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.threadsRequest_ = function(request, response) { 22803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the number of threads. 22813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var total_threads = this.exec_state_.threadCount(); 22823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get information for all threads. 22843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var threads = []; 22853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < total_threads; i++) { 22863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var details = %GetThreadDetails(this.exec_state_.break_id, i); 22873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var thread_info = { current: details[0], 22883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu id: details[1] 22893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu threads.push(thread_info); 22913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create the response body. 22943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 22953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu totalThreads: total_threads, 22963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu threads: threads 22973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 22993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.suspendRequest_ = function(request, response) { 23023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.running = false; 23033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 23043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.versionRequest_ = function(request, response) { 23073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 23083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu V8Version: %GetV8Version() 23093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 23103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 23113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.profileRequest_ = function(request, response) { 23143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments.command == 'resume') { 23153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch %ProfilerResume(); 23163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.arguments.command == 'pause') { 23173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch %ProfilerPause(); 23183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 23193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Unknown command'); 23203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 23213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = {}; 23223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 23233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23256ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockDebugCommandProcessor.prototype.changeLiveRequest_ = function(request, response) { 23266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!Debug.LiveEdit) { 23276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return response.failed('LiveEdit feature is not supported'); 23286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 23296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!request.arguments) { 23306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return response.failed('Missing arguments'); 23316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 23326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var script_id = request.arguments.script_id; 23338defd9ff6930b4e24729971a61cf7469daf119beSteve Block var preview_only = !!request.arguments.preview_only; 2334f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 23356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var scripts = %DebugGetLoadedScripts(); 23366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 23376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var the_script = null; 23386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (var i = 0; i < scripts.length; i++) { 23396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (scripts[i].id == script_id) { 23406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block the_script = scripts[i]; 23416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 23426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 23436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!the_script) { 23446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block response.failed('Script not found'); 23456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return; 23466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 23476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 23486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var change_log = new Array(); 2349bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 23506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!IS_STRING(request.arguments.new_source)) { 23516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block throw "new_source argument expected"; 23526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 23536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 23546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var new_source = request.arguments.new_source; 2355f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 23568defd9ff6930b4e24729971a61cf7469daf119beSteve Block var result_description = Debug.LiveEdit.SetScriptSource(the_script, 23578defd9ff6930b4e24729971a61cf7469daf119beSteve Block new_source, preview_only, change_log); 23588defd9ff6930b4e24729971a61cf7469daf119beSteve Block response.body = {change_log: change_log, result: result_description}; 2359f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 2360bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch if (!preview_only && !this.running_ && result_description.stack_modified) { 2361bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch response.body.stepin_recommended = true; 2362bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 23636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 23646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 23656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2366bb769b257e753aafcbd96767abb2abc645eaa20cBen MurdochDebugCommandProcessor.prototype.debuggerFlagsRequest_ = function(request, 2367bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch response) { 2368bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch // Check for legal request. 2369bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch if (!request.arguments) { 2370bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch response.failed('Missing arguments'); 2371bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch return; 2372bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 2373bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 2374bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch // Pull out arguments. 2375bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch var flags = request.arguments.flags; 2376bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 2377bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch response.body = { flags: [] }; 2378bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch if (!IS_UNDEFINED(flags)) { 2379bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch for (var i = 0; i < flags.length; i++) { 2380bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch var name = flags[i].name; 2381bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch var debugger_flag = debugger_flags[name]; 2382bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch if (!debugger_flag) { 2383bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch continue; 2384bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 2385bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch if ('value' in flags[i]) { 2386bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch debugger_flag.setValue(flags[i].value); 2387bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 2388bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch response.body.flags.push({ name: name, value: debugger_flag.getValue() }); 2389bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 2390bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } else { 2391bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch for (var name in debugger_flags) { 2392bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch var value = debugger_flags[name].getValue(); 2393bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch response.body.flags.push({ name: name, value: value }); 2394bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 2395bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 2396bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch} 2397bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 2398bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 2399086aeeaae12517475c22695a200be45495516549Ben MurdochDebugCommandProcessor.prototype.v8FlagsRequest_ = function(request, response) { 2400086aeeaae12517475c22695a200be45495516549Ben Murdoch var flags = request.arguments.flags; 2401086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!flags) flags = ''; 2402086aeeaae12517475c22695a200be45495516549Ben Murdoch %SetFlags(flags); 2403086aeeaae12517475c22695a200be45495516549Ben Murdoch}; 2404086aeeaae12517475c22695a200be45495516549Ben Murdoch 2405086aeeaae12517475c22695a200be45495516549Ben Murdoch 2406086aeeaae12517475c22695a200be45495516549Ben MurdochDebugCommandProcessor.prototype.gcRequest_ = function(request, response) { 2407086aeeaae12517475c22695a200be45495516549Ben Murdoch var type = request.arguments.type; 2408086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!type) type = 'all'; 2409086aeeaae12517475c22695a200be45495516549Ben Murdoch 2410086aeeaae12517475c22695a200be45495516549Ben Murdoch var before = %GetHeapUsage(); 2411086aeeaae12517475c22695a200be45495516549Ben Murdoch %CollectGarbage(type); 2412086aeeaae12517475c22695a200be45495516549Ben Murdoch var after = %GetHeapUsage(); 2413086aeeaae12517475c22695a200be45495516549Ben Murdoch 2414086aeeaae12517475c22695a200be45495516549Ben Murdoch response.body = { "before": before, "after": after }; 2415086aeeaae12517475c22695a200be45495516549Ben Murdoch}; 2416086aeeaae12517475c22695a200be45495516549Ben Murdoch 2417086aeeaae12517475c22695a200be45495516549Ben Murdoch 2418e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolCaptureRequest_ = 2419e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function(request, response) { 2420e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = %CaptureLOL(); 2421e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2422e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2423e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2424e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolDeleteRequest_ = 2425e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function(request, response) { 2426e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var id = request.arguments.id; 2427e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var result = %DeleteLOL(id); 2428e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (result) { 2429e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = { id: id }; 2430e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 2431e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.failed('Failed to delete: live object list ' + id + ' not found.'); 2432e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2433e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2434e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2435e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2436e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolDiffRequest_ = function(request, response) { 2437e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var id1 = request.arguments.id1; 2438e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var id2 = request.arguments.id2; 2439e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var verbose = request.arguments.verbose; 2440e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var filter = request.arguments.filter; 2441e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (verbose === true) { 2442e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var start = request.arguments.start; 2443e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var count = request.arguments.count; 2444e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = %DumpLOL(id1, id2, start, count, filter); 2445e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 2446e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = %SummarizeLOL(id1, id2, filter); 2447e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2448e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2449e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2450e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2451e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolGetIdRequest_ = function(request, response) { 2452e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var address = request.arguments.address; 2453e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = {}; 2454e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body.id = %GetLOLObjId(address); 2455e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2457e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2458e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolInfoRequest_ = function(request, response) { 2459e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var start = request.arguments.start; 2460e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var count = request.arguments.count; 2461e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = %InfoLOL(start, count); 2462e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2464e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2465e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolResetRequest_ = function(request, response) { 2466e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch %ResetLOL(); 2467e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2468e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2469e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2470e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolRetainersRequest_ = 2471e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function(request, response) { 2472e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var id = request.arguments.id; 2473e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var verbose = request.arguments.verbose; 2474e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var start = request.arguments.start; 2475e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var count = request.arguments.count; 2476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var filter = request.arguments.filter; 2477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2478e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = %GetLOLObjRetainers(id, Mirror.prototype, verbose, 2479e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch start, count, filter); 2480e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2481e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2482e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2483e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolPathRequest_ = function(request, response) { 2484e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var id1 = request.arguments.id1; 2485e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var id2 = request.arguments.id2; 2486e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = {}; 2487e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body.path = %GetLOLPath(id1, id2, Mirror.prototype); 2488e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2489e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2490e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2491e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolPrintRequest_ = function(request, response) { 2492e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var id = request.arguments.id; 2493e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = {}; 2494e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body.dump = %PrintLOLObj(id); 2495e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2496086aeeaae12517475c22695a200be45495516549Ben Murdoch 2497086aeeaae12517475c22695a200be45495516549Ben Murdoch 24983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Check whether the previously processed command caused the VM to become 24993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// running. 25003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.isRunning = function() { 25013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.running_; 25023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 25033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.systemBreak = function(cmd, args) { 25063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %SystemBreak(); 25073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 25083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction NumberToHex8Str(n) { 25113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var r = ""; 25123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < 8; ++i) { 25133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var c = hexCharArray[n & 0x0F]; // hexCharArray is defined in uri.js 25143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu r = c + r; 25153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu n = n >>> 4; 25163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 25173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return r; 25183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 25193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/** 25223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Convert an Object to its debugger protocol representation. The representation 25233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * may be serilized to a JSON object using JSON.stringify(). 25243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * This implementation simply runs through all string property names, converts 25253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * each property value to a protocol value and adds the property to the result 25263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * object. For type "object" the function will be called recursively. Note that 25273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * circular structures will cause infinite recursion. 25283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Object} object The object to format as protocol object. 25293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {MirrorSerializer} mirror_serializer The serializer to use if any 25303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * mirror objects are encountered. 25313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Object} Protocol object value. 25323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */ 25333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ObjectToProtocolObject_(object, mirror_serializer) { 25343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var content = {}; 25353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var key in object) { 25363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Only consider string keys. 25373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (typeof key == 'string') { 25383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Format the value based on its type. 25393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var property_value_json = ValueToProtocolValue_(object[key], 25403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu mirror_serializer); 25413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add the property if relevant. 25423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(property_value_json)) { 25433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu content[key] = property_value_json; 25443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 25453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 25463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 25476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 25483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return content; 25493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 25503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/** 25533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Convert an array to its debugger protocol representation. It will convert 25543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * each array element to a protocol value. 25553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Array} array The array to format as protocol array. 25563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {MirrorSerializer} mirror_serializer The serializer to use if any 25573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * mirror objects are encountered. 25583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Array} Protocol array value. 25593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */ 25603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ArrayToProtocolArray_(array, mirror_serializer) { 25613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var json = []; 25623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < array.length; i++) { 25633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.push(ValueToProtocolValue_(array[i], mirror_serializer)); 25643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 25653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return json; 25663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 25673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/** 25706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * Convert a value to its debugger protocol representation. 25713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {*} value The value to format as protocol value. 25723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {MirrorSerializer} mirror_serializer The serializer to use if any 25733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * mirror objects are encountered. 25743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {*} Protocol value. 25753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */ 25763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ValueToProtocolValue_(value, mirror_serializer) { 25773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Format the value based on its type. 25783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var json; 25793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu switch (typeof value) { 25803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu case 'object': 25813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (value instanceof Mirror) { 25823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = mirror_serializer.serializeValue(value); 25833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (IS_ARRAY(value)){ 25843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = ArrayToProtocolArray_(value, mirror_serializer); 25853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 25863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = ObjectToProtocolObject_(value, mirror_serializer); 25873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 25883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break; 25893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu case 'boolean': 25913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu case 'string': 25923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu case 'number': 25933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = value; 25943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break 25953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu default: 25973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = null; 25983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 25993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return json; 26003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 2601