13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 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. 293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar kDefaultBacktraceLength = 10; 303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar 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. 363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar 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; 2893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 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; 3383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 3398defd9ff6930b4e24729971a61cf7469daf119beSteve Block 3408defd9ff6930b4e24729971a61cf7469daf119beSteve Block 3416ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockScriptBreakPoint.prototype.update_positions = function(line, column) { 3426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block this.line_ = line; 3436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block this.column_ = column; 3443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 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()); 40769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen 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++) { 4803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var break_point = script_break_points[i]; 4813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if ((break_point.type() == Debug.ScriptBreakPointType.ScriptName || 4823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break_point.type() == Debug.ScriptBreakPointType.ScriptRegExp) && 4833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break_point.matchesScript(script)) { 4843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break_point.set(script); 4853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 4883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4906ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockfunction GetScriptBreakPoints(script) { 4916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var result = []; 4926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (var i = 0; i < script_break_points.length; i++) { 4936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (script_break_points[i].matchesScript(script)) { 4946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block result.push(script_break_points[i]); 4956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 4966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 4976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return result; 4986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 4996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 5006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 5013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setListener = function(listener, opt_data) { 5023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(listener) && !IS_UNDEFINED(listener) && !IS_NULL(listener)) { 5033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Parameters have wrong types.'); 5043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %SetDebugEventListener(listener, opt_data); 5063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.breakExecution = function(f) { 5103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %Break(); 5113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.breakLocations = function(f) { 5143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %GetBreakLocations(f); 5163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Returns a Script object. If the parameter is a function the return value 5193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// is the script in which the function is defined. If the parameter is a string 5203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// the return value is the script for which the script name has that string 5213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// value. If it is a regexp and there is a unique script whose name matches 5223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// we return that, otherwise undefined. 5233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findScript = function(func_or_script_name) { 5243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_FUNCTION(func_or_script_name)) { 5253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %FunctionGetScript(func_or_script_name); 5263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (IS_REGEXP(func_or_script_name)) { 5273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scripts = Debug.scripts(); 5283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var last_result = null; 5293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var result_count = 0; 5303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i in scripts) { 5313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = scripts[i]; 5323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (func_or_script_name.test(script.name)) { 5333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu last_result = script; 5343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result_count++; 5353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Return the unique script matching the regexp. If there are more 5383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // than one we don't return a value since there is no good way to 5393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // decide which one to return. Returning a "random" one, say the 5403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // first, would introduce nondeterminism (or something close to it) 5413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // because the order is the heap iteration order. 5423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (result_count == 1) { 5433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return last_result; 5443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 5453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return undefined; 5463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 5483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %GetScript(func_or_script_name); 5493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Returns the script source. If the parameter is a function the return value 5533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// is the script source for the script in which the function is defined. If the 5543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// parameter is a string the return value is the script for which the script 5553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// name has that string value. 5563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.scriptSource = function(func_or_script_name) { 5573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.findScript(func_or_script_name).source; 5583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.source = function(f) { 5613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %FunctionGetSourceCode(f); 5633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.disassemble = function(f) { 5663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %DebugDisassembleFunction(f); 5683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.disassembleConstructor = function(f) { 5713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %DebugDisassembleConstructor(f); 5733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5756ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockDebug.ExecuteInDebugContext = function(f, without_debugger) { 5766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return %ExecuteInDebugContext(f, !!without_debugger); 5786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 5796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 5803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.sourcePosition = function(f) { 5813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %FunctionGetScriptSourcePosition(f); 5833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findFunctionSourceLocation = function(func, opt_line, opt_column) { 5873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = %FunctionGetScript(func); 5883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_offset = %FunctionGetScriptSourcePosition(func); 5893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return script.locationFromLine(opt_line, opt_column, script_offset); 5903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 5913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Returns the character position in a script based on a line number and an 5943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// optional position within that line. 5953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findScriptSourcePosition = function(script, opt_line, opt_column) { 5963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var location = script.locationFromLine(opt_line, opt_column); 5973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return location ? location.position : null; 5983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 5993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findBreakPoint = function(break_point_number, remove) { 6023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point; 6033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < break_points.length; i++) { 6043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_points[i].number() == break_point_number) { 6053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point = break_points[i]; 6063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Remove the break point from the list if requested. 6073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (remove) { 6083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_points.splice(i, 1); 6093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break; 6113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_point) { 6143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return break_point; 6153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 6163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.findScriptBreakPoint(break_point_number, remove); 6173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 6193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6208defd9ff6930b4e24729971a61cf7469daf119beSteve BlockDebug.findBreakPointActualLocations = function(break_point_number) { 6218defd9ff6930b4e24729971a61cf7469daf119beSteve Block for (var i = 0; i < script_break_points.length; i++) { 6228defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (script_break_points[i].number() == break_point_number) { 6238defd9ff6930b4e24729971a61cf7469daf119beSteve Block return script_break_points[i].actual_locations(); 6248defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 6258defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 6268defd9ff6930b4e24729971a61cf7469daf119beSteve Block for (var i = 0; i < break_points.length; i++) { 6278defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (break_points[i].number() == break_point_number) { 6288defd9ff6930b4e24729971a61cf7469daf119beSteve Block return [break_points[i].actual_location]; 6298defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 6308defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 6318defd9ff6930b4e24729971a61cf7469daf119beSteve Block return []; 6323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 6333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setBreakPoint = function(func, opt_line, opt_column, opt_condition) { 6353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(func)) throw new Error('Parameters have wrong types.'); 6363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Break points in API functions are not supported. 6373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (%FunctionIsAPIFunction(func)) { 6383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Cannot set break point in native code.'); 6393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find source position relative to start of the function 6413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_position = 6423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.findFunctionSourceLocation(func, opt_line, opt_column).position; 6433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var source_position = break_position - this.sourcePosition(func); 6443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find the script for the function. 6453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = %FunctionGetScript(func); 6463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Break in builtin JavaScript code is not supported. 6473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script.type == Debug.ScriptType.Native) { 6483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Cannot set break point in native code.'); 6493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If the script for the function has a name convert this to a script break 6513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // point. 6523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script && script.id) { 6533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Adjust the source position to be script relative. 6543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu source_position += %FunctionGetScriptSourcePosition(func); 6553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find line and column for the position in the script and set a script 6563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // break point from that. 6573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var location = script.locationFromPosition(source_position, false); 6583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.setScriptBreakPointById(script.id, 6593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu location.line, location.column, 6603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition); 6613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 6623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set a break point directly on the function. 663b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch var break_point = MakeBreakPoint(source_position); 6648defd9ff6930b4e24729971a61cf7469daf119beSteve Block var actual_position = 6658defd9ff6930b4e24729971a61cf7469daf119beSteve Block %SetFunctionBreakPoint(func, source_position, break_point); 6668defd9ff6930b4e24729971a61cf7469daf119beSteve Block actual_position += this.sourcePosition(func); 6678defd9ff6930b4e24729971a61cf7469daf119beSteve Block var actual_location = script.locationFromPosition(actual_position, true); 6688defd9ff6930b4e24729971a61cf7469daf119beSteve Block break_point.actual_location = { line: actual_location.line, 6693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch column: actual_location.column, 6703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch script_id: script.id }; 6713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point.setCondition(opt_condition); 6723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return break_point.number(); 6733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 6753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 677b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochDebug.setBreakPointByScriptIdAndPosition = function(script_id, position, 678b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch condition, enabled) 679b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch{ 680b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch break_point = MakeBreakPoint(position); 681b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch break_point.setCondition(condition); 6823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!enabled) { 683b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch break_point.disable(); 6843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 685b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch var scripts = this.scripts(); 686b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (var i = 0; i < scripts.length; i++) { 687b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (script_id == scripts[i].id) { 688b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch break_point.actual_position = %SetScriptBreakPoint(scripts[i], position, 689b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch break_point); 690b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch break; 691b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 692b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 693b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return break_point; 694b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}; 695b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 696b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 6973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.enableBreakPoint = function(break_point_number) { 6983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, false); 699086aeeaae12517475c22695a200be45495516549Ben Murdoch // Only enable if the breakpoint hasn't been deleted: 700086aeeaae12517475c22695a200be45495516549Ben Murdoch if (break_point) { 701086aeeaae12517475c22695a200be45495516549Ben Murdoch break_point.enable(); 702086aeeaae12517475c22695a200be45495516549Ben Murdoch } 7033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.disableBreakPoint = function(break_point_number) { 7073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, false); 708086aeeaae12517475c22695a200be45495516549Ben Murdoch // Only enable if the breakpoint hasn't been deleted: 709086aeeaae12517475c22695a200be45495516549Ben Murdoch if (break_point) { 710086aeeaae12517475c22695a200be45495516549Ben Murdoch break_point.disable(); 711086aeeaae12517475c22695a200be45495516549Ben Murdoch } 7123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.changeBreakPointCondition = function(break_point_number, condition) { 7163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, false); 7173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point.setCondition(condition); 7183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.changeBreakPointIgnoreCount = function(break_point_number, ignoreCount) { 7223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (ignoreCount < 0) { 7233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid argument'); 7243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, false); 7263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point.setIgnoreCount(ignoreCount); 7273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearBreakPoint = function(break_point_number) { 7313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, true); 7323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_point) { 7333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %ClearBreakPoint(break_point); 7343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 7353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point = this.findScriptBreakPoint(break_point_number, true); 7363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!break_point) { 7373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid breakpoint'); 7383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearAllBreakPoints = function() { 7443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < break_points.length; i++) { 7453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point = break_points[i]; 7463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %ClearBreakPoint(break_point); 7473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_points = []; 7493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 752086aeeaae12517475c22695a200be45495516549Ben MurdochDebug.disableAllBreakPoints = function() { 753086aeeaae12517475c22695a200be45495516549Ben Murdoch // Disable all user defined breakpoints: 754086aeeaae12517475c22695a200be45495516549Ben Murdoch for (var i = 1; i < next_break_point_number; i++) { 755086aeeaae12517475c22695a200be45495516549Ben Murdoch Debug.disableBreakPoint(i); 756086aeeaae12517475c22695a200be45495516549Ben Murdoch } 757086aeeaae12517475c22695a200be45495516549Ben Murdoch // Disable all exception breakpoints: 758086aeeaae12517475c22695a200be45495516549Ben Murdoch %ChangeBreakOnException(Debug.ExceptionBreak.Caught, false); 759086aeeaae12517475c22695a200be45495516549Ben Murdoch %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, false); 760086aeeaae12517475c22695a200be45495516549Ben Murdoch}; 761086aeeaae12517475c22695a200be45495516549Ben Murdoch 762086aeeaae12517475c22695a200be45495516549Ben Murdoch 7633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findScriptBreakPoint = function(break_point_number, remove) { 7643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point; 7653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < script_break_points.length; i++) { 7663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script_break_points[i].number() == break_point_number) { 7673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point = script_break_points[i]; 7683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Remove the break point from the list if requested. 7693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (remove) { 7703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.clear(); 7713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_points.splice(i,1); 7723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break; 7743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return script_break_point; 7773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 7783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Sets a breakpoint in a script identified through id or name at the 7813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// specified source line and column within that line. 7823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setScriptBreakPoint = function(type, script_id_or_name, 7833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_line, opt_column, opt_condition, 7843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_groupId) { 7853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create script break point object. 7863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = 7873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu new ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column, 7883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_groupId); 7893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Assign number to the new script break point and add it. 7913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.number_ = next_break_point_number++; 7923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.setCondition(opt_condition); 7933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_points.push(script_break_point); 7943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Run through all scripts to see if this script break point matches any 7963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // loaded scripts. 7973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scripts = this.scripts(); 7983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < scripts.length; i++) { 7993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script_break_point.matchesScript(scripts[i])) { 8003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.set(scripts[i]); 8013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 8023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 8033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return script_break_point.number(); 8053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 8063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setScriptBreakPointById = function(script_id, 8093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_line, opt_column, 8103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition, opt_groupId) { 8113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptId, 8123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_id, opt_line, opt_column, 8133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition, opt_groupId); 8143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 8153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setScriptBreakPointByName = function(script_name, 8183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_line, opt_column, 8193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition, opt_groupId) { 8203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptName, 8213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_name, opt_line, opt_column, 8223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition, opt_groupId); 8233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 8243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8263fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochDebug.setScriptBreakPointByRegExp = function(script_regexp, 8273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch opt_line, opt_column, 8283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch opt_condition, opt_groupId) { 8293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptRegExp, 8303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch script_regexp, opt_line, opt_column, 8313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch opt_condition, opt_groupId); 8323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 8333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.enableScriptBreakPoint = function(break_point_number) { 8363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = this.findScriptBreakPoint(break_point_number, false); 8373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.enable(); 8383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.disableScriptBreakPoint = function(break_point_number) { 8423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = this.findScriptBreakPoint(break_point_number, false); 8433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.disable(); 8443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8473ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.changeScriptBreakPointCondition = function( 8483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break_point_number, condition) { 8493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = this.findScriptBreakPoint(break_point_number, false); 8503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.setCondition(condition); 8513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8543ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebug.changeScriptBreakPointIgnoreCount = function( 8553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break_point_number, ignoreCount) { 8563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (ignoreCount < 0) { 8573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid argument'); 8583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 8593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = this.findScriptBreakPoint(break_point_number, false); 8603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.setIgnoreCount(ignoreCount); 8613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.scriptBreakPoints = function() { 8653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return script_break_points; 8663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 8673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearStepping = function() { 8703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %ClearStepping(); 8713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 8723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setBreakOnException = function() { 8740d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return %ChangeBreakOnException(Debug.ExceptionBreak.Caught, true); 8753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearBreakOnException = function() { 8780d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return %ChangeBreakOnException(Debug.ExceptionBreak.Caught, false); 8790d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}; 8800d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 8810d5e116f6aee03185f237311a943491bb079a768Kristian MonsenDebug.isBreakOnException = function() { 8820d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return !!%IsBreakOnException(Debug.ExceptionBreak.Caught); 8833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setBreakOnUncaughtException = function() { 8863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, true); 8873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearBreakOnUncaughtException = function() { 8903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, false); 8913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8930d5e116f6aee03185f237311a943491bb079a768Kristian MonsenDebug.isBreakOnUncaughtException = function() { 8940d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return !!%IsBreakOnException(Debug.ExceptionBreak.Uncaught); 8950d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}; 8960d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 8973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.showBreakPoints = function(f, full) { 8983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 8993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var source = full ? this.scriptSource(f) : this.source(f); 9003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var offset = full ? this.sourcePosition(f) : 0; 9013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var locations = this.breakLocations(f); 9023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!locations) return source; 9033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu locations.sort(function(x, y) { return x - y; }); 9043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var result = ""; 9053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var prev_pos = 0; 9063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var pos; 9073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < locations.length; i++) { 9083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu pos = locations[i] - offset; 9093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result += source.slice(prev_pos, pos); 9103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result += "[B" + i + "]"; 9113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu prev_pos = pos; 9123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 9133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu pos = source.length; 9143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result += source.substring(prev_pos, pos); 9153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return result; 9163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Get all the scripts currently loaded. Locating all the scripts is based on 9203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// scanning the heap. 9213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.scripts = function() { 9223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Collect all scripts in the heap. 9233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %DebugGetLoadedScripts(); 924bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch}; 925bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 926bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 927bb769b257e753aafcbd96767abb2abc645eaa20cBen MurdochDebug.debuggerFlags = function() { 928bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch return debugger_flags; 929bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch}; 930bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochDebug.MakeMirror = MakeMirror; 9323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeExecutionState(break_id) { 9343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new ExecutionState(break_id); 9353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 9363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ExecutionState(break_id) { 9383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.break_id = break_id; 9393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.selected_frame = 0; 9403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 9413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.prepareStep = function(opt_action, opt_count) { 9433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var action = Debug.StepAction.StepIn; 9443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(opt_action)) action = %ToNumber(opt_action); 9453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var count = opt_count ? %ToNumber(opt_count) : 1; 9463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %PrepareStep(this.break_id, action, count); 9483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 9493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochExecutionState.prototype.evaluateGlobal = function(source, disable_break, 951b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch opt_additional_context) { 952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return MakeMirror(%DebugEvaluateGlobal(this.break_id, source, 953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Boolean(disable_break), 954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch opt_additional_context)); 9553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.frameCount = function() { 9583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %GetFrameCount(this.break_id); 9593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.threadCount = function() { 9623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %GetThreadCount(this.break_id); 9633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.frame = function(opt_index) { 9663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If no index supplied return the selected frame. 9673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (opt_index == null) opt_index = this.selected_frame; 9683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (opt_index < 0 || opt_index >= this.frameCount()) { 9696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block throw new Error('Illegal frame index.'); 9703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 9713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new FrameMirror(this.break_id, opt_index); 9723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.setSelectedFrame = function(index) { 9753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var i = %ToNumber(index); 9763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (i < 0 || i >= this.frameCount()) throw new Error('Illegal frame index.'); 9773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.selected_frame = i; 9783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.selectedFrame = function() { 9813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.selected_frame; 9823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.debugCommandProcessor = function(opt_is_running) { 9853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new DebugCommandProcessor(this, opt_is_running); 9863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeBreakEvent(exec_state, break_points_hit) { 9903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new BreakEvent(exec_state, break_points_hit); 9913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 9923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction BreakEvent(exec_state, break_points_hit) { 9953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 9963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.break_points_hit_ = break_points_hit; 9973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 9983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.executionState = function() { 10013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_; 10023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.eventType = function() { 10063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.Break; 10073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.func = function() { 10113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).func(); 10123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.sourceLine = function() { 10163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceLine(); 10173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.sourceColumn = function() { 10213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceColumn(); 10223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.sourceLineText = function() { 10263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceLineText(); 10273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.breakPointsHit = function() { 10313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.break_points_hit_; 10323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.toJSONProtocol = function() { 10363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = { seq: next_response_seq++, 10373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu type: "event", 10383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu event: "break", 10393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu body: { invocationText: this.exec_state_.frame(0).invocationText(), 10403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 10413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu }; 10423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add script related information to the event if available. 10443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = this.func().script(); 10453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script) { 10463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLine = this.sourceLine(), 10473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceColumn = this.sourceColumn(), 10483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLineText = this.sourceLineText(), 10493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.script = MakeScriptObject_(script, false); 10503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 10513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add an Array of break points hit if any. 10533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.breakPointsHit()) { 10543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.breakpoints = []; 10553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < this.breakPointsHit().length; i++) { 10563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find the break point number. For break points originating from a 10573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // script break point supply the script break point number. 10583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var breakpoint = this.breakPointsHit()[i]; 10593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = breakpoint.script_break_point(); 10603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var number; 10613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script_break_point) { 10623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu number = script_break_point.number(); 10633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 10643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu number = breakpoint.number(); 10653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 10663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.breakpoints.push(number); 10673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 10683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 10693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return JSON.stringify(ObjectToProtocolObject_(o)); 10703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeExceptionEvent(exec_state, exception, uncaught) { 10743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new ExceptionEvent(exec_state, exception, uncaught); 10753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 10763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ExceptionEvent(exec_state, exception, uncaught) { 10793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 10803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exception_ = exception; 10813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.uncaught_ = uncaught; 10823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 10833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.executionState = function() { 10863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_; 10873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.eventType = function() { 10913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.Exception; 10923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.exception = function() { 10963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exception_; 10973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 10983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.uncaught = function() { 11013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.uncaught_; 11023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 11033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.func = function() { 11063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).func(); 11073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.sourceLine = function() { 11113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceLine(); 11123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.sourceColumn = function() { 11163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceColumn(); 11173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.sourceLineText = function() { 11213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceLineText(); 11223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.toJSONProtocol = function() { 11263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = new ProtocolMessage(); 11273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.event = "exception"; 11283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body = { uncaught: this.uncaught_, 11293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu exception: MakeMirror(this.exception_) 11303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu }; 11313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Exceptions might happen whithout any JavaScript frames. 11333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() > 0) { 11343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLine = this.sourceLine(); 11353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceColumn = this.sourceColumn(); 11363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLineText = this.sourceLineText(); 11373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add script information to the event if available. 11393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = this.func().script(); 11403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script) { 11413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.script = MakeScriptObject_(script, false); 11423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 11433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 11443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLine = -1; 11453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 11463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return o.toJSONProtocol(); 11483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeCompileEvent(exec_state, script, before) { 11523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new CompileEvent(exec_state, script, before); 11533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 11543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction CompileEvent(exec_state, script, before) { 11573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 11583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.script_ = MakeMirror(script); 11593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.before_ = before; 11603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 11613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuCompileEvent.prototype.executionState = function() { 11643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_; 11653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuCompileEvent.prototype.eventType = function() { 11693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.before_) { 11703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.BeforeCompile; 11713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 11723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.AfterCompile; 11733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 11743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuCompileEvent.prototype.script = function() { 11783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_; 11793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuCompileEvent.prototype.toJSONProtocol = function() { 11833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = new ProtocolMessage(); 11843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.running = true; 11853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.before_) { 11863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.event = "beforeCompile"; 11873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 11883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.event = "afterCompile"; 11893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 11903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body = {}; 11913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.script = this.script_; 11923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return o.toJSONProtocol(); 11943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 11953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeNewFunctionEvent(func) { 11983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new NewFunctionEvent(func); 11993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 12003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction NewFunctionEvent(func) { 12033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.func = func; 12043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 12053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuNewFunctionEvent.prototype.eventType = function() { 12083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.NewFunction; 12093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 12103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuNewFunctionEvent.prototype.name = function() { 12133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.func.name; 12143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 12153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuNewFunctionEvent.prototype.setBreakPoint = function(p) { 12183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.setBreakPoint(this.func, p || 0); 12193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 12203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeScriptCollectedEvent(exec_state, id) { 12233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new ScriptCollectedEvent(exec_state, id); 12243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 12253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ScriptCollectedEvent(exec_state, id) { 12283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 12293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.id_ = id; 12303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 12313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptCollectedEvent.prototype.id = function() { 12343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.id_; 12353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 12363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptCollectedEvent.prototype.executionState = function() { 12393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_; 12403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 12413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptCollectedEvent.prototype.toJSONProtocol = function() { 12443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = new ProtocolMessage(); 12453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.running = true; 12463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.event = "scriptCollected"; 12473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body = {}; 12483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.script = { id: this.id() }; 12493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return o.toJSONProtocol(); 12503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 12513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeScriptObject_(script, include_source) { 12543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = { id: script.id(), 12553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu name: script.name(), 12563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu lineOffset: script.lineOffset(), 12573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu columnOffset: script.columnOffset(), 12583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu lineCount: script.lineCount(), 12593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu }; 12603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(script.data())) { 12613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.data = script.data(); 12623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (include_source) { 12643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.source = script.source(); 12653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return o; 12673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction DebugCommandProcessor(exec_state, opt_is_running) { 12713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 12723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.running_ = opt_is_running || false; 12733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.processDebugRequest = function (request) { 12773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.processDebugJSONRequest(request); 12783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 12793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ProtocolMessage(request) { 12823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Update sequence number. 12833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.seq = next_response_seq++; 12843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request) { 12863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If message is based on a request this is a response. Fill the initial 12873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // response from the request. 12883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.type = 'response'; 12893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.request_seq = request.seq; 12903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.command = request.command; 12913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 12923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If message is not based on a request it is a dabugger generated event. 12933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.type = 'event'; 12943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.success = true; 12963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Handler may set this field to control debugger state. 12973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.running = undefined; 12983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 12993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuProtocolMessage.prototype.setOption = function(name, value) { 13023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!this.options_) { 13033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.options_ = {}; 13043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.options_[name] = value; 13063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 13073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuProtocolMessage.prototype.failed = function(message) { 13103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.success = false; 13113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.message = message; 13123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 13133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuProtocolMessage.prototype.toJSONProtocol = function() { 13163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Encode the protocol header. 13173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var json = {}; 13183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.seq= this.seq; 13193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.request_seq) { 13203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.request_seq = this.request_seq; 13213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.type = this.type; 13233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.event) { 13243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.event = this.event; 13253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.command) { 13273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.command = this.command; 13283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.success) { 13303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.success = this.success; 13313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 13323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.success = false; 13333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.body) { 13353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Encode the body part. 13363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var bodyJson; 13373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var serializer = MakeMirrorSerializer(true, this.options_); 13383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.body instanceof Mirror) { 13393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson = serializer.serializeValue(this.body); 13403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (this.body instanceof Array) { 13413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson = []; 13423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < this.body.length; i++) { 13433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.body[i] instanceof Mirror) { 13443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson.push(serializer.serializeValue(this.body[i])); 13453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 13463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson.push(ObjectToProtocolObject_(this.body[i], serializer)); 13473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 13503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson = ObjectToProtocolObject_(this.body, serializer); 13513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.body = bodyJson; 13533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.refs = serializer.serializeReferencedObjects(); 13543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.message) { 13563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.message = this.message; 13573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.running = this.running; 13593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return JSON.stringify(json); 13603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 13613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.createResponse = function(request) { 13643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new ProtocolMessage(request); 13653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 13663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebugCommandProcessor.prototype.processDebugJSONRequest = function( 13693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch json_request) { 13703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var request; // Current request. 13713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var response; // Generated response. 13723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 13733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 13743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Convert the JSON string to an object. 1375257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch request = JSON.parse(json_request); 13763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create an initial response. 13783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response = this.createResponse(request); 13793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.type) { 13813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Type not specified'); 13823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.type != 'request') { 13853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error("Illegal type '" + request.type + "' in request"); 13863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.command) { 13893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Command not specified'); 13903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1392402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu if (request.arguments) { 1393402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu var args = request.arguments; 1394402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu // TODO(yurys): remove request.arguments.compactFormat check once 1395402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu // ChromeDevTools are switched to 'inlineRefs' 1396402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu if (args.inlineRefs || args.compactFormat) { 1397402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu response.setOption('inlineRefs', true); 1398402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu } 1399402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu if (!IS_UNDEFINED(args.maxStringLength)) { 1400402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu response.setOption('maxStringLength', args.maxStringLength); 1401402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu } 14023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 14043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.command == 'continue') { 14053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.continueRequest_(request, response); 14063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'break') { 14073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.breakRequest_(request, response); 14083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'setbreakpoint') { 14093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.setBreakPointRequest_(request, response); 14103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'changebreakpoint') { 14113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.changeBreakPointRequest_(request, response); 14123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'clearbreakpoint') { 14133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.clearBreakPointRequest_(request, response); 14143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'clearbreakpointgroup') { 14153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.clearBreakPointGroupRequest_(request, response); 1416086aeeaae12517475c22695a200be45495516549Ben Murdoch } else if (request.command == 'disconnect') { 1417086aeeaae12517475c22695a200be45495516549Ben Murdoch this.disconnectRequest_(request, response); 1418086aeeaae12517475c22695a200be45495516549Ben Murdoch } else if (request.command == 'setexceptionbreak') { 1419086aeeaae12517475c22695a200be45495516549Ben Murdoch this.setExceptionBreakRequest_(request, response); 142025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen } else if (request.command == 'listbreakpoints') { 142125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen this.listBreakpointsRequest_(request, response); 14223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'backtrace') { 14233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.backtraceRequest_(request, response); 14243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'frame') { 14253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.frameRequest_(request, response); 14263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'scopes') { 14273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.scopesRequest_(request, response); 14283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'scope') { 14293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.scopeRequest_(request, response); 14303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'evaluate') { 14313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.evaluateRequest_(request, response); 1432e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'getobj') { 1433e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.getobjRequest_(request, response); 14343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'lookup') { 14353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.lookupRequest_(request, response); 14363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'references') { 14373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.referencesRequest_(request, response); 14383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'source') { 14393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.sourceRequest_(request, response); 14403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'scripts') { 14413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.scriptsRequest_(request, response); 14423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'threads') { 14433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.threadsRequest_(request, response); 14443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'suspend') { 14453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.suspendRequest_(request, response); 14463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'version') { 14473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.versionRequest_(request, response); 14483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'profile') { 1449bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch this.profileRequest_(request, response); 14506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } else if (request.command == 'changelive') { 1451bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch this.changeLiveRequest_(request, response); 1452bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } else if (request.command == 'flags') { 1453bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch this.debuggerFlagsRequest_(request, response); 1454086aeeaae12517475c22695a200be45495516549Ben Murdoch } else if (request.command == 'v8flags') { 1455086aeeaae12517475c22695a200be45495516549Ben Murdoch this.v8FlagsRequest_(request, response); 1456086aeeaae12517475c22695a200be45495516549Ben Murdoch 1457086aeeaae12517475c22695a200be45495516549Ben Murdoch // GC tools: 1458086aeeaae12517475c22695a200be45495516549Ben Murdoch } else if (request.command == 'gc') { 1459086aeeaae12517475c22695a200be45495516549Ben Murdoch this.gcRequest_(request, response); 1460086aeeaae12517475c22695a200be45495516549Ben Murdoch 1461e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // LiveObjectList tools: 1462e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-capture') { 1463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolCaptureRequest_(request, response); 1464e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-delete') { 1465e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolDeleteRequest_(request, response); 1466e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-diff') { 1467e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolDiffRequest_(request, response); 1468e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-getid') { 1469e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolGetIdRequest_(request, response); 1470e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-info') { 1471e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolInfoRequest_(request, response); 1472e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-reset') { 1473e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolResetRequest_(request, response); 1474e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-retainers') { 1475e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolRetainersRequest_(request, response); 1476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-path') { 1477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolPathRequest_(request, response); 1478e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-print') { 1479e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolPrintRequest_(request, response); 1480e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (lol_is_enabled && request.command == 'lol-stats') { 1481e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this.lolStatsRequest_(request, response); 1482e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 14833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 14843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Unknown command "' + request.command + '" in request'); 14853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch (e) { 14873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If there is no response object created one (without command). 14883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!response) { 14893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response = this.createResponse(); 14903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.success = false; 14923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.message = %ToString(e); 14933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 14953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Return the response as a JSON encoded string. 14963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 14973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(response.running)) { 14983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Response controls running state. 14993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.running_ = response.running; 15003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block response.running = this.running_; 15023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.toJSONProtocol(); 15033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch (e) { 15043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Failed to generate response - return generic error. 15053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return '{"seq":' + response.seq + ',' + 15063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '"request_seq":' + request.seq + ',' + 15073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '"type":"response",' + 15083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '"success":false,' + 15093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '"message":"Internal error: ' + %ToString(e) + '"}'; 15103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch (e) { 15123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Failed in one of the catch blocks above - most generic error. 15133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return '{"seq":0,"type":"response","success":false,"message":"Internal error"}'; 15143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 15163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.continueRequest_ = function(request, response) { 15193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for arguments for continue. 15203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 15213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var count = 1; 15223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var action = Debug.StepAction.StepIn; 15233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 15253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var stepaction = request.arguments.stepaction; 15263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var stepcount = request.arguments.stepcount; 15273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the stepcount argument if any. 15293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (stepcount) { 15303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu count = %ToNumber(stepcount); 15313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (count < 0) { 15323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid stepcount argument "' + stepcount + '".'); 15333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the stepaction argument. 15373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (stepaction) { 15383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (stepaction == 'in') { 15393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu action = Debug.StepAction.StepIn; 15403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (stepaction == 'min') { 15413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu action = Debug.StepAction.StepMin; 15423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (stepaction == 'next') { 15433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu action = Debug.StepAction.StepNext; 15443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (stepaction == 'out') { 15453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu action = Debug.StepAction.StepOut; 15463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 15473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid stepaction argument "' + stepaction + '".'); 15483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Set up the VM for stepping. 15523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_.prepareStep(action, count); 15533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // VM should be running after executing this request. 15563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.running = true; 15573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 15583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.breakRequest_ = function(request, response) { 15613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Ignore as break command does not do anything when broken. 15623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 15633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.setBreakPointRequest_ = 15663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu function(request, response) { 15673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal request. 15683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 15693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing arguments'); 15703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 15713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 15743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var type = request.arguments.type; 15753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var target = request.arguments.target; 15763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var line = request.arguments.line; 15773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var column = request.arguments.column; 15783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var enabled = IS_UNDEFINED(request.arguments.enabled) ? 15793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu true : request.arguments.enabled; 15803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var condition = request.arguments.condition; 15813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var ignoreCount = request.arguments.ignoreCount; 15823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var groupId = request.arguments.groupId; 15833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 15853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!type || IS_UNDEFINED(target)) { 15863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing argument "type" or "target"'); 15873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 15883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 158969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 15903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Either function or script break point. 15913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point_number; 15923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (type == 'function') { 15933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Handle function break point. 15943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_STRING(target)) { 15953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Argument "target" is not a string value'); 15963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 15973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var f; 15993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 16003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find the function through a global evaluate. 16013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu f = this.exec_state_.evaluateGlobal(target).value(); 16023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch (e) { 16033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Error: "' + %ToString(e) + 16043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '" evaluating "' + target + '"'); 16053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 16063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) { 16083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('"' + target + '" does not evaluate to a function'); 16093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 16103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set function break point. 16133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point_number = Debug.setBreakPoint(f, line, column, condition); 16143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (type == 'handle') { 16153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find the object pointed by the specified handle. 16163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var handle = parseInt(target, 10); 16173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var mirror = LookupMirror(handle); 16183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!mirror) { 16193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Object #' + handle + '# not found'); 16203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!mirror.isFunction()) { 16223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Object #' + handle + '# is not a function'); 16233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set function break point. 16263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point_number = Debug.setBreakPoint(mirror.value(), 16273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu line, column, condition); 16283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (type == 'script') { 16293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // set script break point. 16303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point_number = 16313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.setScriptBreakPointByName(target, line, column, condition, 16323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu groupId); 163369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } else if (type == 'scriptId') { 16343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point_number = 16353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.setScriptBreakPointById(target, line, column, condition, groupId); 163669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } else if (type == 'scriptRegExp') { 16373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch break_point_number = 16383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Debug.setScriptBreakPointByRegExp(target, line, column, condition, 16393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch groupId); 16403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 16413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch response.failed('Illegal type "' + type + '"'); 16423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return; 16433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set additional break point properties. 16463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = Debug.findBreakPoint(break_point_number); 16473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (ignoreCount) { 16483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.changeBreakPointIgnoreCount(break_point_number, ignoreCount); 16493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!enabled) { 16513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.disableBreakPoint(break_point_number); 16523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add the break point number to the response. 16553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { type: type, 16563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch breakpoint: break_point_number }; 16573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add break point information to the response. 16593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_point instanceof ScriptBreakPoint) { 16603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_point.type() == Debug.ScriptBreakPointType.ScriptId) { 16613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.type = 'scriptId'; 16623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.script_id = break_point.script_id(); 16633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptName) { 16643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.type = 'scriptName'; 16653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.script_name = break_point.script_name(); 16663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptRegExp) { 16673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch response.body.type = 'scriptRegExp'; 16683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch response.body.script_regexp = break_point.script_regexp_object().source; 16693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 16703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch throw new Error("Internal error: Unexpected breakpoint type: " + 16713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break_point.type()); 16723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.line = break_point.line(); 16743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.column = break_point.column(); 16758defd9ff6930b4e24729971a61cf7469daf119beSteve Block response.body.actual_locations = break_point.actual_locations(); 16763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 16773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.type = 'function'; 16788defd9ff6930b4e24729971a61cf7469daf119beSteve Block response.body.actual_locations = [break_point.actual_location]; 16793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 16813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebugCommandProcessor.prototype.changeBreakPointRequest_ = function( 16843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch request, response) { 16853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal request. 16863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 16873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing arguments'); 16883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 16893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 16923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = %ToNumber(request.arguments.breakpoint); 16933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var enabled = request.arguments.enabled; 16943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var condition = request.arguments.condition; 16953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var ignoreCount = request.arguments.ignoreCount; 16963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 16983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!break_point) { 16993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing argument "breakpoint"'); 17003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 17013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Change enabled state if supplied. 17043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(enabled)) { 17053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (enabled) { 17063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.enableBreakPoint(break_point); 17073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 17083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.disableBreakPoint(break_point); 17093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Change condition if supplied 17133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(condition)) { 17143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.changeBreakPointCondition(break_point, condition); 17153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Change ignore count if supplied 17183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(ignoreCount)) { 17193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.changeBreakPointIgnoreCount(break_point, ignoreCount); 17203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 17223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebugCommandProcessor.prototype.clearBreakPointGroupRequest_ = function( 17253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch request, response) { 17263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal request. 17273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 17283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing arguments'); 17293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 17303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 17333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var group_id = request.arguments.groupId; 17343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 17363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!group_id) { 17373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing argument "groupId"'); 17383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 17393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var cleared_break_points = []; 17423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var new_script_break_points = []; 17433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < script_break_points.length; i++) { 17443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var next_break_point = script_break_points[i]; 17453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (next_break_point.groupId() == group_id) { 17463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu cleared_break_points.push(next_break_point.number()); 17473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu next_break_point.clear(); 17483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 17493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu new_script_break_points.push(next_break_point); 17503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_points = new_script_break_points; 17533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add the cleared break point numbers to the response. 17553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { breakpoints: cleared_break_points }; 17563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 17573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17593ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebugCommandProcessor.prototype.clearBreakPointRequest_ = function( 17603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch request, response) { 17613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal request. 17623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 17633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing arguments'); 17643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 17653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 17683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = %ToNumber(request.arguments.breakpoint); 17693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 17713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!break_point) { 17723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing argument "breakpoint"'); 17733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 17743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Clear break point. 17773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.clearBreakPoint(break_point); 17783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add the cleared break point number to the response. 17803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch response.body = { breakpoint: break_point }; 17813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 17823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1783bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 17843ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebugCommandProcessor.prototype.listBreakpointsRequest_ = function( 17853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch request, response) { 178625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen var array = []; 178725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen for (var i = 0; i < script_break_points.length; i++) { 178825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen var break_point = script_break_points[i]; 178925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 179025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen var description = { 179125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen number: break_point.number(), 179225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen line: break_point.line(), 179325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen column: break_point.column(), 179425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen groupId: break_point.groupId(), 179525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen hit_count: break_point.hit_count(), 179625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen active: break_point.active(), 179725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen condition: break_point.condition(), 17988defd9ff6930b4e24729971a61cf7469daf119beSteve Block ignoreCount: break_point.ignoreCount(), 17998defd9ff6930b4e24729971a61cf7469daf119beSteve Block actual_locations: break_point.actual_locations() 18003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 1801bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 180225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen if (break_point.type() == Debug.ScriptBreakPointType.ScriptId) { 180325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen description.type = 'scriptId'; 180425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen description.script_id = break_point.script_id(); 18053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptName) { 180625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen description.type = 'scriptName'; 180725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen description.script_name = break_point.script_name(); 18083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptRegExp) { 18093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch description.type = 'scriptRegExp'; 18103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch description.script_regexp = break_point.script_regexp_object().source; 18113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 18123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch throw new Error("Internal error: Unexpected breakpoint type: " + 18133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break_point.type()); 181425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen } 181525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen array.push(description); 181625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen } 1817bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 1818086aeeaae12517475c22695a200be45495516549Ben Murdoch response.body = { 1819086aeeaae12517475c22695a200be45495516549Ben Murdoch breakpoints: array, 1820086aeeaae12517475c22695a200be45495516549Ben Murdoch breakOnExceptions: Debug.isBreakOnException(), 1821086aeeaae12517475c22695a200be45495516549Ben Murdoch breakOnUncaughtExceptions: Debug.isBreakOnUncaughtException() 18223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 18233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 1824086aeeaae12517475c22695a200be45495516549Ben Murdoch 1825086aeeaae12517475c22695a200be45495516549Ben Murdoch 1826086aeeaae12517475c22695a200be45495516549Ben MurdochDebugCommandProcessor.prototype.disconnectRequest_ = 1827086aeeaae12517475c22695a200be45495516549Ben Murdoch function(request, response) { 1828086aeeaae12517475c22695a200be45495516549Ben Murdoch Debug.disableAllBreakPoints(); 1829086aeeaae12517475c22695a200be45495516549Ben Murdoch this.continueRequest_(request, response); 18303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 1831086aeeaae12517475c22695a200be45495516549Ben Murdoch 1832086aeeaae12517475c22695a200be45495516549Ben Murdoch 1833086aeeaae12517475c22695a200be45495516549Ben MurdochDebugCommandProcessor.prototype.setExceptionBreakRequest_ = 1834086aeeaae12517475c22695a200be45495516549Ben Murdoch function(request, response) { 1835086aeeaae12517475c22695a200be45495516549Ben Murdoch // Check for legal request. 1836086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!request.arguments) { 1837086aeeaae12517475c22695a200be45495516549Ben Murdoch response.failed('Missing arguments'); 1838086aeeaae12517475c22695a200be45495516549Ben Murdoch return; 1839086aeeaae12517475c22695a200be45495516549Ben Murdoch } 1840086aeeaae12517475c22695a200be45495516549Ben Murdoch 1841086aeeaae12517475c22695a200be45495516549Ben Murdoch // Pull out and check the 'type' argument: 1842086aeeaae12517475c22695a200be45495516549Ben Murdoch var type = request.arguments.type; 1843086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!type) { 1844086aeeaae12517475c22695a200be45495516549Ben Murdoch response.failed('Missing argument "type"'); 1845086aeeaae12517475c22695a200be45495516549Ben Murdoch return; 1846086aeeaae12517475c22695a200be45495516549Ben Murdoch } 1847086aeeaae12517475c22695a200be45495516549Ben Murdoch 1848086aeeaae12517475c22695a200be45495516549Ben Murdoch // Initialize the default value of enable: 1849086aeeaae12517475c22695a200be45495516549Ben Murdoch var enabled; 1850086aeeaae12517475c22695a200be45495516549Ben Murdoch if (type == 'all') { 1851086aeeaae12517475c22695a200be45495516549Ben Murdoch enabled = !Debug.isBreakOnException(); 1852086aeeaae12517475c22695a200be45495516549Ben Murdoch } else if (type == 'uncaught') { 1853086aeeaae12517475c22695a200be45495516549Ben Murdoch enabled = !Debug.isBreakOnUncaughtException(); 185469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 1855086aeeaae12517475c22695a200be45495516549Ben Murdoch 1856086aeeaae12517475c22695a200be45495516549Ben Murdoch // Pull out and check the 'enabled' argument if present: 1857086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!IS_UNDEFINED(request.arguments.enabled)) { 1858086aeeaae12517475c22695a200be45495516549Ben Murdoch enabled = request.arguments.enabled; 1859086aeeaae12517475c22695a200be45495516549Ben Murdoch if ((enabled != true) && (enabled != false)) { 1860086aeeaae12517475c22695a200be45495516549Ben Murdoch response.failed('Illegal value for "enabled":"' + enabled + '"'); 1861086aeeaae12517475c22695a200be45495516549Ben Murdoch } 1862086aeeaae12517475c22695a200be45495516549Ben Murdoch } 1863086aeeaae12517475c22695a200be45495516549Ben Murdoch 1864086aeeaae12517475c22695a200be45495516549Ben Murdoch // Now set the exception break state: 1865086aeeaae12517475c22695a200be45495516549Ben Murdoch if (type == 'all') { 1866086aeeaae12517475c22695a200be45495516549Ben Murdoch %ChangeBreakOnException(Debug.ExceptionBreak.Caught, enabled); 1867086aeeaae12517475c22695a200be45495516549Ben Murdoch } else if (type == 'uncaught') { 1868086aeeaae12517475c22695a200be45495516549Ben Murdoch %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, enabled); 1869086aeeaae12517475c22695a200be45495516549Ben Murdoch } else { 1870086aeeaae12517475c22695a200be45495516549Ben Murdoch response.failed('Unknown "type":"' + type + '"'); 1871086aeeaae12517475c22695a200be45495516549Ben Murdoch } 1872086aeeaae12517475c22695a200be45495516549Ben Murdoch 1873086aeeaae12517475c22695a200be45495516549Ben Murdoch // Add the cleared break point number to the response. 1874086aeeaae12517475c22695a200be45495516549Ben Murdoch response.body = { 'type': type, 'enabled': enabled }; 18753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 187625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 18773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18783ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebugCommandProcessor.prototype.backtraceRequest_ = function( 18793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch request, response) { 18803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the number of frames. 18813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var total_frames = this.exec_state_.frameCount(); 18823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create simple response if there are no frames. 18843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (total_frames == 0) { 18853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 18863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu totalFrames: total_frames 18873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 18883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 18893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Default frame range to include in backtrace. 18923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch var from_index = 0; 18933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var to_index = kDefaultBacktraceLength; 18943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the range from the arguments. 18963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 18973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments.fromFrame) { 18983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu from_index = request.arguments.fromFrame; 18993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments.toFrame) { 19013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu to_index = request.arguments.toFrame; 19023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments.bottom) { 19043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var tmp_index = total_frames - from_index; 19053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch from_index = total_frames - to_index; 19063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu to_index = tmp_index; 19073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (from_index < 0 || to_index < 0) { 19093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame number'); 19103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Adjust the index. 19143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu to_index = Math.min(total_frames, to_index); 19153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (to_index <= from_index) { 19173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var error = 'Invalid frame range'; 19183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed(error); 19193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create the response body. 19223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frames = []; 19233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = from_index; i < to_index; i++) { 19243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu frames.push(this.exec_state_.frame(i)); 19253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 19273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu fromFrame: from_index, 19283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu toFrame: to_index, 19293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu totalFrames: total_frames, 19303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu frames: frames 19313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 19323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 19333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.frameRequest_ = function(request, response) { 19363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no source. 19373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 19383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No frames'); 19393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // With no arguments just keep the selected frame. 19423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 19433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var index = request.arguments.number; 19443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (index < 0 || this.exec_state_.frameCount() <= index) { 19453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame number'); 19463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_.setSelectedFrame(request.arguments.number); 19493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = this.exec_state_.frame(); 19513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 19523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.frameForScopeRequest_ = function(request) { 19553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Get the frame for which the scope or scopes are requested. 19563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // With no frameNumber argument use the currently selected frame. 19573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments && !IS_UNDEFINED(request.arguments.frameNumber)) { 19583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu frame_index = request.arguments.frameNumber; 19593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (frame_index < 0 || this.exec_state_.frameCount() <= frame_index) { 19603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame number'); 19613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(frame_index); 19633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 19643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(); 19653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 19673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.scopesRequest_ = function(request, response) { 19703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no scopes. 19713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 19723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No scopes'); 19733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the frame for which the scopes are requested. 19763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame = this.frameForScopeRequest_(request); 19773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Fill all scopes for this frame. 19793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var total_scopes = frame.scopeCount(); 19803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scopes = []; 19813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < total_scopes; i++) { 19823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu scopes.push(frame.scope(i)); 19833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 19853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu fromScope: 0, 19863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu toScope: total_scopes, 19873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu totalScopes: total_scopes, 19883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu scopes: scopes 19893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 19903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 19913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.scopeRequest_ = function(request, response) { 19943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no scopes. 19953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 19963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No scopes'); 19973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the frame for which the scope is requested. 20003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame = this.frameForScopeRequest_(request); 20013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // With no scope argument just return top scope. 20033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scope_index = 0; 20043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments && !IS_UNDEFINED(request.arguments.number)) { 20053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu scope_index = %ToNumber(request.arguments.number); 20063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (scope_index < 0 || frame.scopeCount() <= scope_index) { 20073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid scope number'); 20083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = frame.scope(scope_index); 20123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 20133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.evaluateRequest_ = function(request, response) { 20163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 20173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Missing arguments'); 20183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 20213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var expression = request.arguments.expression; 20223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame = request.arguments.frame; 20233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var global = request.arguments.global; 20243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var disable_break = request.arguments.disable_break; 2025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch var additional_context = request.arguments.additional_context; 20263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // The expression argument could be an integer so we convert it to a 20283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // string. 20293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 20303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu expression = String(expression); 20313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch(e) { 20323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Failed to convert expression argument to string'); 20333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 20363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(frame) && global) { 20373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Arguments "frame" and "global" are exclusive'); 20383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 203969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch var additional_context_object; 2041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (additional_context) { 2042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch additional_context_object = {}; 2043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (var i = 0; i < additional_context.length; i++) { 2044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch var mapping = additional_context[i]; 2045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!IS_STRING(mapping.name) || !IS_NUMBER(mapping.handle)) { 204669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return response.failed("Context element #" + i + 2047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch " must contain name:string and handle:number"); 204869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 2049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch var context_value_mirror = LookupMirror(mapping.handle); 2050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!context_value_mirror) { 2051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return response.failed("Context object '" + mapping.name + 2052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch "' #" + mapping.handle + "# not found"); 2053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 205469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch additional_context_object[mapping.name] = context_value_mirror.value(); 2055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2056b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 20573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Global evaluate. 20593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (global) { 20603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Evaluate in the global context. 2061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch response.body = this.exec_state_.evaluateGlobal( 2062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch expression, Boolean(disable_break), additional_context_object); 20633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 20643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Default value for disable_break is true. 20673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(disable_break)) { 20683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu disable_break = true; 20693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no evaluate in frame. 20723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 20733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No frames'); 20743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check whether a frame was specified. 20773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(frame)) { 20783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame_number = %ToNumber(frame); 20793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (frame_number < 0 || frame_number >= this.exec_state_.frameCount()) { 20803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame "' + frame + '"'); 20813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Evaluate in the specified frame. 20833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = this.exec_state_.frame(frame_number).evaluate( 2084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch expression, Boolean(disable_break), additional_context_object); 20853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 20863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 20873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Evaluate in the selected frame. 20883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = this.exec_state_.frame().evaluate( 2089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch expression, Boolean(disable_break), additional_context_object); 20903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 20913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 20933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2095e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.getobjRequest_ = function(request, response) { 2096e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (!request.arguments) { 2097e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return response.failed('Missing arguments'); 2098e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2099e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2100e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Pull out arguments. 2101e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var obj_id = request.arguments.obj_id; 2102e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2103e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Check for legal arguments. 2104e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (IS_UNDEFINED(obj_id)) { 2105e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return response.failed('Argument "obj_id" missing'); 2106e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2107e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2108e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Dump the object. 2109e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = MakeMirror(%GetLOLObj(obj_id)); 2110e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2111e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2112e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 21133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.lookupRequest_ = function(request, response) { 21143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 21153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Missing arguments'); 21163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 21193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var handles = request.arguments.handles; 21203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 21223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(handles)) { 21233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Argument "handles" missing'); 21243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set 'includeSource' option for script lookup. 21273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(request.arguments.includeSource)) { 21283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu includeSource = %ToBoolean(request.arguments.includeSource); 21293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.setOption('includeSource', includeSource); 21303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Lookup handles. 21333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var mirrors = {}; 21343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < handles.length; i++) { 21353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var handle = handles[i]; 21363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var mirror = LookupMirror(handle); 21373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!mirror) { 21383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Object #' + handle + '# not found'); 21393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu mirrors[handle] = mirror; 21413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = mirrors; 21433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 21443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.referencesRequest_ = 21473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu function(request, response) { 21483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 21493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Missing arguments'); 21503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 21533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var type = request.arguments.type; 21543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var handle = request.arguments.handle; 21553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 21573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(type)) { 21583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Argument "type" missing'); 21593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(handle)) { 21613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Argument "handle" missing'); 21623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (type != 'referencedBy' && type != 'constructedBy') { 21643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid type "' + type + '"'); 21653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Lookup handle and return objects with references the object. 21683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var mirror = LookupMirror(handle); 21693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (mirror) { 21703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (type == 'referencedBy') { 21713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = mirror.referencedBy(); 21723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 21733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = mirror.constructedBy(); 21743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 21763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Object #' + handle + '# not found'); 21773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 21793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.sourceRequest_ = function(request, response) { 21823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no source. 21833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 21843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No source'); 21853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var from_line; 21883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var to_line; 21893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame = this.exec_state_.frame(); 21903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 21913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 21923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu from_line = request.arguments.fromLine; 21933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu to_line = request.arguments.toLine; 21943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(request.arguments.frame)) { 21963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame_number = %ToNumber(request.arguments.frame); 21973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (frame_number < 0 || frame_number >= this.exec_state_.frameCount()) { 21983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame "' + frame + '"'); 21993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu frame = this.exec_state_.frame(frame_number); 22013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the script selected. 22053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = frame.func().script(); 22063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!script) { 22073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No source'); 22083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the source slice and fill it into the response. 22113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var slice = script.sourceSlice(from_line, to_line); 22123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!slice) { 22133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid line interval'); 22143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = {}; 22163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.source = slice.sourceText(); 22173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.fromLine = slice.from_line; 22183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.toLine = slice.to_line; 22193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.fromPosition = slice.from_position; 22203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.toPosition = slice.to_position; 22213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.totalLines = script.lineCount(); 22223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 22233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.scriptsRequest_ = function(request, response) { 22263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var types = ScriptTypeFlag(Debug.ScriptType.Normal); 22273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var includeSource = false; 22283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var idsToInclude = null; 22293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 22303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 22313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(request.arguments.types)) { 22323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu types = %ToNumber(request.arguments.types); 22333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (isNaN(types) || types < 0) { 22343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return response.failed('Invalid types "' + 22353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch request.arguments.types + '"'); 22363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(request.arguments.includeSource)) { 22403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu includeSource = %ToBoolean(request.arguments.includeSource); 22413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.setOption('includeSource', includeSource); 22423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_ARRAY(request.arguments.ids)) { 22453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu idsToInclude = {}; 22463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var ids = request.arguments.ids; 22473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < ids.length; i++) { 22483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu idsToInclude[ids[i]] = true; 22493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2251086aeeaae12517475c22695a200be45495516549Ben Murdoch 2252086aeeaae12517475c22695a200be45495516549Ben Murdoch var filterStr = null; 2253086aeeaae12517475c22695a200be45495516549Ben Murdoch var filterNum = null; 2254086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!IS_UNDEFINED(request.arguments.filter)) { 2255086aeeaae12517475c22695a200be45495516549Ben Murdoch var num = %ToNumber(request.arguments.filter); 2256086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!isNaN(num)) { 2257086aeeaae12517475c22695a200be45495516549Ben Murdoch filterNum = num; 2258086aeeaae12517475c22695a200be45495516549Ben Murdoch } 2259086aeeaae12517475c22695a200be45495516549Ben Murdoch filterStr = request.arguments.filter; 2260086aeeaae12517475c22695a200be45495516549Ben Murdoch } 22613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Collect all scripts in the heap. 22643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scripts = %DebugGetLoadedScripts(); 22653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = []; 22673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < scripts.length; i++) { 22693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (idsToInclude && !idsToInclude[scripts[i].id]) { 22703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu continue; 22713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2272086aeeaae12517475c22695a200be45495516549Ben Murdoch if (filterStr || filterNum) { 2273086aeeaae12517475c22695a200be45495516549Ben Murdoch var script = scripts[i]; 2274086aeeaae12517475c22695a200be45495516549Ben Murdoch var found = false; 2275086aeeaae12517475c22695a200be45495516549Ben Murdoch if (filterNum && !found) { 2276086aeeaae12517475c22695a200be45495516549Ben Murdoch if (script.id && script.id === filterNum) { 2277086aeeaae12517475c22695a200be45495516549Ben Murdoch found = true; 2278086aeeaae12517475c22695a200be45495516549Ben Murdoch } 2279086aeeaae12517475c22695a200be45495516549Ben Murdoch } 2280086aeeaae12517475c22695a200be45495516549Ben Murdoch if (filterStr && !found) { 2281086aeeaae12517475c22695a200be45495516549Ben Murdoch if (script.name && script.name.indexOf(filterStr) >= 0) { 2282086aeeaae12517475c22695a200be45495516549Ben Murdoch found = true; 2283086aeeaae12517475c22695a200be45495516549Ben Murdoch } 2284086aeeaae12517475c22695a200be45495516549Ben Murdoch } 2285086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!found) continue; 2286086aeeaae12517475c22695a200be45495516549Ben Murdoch } 22873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (types & ScriptTypeFlag(scripts[i].type)) { 22883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.push(MakeMirror(scripts[i])); 22893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 22923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.threadsRequest_ = function(request, response) { 22953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the number of threads. 22963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var total_threads = this.exec_state_.threadCount(); 22973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get information for all threads. 22993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var threads = []; 23003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < total_threads; i++) { 23013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var details = %GetThreadDetails(this.exec_state_.break_id, i); 23023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var thread_info = { current: details[0], 23033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu id: details[1] 23043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 23053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu threads.push(thread_info); 23063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 23073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create the response body. 23093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 23103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu totalThreads: total_threads, 23113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu threads: threads 23123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 23133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 23143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.suspendRequest_ = function(request, response) { 23173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.running = false; 23183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 23193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.versionRequest_ = function(request, response) { 23223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 23233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu V8Version: %GetV8Version() 23243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 23253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 23263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.profileRequest_ = function(request, response) { 23293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments.command == 'resume') { 23303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch %ProfilerResume(); 23313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.arguments.command == 'pause') { 23323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch %ProfilerPause(); 23333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 23343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Unknown command'); 23353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 23363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = {}; 23373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 23383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 23403ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDebugCommandProcessor.prototype.changeLiveRequest_ = function( 23413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch request, response) { 23426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!Debug.LiveEdit) { 23436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return response.failed('LiveEdit feature is not supported'); 23446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 23456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!request.arguments) { 23466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return response.failed('Missing arguments'); 23476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 23486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var script_id = request.arguments.script_id; 23498defd9ff6930b4e24729971a61cf7469daf119beSteve Block var preview_only = !!request.arguments.preview_only; 2350f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 23516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var scripts = %DebugGetLoadedScripts(); 23526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 23536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var the_script = null; 23546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (var i = 0; i < scripts.length; i++) { 23556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (scripts[i].id == script_id) { 23566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block the_script = scripts[i]; 23576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 23586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 23596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!the_script) { 23606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block response.failed('Script not found'); 23616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return; 23626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 23636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 23646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var change_log = new Array(); 2365bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 23666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!IS_STRING(request.arguments.new_source)) { 23676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block throw "new_source argument expected"; 23686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 23696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 23706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var new_source = request.arguments.new_source; 2371f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 23728defd9ff6930b4e24729971a61cf7469daf119beSteve Block var result_description = Debug.LiveEdit.SetScriptSource(the_script, 23738defd9ff6930b4e24729971a61cf7469daf119beSteve Block new_source, preview_only, change_log); 23748defd9ff6930b4e24729971a61cf7469daf119beSteve Block response.body = {change_log: change_log, result: result_description}; 2375f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 2376bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch if (!preview_only && !this.running_ && result_description.stack_modified) { 2377bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch response.body.stepin_recommended = true; 2378bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 23796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 23806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 23816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2382bb769b257e753aafcbd96767abb2abc645eaa20cBen MurdochDebugCommandProcessor.prototype.debuggerFlagsRequest_ = function(request, 2383bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch response) { 2384bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch // Check for legal request. 2385bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch if (!request.arguments) { 2386bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch response.failed('Missing arguments'); 2387bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch return; 2388bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 2389bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 2390bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch // Pull out arguments. 2391bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch var flags = request.arguments.flags; 2392bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 2393bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch response.body = { flags: [] }; 2394bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch if (!IS_UNDEFINED(flags)) { 2395bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch for (var i = 0; i < flags.length; i++) { 2396bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch var name = flags[i].name; 2397bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch var debugger_flag = debugger_flags[name]; 2398bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch if (!debugger_flag) { 2399bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch continue; 2400bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 2401bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch if ('value' in flags[i]) { 2402bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch debugger_flag.setValue(flags[i].value); 2403bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 2404bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch response.body.flags.push({ name: name, value: debugger_flag.getValue() }); 2405bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 2406bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } else { 2407bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch for (var name in debugger_flags) { 2408bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch var value = debugger_flags[name].getValue(); 2409bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch response.body.flags.push({ name: name, value: value }); 2410bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 2411bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch } 24123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 2413bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 2414bb769b257e753aafcbd96767abb2abc645eaa20cBen Murdoch 2415086aeeaae12517475c22695a200be45495516549Ben MurdochDebugCommandProcessor.prototype.v8FlagsRequest_ = function(request, response) { 2416086aeeaae12517475c22695a200be45495516549Ben Murdoch var flags = request.arguments.flags; 2417086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!flags) flags = ''; 2418086aeeaae12517475c22695a200be45495516549Ben Murdoch %SetFlags(flags); 2419086aeeaae12517475c22695a200be45495516549Ben Murdoch}; 2420086aeeaae12517475c22695a200be45495516549Ben Murdoch 2421086aeeaae12517475c22695a200be45495516549Ben Murdoch 2422086aeeaae12517475c22695a200be45495516549Ben MurdochDebugCommandProcessor.prototype.gcRequest_ = function(request, response) { 2423086aeeaae12517475c22695a200be45495516549Ben Murdoch var type = request.arguments.type; 2424086aeeaae12517475c22695a200be45495516549Ben Murdoch if (!type) type = 'all'; 2425086aeeaae12517475c22695a200be45495516549Ben Murdoch 2426086aeeaae12517475c22695a200be45495516549Ben Murdoch var before = %GetHeapUsage(); 2427086aeeaae12517475c22695a200be45495516549Ben Murdoch %CollectGarbage(type); 2428086aeeaae12517475c22695a200be45495516549Ben Murdoch var after = %GetHeapUsage(); 2429086aeeaae12517475c22695a200be45495516549Ben Murdoch 2430086aeeaae12517475c22695a200be45495516549Ben Murdoch response.body = { "before": before, "after": after }; 2431086aeeaae12517475c22695a200be45495516549Ben Murdoch}; 2432086aeeaae12517475c22695a200be45495516549Ben Murdoch 2433086aeeaae12517475c22695a200be45495516549Ben Murdoch 2434e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolCaptureRequest_ = 2435e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function(request, response) { 2436e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = %CaptureLOL(); 2437e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2438e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2439e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2440e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolDeleteRequest_ = 2441e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function(request, response) { 2442e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var id = request.arguments.id; 2443e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var result = %DeleteLOL(id); 2444e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (result) { 2445e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = { id: id }; 2446e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 2447e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.failed('Failed to delete: live object list ' + id + ' not found.'); 2448e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2449e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2450e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2451e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2452e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolDiffRequest_ = function(request, response) { 2453e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var id1 = request.arguments.id1; 2454e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var id2 = request.arguments.id2; 2455e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var verbose = request.arguments.verbose; 2456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var filter = request.arguments.filter; 2457e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (verbose === true) { 2458e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var start = request.arguments.start; 2459e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var count = request.arguments.count; 2460e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = %DumpLOL(id1, id2, start, count, filter); 2461e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 2462e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = %SummarizeLOL(id1, id2, filter); 2463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2464e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2465e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2466e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2467e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolGetIdRequest_ = function(request, response) { 2468e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var address = request.arguments.address; 2469e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = {}; 2470e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body.id = %GetLOLObjId(address); 2471e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2472e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2473e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2474e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolInfoRequest_ = function(request, response) { 2475e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var start = request.arguments.start; 2476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var count = request.arguments.count; 2477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = %InfoLOL(start, count); 2478e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2479e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2480e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2481e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolResetRequest_ = function(request, response) { 2482e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch %ResetLOL(); 2483e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2484e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2485e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2486e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolRetainersRequest_ = 2487e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch function(request, response) { 2488e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var id = request.arguments.id; 2489e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var verbose = request.arguments.verbose; 2490e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var start = request.arguments.start; 2491e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var count = request.arguments.count; 2492e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var filter = request.arguments.filter; 2493e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2494e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = %GetLOLObjRetainers(id, Mirror.prototype, verbose, 2495e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch start, count, filter); 2496e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2497e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2498e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2499e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolPathRequest_ = function(request, response) { 2500e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var id1 = request.arguments.id1; 2501e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var id2 = request.arguments.id2; 2502e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = {}; 2503e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body.path = %GetLOLPath(id1, id2, Mirror.prototype); 2504e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2505e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2506e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2507e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochDebugCommandProcessor.prototype.lolPrintRequest_ = function(request, response) { 2508e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch var id = request.arguments.id; 2509e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body = {}; 2510e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch response.body.dump = %PrintLOLObj(id); 2511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2512086aeeaae12517475c22695a200be45495516549Ben Murdoch 2513086aeeaae12517475c22695a200be45495516549Ben Murdoch 25143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Check whether the previously processed command caused the VM to become 25153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// running. 25163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.isRunning = function() { 25173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.running_; 25183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 25193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.systemBreak = function(cmd, args) { 25223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %SystemBreak(); 25233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 25243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction NumberToHex8Str(n) { 25273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var r = ""; 25283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < 8; ++i) { 25293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var c = hexCharArray[n & 0x0F]; // hexCharArray is defined in uri.js 25303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu r = c + r; 25313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu n = n >>> 4; 25323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 25333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return r; 25343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 25353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/** 25383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Convert an Object to its debugger protocol representation. The representation 25393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * may be serilized to a JSON object using JSON.stringify(). 25403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * This implementation simply runs through all string property names, converts 25413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * each property value to a protocol value and adds the property to the result 25423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * object. For type "object" the function will be called recursively. Note that 25433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * circular structures will cause infinite recursion. 25443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Object} object The object to format as protocol object. 25453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {MirrorSerializer} mirror_serializer The serializer to use if any 25463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * mirror objects are encountered. 25473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Object} Protocol object value. 25483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */ 25493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ObjectToProtocolObject_(object, mirror_serializer) { 25503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var content = {}; 25513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var key in object) { 25523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Only consider string keys. 25533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (typeof key == 'string') { 25543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Format the value based on its type. 25553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var property_value_json = ValueToProtocolValue_(object[key], 25563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu mirror_serializer); 25573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add the property if relevant. 25583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(property_value_json)) { 25593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu content[key] = property_value_json; 25603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 25613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 25623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 25636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 25643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return content; 25653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 25663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/** 25693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Convert an array to its debugger protocol representation. It will convert 25703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * each array element to a protocol value. 25713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Array} array The array to format as protocol array. 25723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {MirrorSerializer} mirror_serializer The serializer to use if any 25733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * mirror objects are encountered. 25743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Array} Protocol array value. 25753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */ 25763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ArrayToProtocolArray_(array, mirror_serializer) { 25773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var json = []; 25783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < array.length; i++) { 25793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.push(ValueToProtocolValue_(array[i], mirror_serializer)); 25803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 25813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return json; 25823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 25833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 25853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/** 25866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * Convert a value to its debugger protocol representation. 25873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {*} value The value to format as protocol value. 25883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {MirrorSerializer} mirror_serializer The serializer to use if any 25893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * mirror objects are encountered. 25903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {*} Protocol value. 25913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */ 25923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ValueToProtocolValue_(value, mirror_serializer) { 25933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Format the value based on its type. 25943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var json; 25953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu switch (typeof value) { 25963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu case 'object': 25973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (value instanceof Mirror) { 25983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = mirror_serializer.serializeValue(value); 25993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (IS_ARRAY(value)){ 26003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = ArrayToProtocolArray_(value, mirror_serializer); 26013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 26023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = ObjectToProtocolObject_(value, mirror_serializer); 26033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 26043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break; 26053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 26063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu case 'boolean': 26073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu case 'string': 26083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu case 'number': 26093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = value; 26103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break; 26113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 26123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu default: 26133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = null; 26143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 26153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return json; 26163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 2617