debug-debugger.js revision 8defd9ff6930b4e24729971a61cf7469daf119be
13100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Copyright 2006-2008 the V8 project authors. All rights reserved. 23100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Redistribution and use in source and binary forms, with or without 33100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// modification, are permitted provided that the following conditions are 43100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// met: 53100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// 63100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// * Redistributions of source code must retain the above copyright 73100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// notice, this list of conditions and the following disclaimer. 83100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// * Redistributions in binary form must reproduce the above 93100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// copyright notice, this list of conditions and the following 103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// disclaimer in the documentation and/or other materials provided 113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// with the distribution. 123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// * Neither the name of Google Inc. nor the names of its 133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// contributors may be used to endorse or promote products derived 143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// from this software without specific prior written permission. 153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// 163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Default number of frames to include in the response to backtrace request. 293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuconst kDefaultBacktraceLength = 10; 303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuconst Debug = {}; 323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Regular expression to skip "crud" at the beginning of a source line which is 343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// not really code. Currently the regular expression matches whitespace and 353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// comments. 363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuconst sourceLineBeginningSkip = /^(?:\s*(?:\/\*.*?\*\/)*)*/; 373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Debug events which can occour in the V8 JavaScript engine. These originate 393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// from the API include file debug.h. 403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.DebugEvent = { Break: 1, 413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Exception: 2, 423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu NewFunction: 3, 433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu BeforeCompile: 4, 443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu AfterCompile: 5, 453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu ScriptCollected: 6 }; 463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Types of exceptions that can be broken upon. 483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.ExceptionBreak = { All : 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, 713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu ScriptName: 1 }; 723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ScriptTypeFlag(type) { 743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return (1 << type); 753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Globals. 783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvar next_response_seq = 0; 793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvar next_break_point_number = 1; 803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvar break_points = []; 813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuvar script_break_points = []; 823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Create a new break point object and add it to the list of break points. 853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeBreakPoint(source_position, opt_line, opt_column, opt_script_break_point) { 863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = new BreakPoint(source_position, opt_line, opt_column, opt_script_break_point); 873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_points.push(break_point); 883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return break_point; 893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Object representing a break point. 933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// NOTE: This object does not have a reference to the function having break 943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// point as this would cause function not to be garbage collected when it is 953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// not used any more. We do not want break points to keep functions alive. 963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction BreakPoint(source_position, opt_line, opt_column, opt_script_break_point) { 973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.source_position_ = source_position; 983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.source_line_ = opt_line; 993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.source_column_ = opt_column; 1003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (opt_script_break_point) { 1013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.script_break_point_ = opt_script_break_point; 1023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 1033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.number_ = next_break_point_number++; 1043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 1053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.hit_count_ = 0; 1063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.active_ = true; 1073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.condition_ = null; 1083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.ignoreCount_ = 0; 1093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 1103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.number = function() { 1133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.number_; 1143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.func = function() { 1183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.func_; 1193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.source_position = function() { 1233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.source_position_; 1243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.hit_count = function() { 1283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.hit_count_; 1293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.active = function() { 1333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.script_break_point()) { 1343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_break_point().active(); 1353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 1363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.active_; 1373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.condition = function() { 1413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.script_break_point() && this.script_break_point().condition()) { 1423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_break_point().condition(); 1433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 1443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.condition_; 1453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.ignoreCount = function() { 1493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.ignoreCount_; 1503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.script_break_point = function() { 1543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_break_point_; 1553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.enable = function() { 1593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.active_ = true; 1603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.disable = function() { 1643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.active_ = false; 1653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.setCondition = function(condition) { 1693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.condition_ = condition; 1703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.setIgnoreCount = function(ignoreCount) { 1743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.ignoreCount_ = ignoreCount; 1753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 1763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakPoint.prototype.isTriggered = function(exec_state) { 1793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Break point not active - not triggered. 1803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!this.active()) return false; 1813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for conditional break point. 1833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.condition()) { 1843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If break point has condition try to evaluate it in the top frame. 1853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 1863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var mirror = exec_state.frame(0).evaluate(this.condition()); 1873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If no sensible mirror or non true value break point not triggered. 1883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!(mirror instanceof ValueMirror) || !%ToBoolean(mirror.value_)) { 1893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return false; 1903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 1913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch (e) { 1923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Exception evaluating condition counts as not triggered. 1933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return false; 1943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 1953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 1963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Update the hit count. 1983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.hit_count_++; 1993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.script_break_point_) { 2003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.script_break_point_.hit_count_++; 2013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If the break point has an ignore count it is not triggered. 2043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.ignoreCount_ > 0) { 2053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.ignoreCount_--; 2063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return false; 2073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Break point triggered. 2103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return true; 2113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 2123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Function called from the runtime when a break point is hit. Returns true if 2153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// the break point is triggered and supposed to break execution. 2163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction IsBreakPointTriggered(break_id, break_point) { 2173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return break_point.isTriggered(MakeExecutionState(break_id)); 2183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 2193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Object representing a script break point. The script is referenced by its 2223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// script name or script id and the break point is represented as line and 2233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// column. 2243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column, 2253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_groupId) { 2263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.type_ = type; 2273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (type == Debug.ScriptBreakPointType.ScriptId) { 2283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.script_id_ = script_id_or_name; 2293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { // type == Debug.ScriptBreakPointType.ScriptName 2303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.script_name_ = script_id_or_name; 2313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.line_ = opt_line || 0; 2333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.column_ = opt_column; 2343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.groupId_ = opt_groupId; 2353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.hit_count_ = 0; 2363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.active_ = true; 2373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.condition_ = null; 2383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.ignoreCount_ = 0; 2398defd9ff6930b4e24729971a61cf7469daf119beSteve Block this.break_points_ = []; 2403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 2413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block//Creates a clone of script breakpoint that is linked to another script. 2446ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockScriptBreakPoint.prototype.cloneForOtherScript = function (other_script) { 2456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var copy = new ScriptBreakPoint(Debug.ScriptBreakPointType.ScriptId, 2466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block other_script.id, this.line_, this.column_, this.groupId_); 2476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block copy.number_ = next_break_point_number++; 2486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block script_break_points.push(copy); 2496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block copy.hit_count_ = this.hit_count_; 2516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block copy.active_ = this.active_; 2526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block copy.condition_ = this.condition_; 2536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block copy.ignoreCount_ = this.ignoreCount_; 2546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return copy; 2556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 2566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.number = function() { 2593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.number_; 2603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 2613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.groupId = function() { 2643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.groupId_; 2653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 2663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.type = function() { 2693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.type_; 2703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 2713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.script_id = function() { 2743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_id_; 2753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 2763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.script_name = function() { 2793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_name_; 2803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 2813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.line = function() { 2843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.line_; 2853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 2863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.column = function() { 2893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.column_; 2903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 2913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 2938defd9ff6930b4e24729971a61cf7469daf119beSteve BlockScriptBreakPoint.prototype.actual_locations = function() { 2948defd9ff6930b4e24729971a61cf7469daf119beSteve Block var locations = []; 2958defd9ff6930b4e24729971a61cf7469daf119beSteve Block for (var i = 0; i < this.break_points_.length; i++) { 2968defd9ff6930b4e24729971a61cf7469daf119beSteve Block locations.push(this.break_points_[i].actual_location); 2978defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 2988defd9ff6930b4e24729971a61cf7469daf119beSteve Block return locations; 2998defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 3008defd9ff6930b4e24729971a61cf7469daf119beSteve Block 3018defd9ff6930b4e24729971a61cf7469daf119beSteve Block 3026ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockScriptBreakPoint.prototype.update_positions = function(line, column) { 3036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block this.line_ = line; 3046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block this.column_ = column; 3056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 3066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 3076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 3083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.hit_count = function() { 3093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.hit_count_; 3103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.active = function() { 3143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.active_; 3153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.condition = function() { 3193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.condition_; 3203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.ignoreCount = function() { 3243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.ignoreCount_; 3253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.enable = function() { 3293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.active_ = true; 3303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.disable = function() { 3343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.active_ = false; 3353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.setCondition = function(condition) { 3393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.condition_ = condition; 3403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.setIgnoreCount = function(ignoreCount) { 3443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.ignoreCount_ = ignoreCount; 3453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set ignore count on all break points created from this script break point. 3478defd9ff6930b4e24729971a61cf7469daf119beSteve Block for (var i = 0; i < this.break_points_.length; i++) { 3488defd9ff6930b4e24729971a61cf7469daf119beSteve Block this.break_points_[i].setIgnoreCount(ignoreCount); 3493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 3503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Check whether a script matches this script break point. Currently this is 3543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// only based on script name. 3553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.matchesScript = function(script) { 3563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.type_ == Debug.ScriptBreakPointType.ScriptId) { 3573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_id_ == script.id; 3583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { // this.type_ == Debug.ScriptBreakPointType.ScriptName 3596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return this.script_name_ == script.nameOrSourceURL() && 3603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script.line_offset <= this.line_ && 3613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.line_ < script.line_offset + script.lineCount(); 3623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 3633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 3643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Set the script break point in a script. 3673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.set = function (script) { 3683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var column = this.column(); 3693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var line = this.line(); 3703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If the column is undefined the break is on the line. To help locate the 3713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // first piece of breakable code on the line try to find the column on the 3723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // line which contains some source. 3733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(column)) { 3743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var source_line = script.sourceLine(this.line()); 3753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Allocate array for caching the columns where the actual source starts. 3773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!script.sourceColumnStart_) { 3783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script.sourceColumnStart_ = new Array(script.lineCount()); 3793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 3803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Fill cache if needed and get column where the actual source starts. 3823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(script.sourceColumnStart_[line])) { 3833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script.sourceColumnStart_[line] = 3843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu source_line.match(sourceLineBeginningSkip)[0].length; 3853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 3863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu column = script.sourceColumnStart_[line]; 3873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 3883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Convert the line and column into an absolute position within the script. 3908defd9ff6930b4e24729971a61cf7469daf119beSteve Block var position = Debug.findScriptSourcePosition(script, this.line(), column); 3913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If the position is not found in the script (the script might be shorter 3933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // than it used to be) just ignore it. 3948defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (position === null) return; 3953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 3963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create a break point object and set the break point. 3978defd9ff6930b4e24729971a61cf7469daf119beSteve Block break_point = MakeBreakPoint(position, this.line(), this.column(), this); 3983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point.setIgnoreCount(this.ignoreCount()); 3998defd9ff6930b4e24729971a61cf7469daf119beSteve Block var actual_position = %SetScriptBreakPoint(script, position, break_point); 4008defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (IS_UNDEFINED(actual_position)) { 4018defd9ff6930b4e24729971a61cf7469daf119beSteve Block actual_position = position; 4028defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 4038defd9ff6930b4e24729971a61cf7469daf119beSteve Block var actual_location = script.locationFromPosition(actual_position, true); 4048defd9ff6930b4e24729971a61cf7469daf119beSteve Block break_point.actual_location = { line: actual_location.line, 4058defd9ff6930b4e24729971a61cf7469daf119beSteve Block column: actual_location.column }; 4068defd9ff6930b4e24729971a61cf7469daf119beSteve Block this.break_points_.push(break_point); 4073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return break_point; 4083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 4093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Clear all the break points created from this script break point 4123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptBreakPoint.prototype.clear = function () { 4133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var remaining_break_points = []; 4143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < break_points.length; i++) { 4153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_points[i].script_break_point() && 4163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_points[i].script_break_point() === this) { 4173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %ClearBreakPoint(break_points[i]); 4183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 4193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu remaining_break_points.push(break_points[i]); 4203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_points = remaining_break_points; 4238defd9ff6930b4e24729971a61cf7469daf119beSteve Block this.break_points_ = []; 4243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 4253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Function called from runtime when a new script is compiled to set any script 4283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// break points set in this script. 4293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction UpdateScriptBreakPoints(script) { 4303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < script_break_points.length; i++) { 4313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script_break_points[i].type() == Debug.ScriptBreakPointType.ScriptName && 4323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_points[i].matchesScript(script)) { 4333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_points[i].set(script); 4343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 4373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4396ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockfunction GetScriptBreakPoints(script) { 4406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var result = []; 4416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (var i = 0; i < script_break_points.length; i++) { 4426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (script_break_points[i].matchesScript(script)) { 4436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block result.push(script_break_points[i]); 4446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 4456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 4466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return result; 4476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 4486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 4496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 4503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setListener = function(listener, opt_data) { 4513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(listener) && !IS_UNDEFINED(listener) && !IS_NULL(listener)) { 4523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Parameters have wrong types.'); 4533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %SetDebugEventListener(listener, opt_data); 4553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 4563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.breakExecution = function(f) { 4593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %Break(); 4603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 4613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.breakLocations = function(f) { 4633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 4643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %GetBreakLocations(f); 4653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 4663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 4673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Returns a Script object. If the parameter is a function the return value 4683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// is the script in which the function is defined. If the parameter is a string 4693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// the return value is the script for which the script name has that string 4703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// value. If it is a regexp and there is a unique script whose name matches 4713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// we return that, otherwise undefined. 4723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findScript = function(func_or_script_name) { 4733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_FUNCTION(func_or_script_name)) { 4743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %FunctionGetScript(func_or_script_name); 4753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (IS_REGEXP(func_or_script_name)) { 4763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scripts = Debug.scripts(); 4773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var last_result = null; 4783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var result_count = 0; 4793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i in scripts) { 4803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = scripts[i]; 4813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (func_or_script_name.test(script.name)) { 4823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu last_result = script; 4833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result_count++; 4843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Return the unique script matching the regexp. If there are more 4873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // than one we don't return a value since there is no good way to 4883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // decide which one to return. Returning a "random" one, say the 4893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // first, would introduce nondeterminism (or something close to it) 4903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // because the order is the heap iteration order. 4913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (result_count == 1) { 4923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return last_result; 4933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 4943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return undefined; 4953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 4973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %GetScript(func_or_script_name); 4983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 4993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Returns the script source. If the parameter is a function the return value 5023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// is the script source for the script in which the function is defined. If the 5033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// parameter is a string the return value is the script for which the script 5043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// name has that string value. 5053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.scriptSource = function(func_or_script_name) { 5063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.findScript(func_or_script_name).source; 5073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.source = function(f) { 5103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %FunctionGetSourceCode(f); 5123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.disassemble = function(f) { 5153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %DebugDisassembleFunction(f); 5173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.disassembleConstructor = function(f) { 5203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %DebugDisassembleConstructor(f); 5223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5246ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockDebug.ExecuteInDebugContext = function(f, without_debugger) { 5256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return %ExecuteInDebugContext(f, !!without_debugger); 5276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 5286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 5293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.sourcePosition = function(f) { 5303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 5313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %FunctionGetScriptSourcePosition(f); 5323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findFunctionSourceLocation = function(func, opt_line, opt_column) { 5363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = %FunctionGetScript(func); 5373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_offset = %FunctionGetScriptSourcePosition(func); 5383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return script.locationFromLine(opt_line, opt_column, script_offset); 5393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 5403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Returns the character position in a script based on a line number and an 5433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// optional position within that line. 5443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findScriptSourcePosition = function(script, opt_line, opt_column) { 5453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var location = script.locationFromLine(opt_line, opt_column); 5463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return location ? location.position : null; 5473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 5483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findBreakPoint = function(break_point_number, remove) { 5513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point; 5523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < break_points.length; i++) { 5533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_points[i].number() == break_point_number) { 5543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point = break_points[i]; 5553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Remove the break point from the list if requested. 5563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (remove) { 5573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_points.splice(i, 1); 5583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break; 5603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_point) { 5633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return break_point; 5643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 5653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.findScriptBreakPoint(break_point_number, remove); 5663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 5683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5698defd9ff6930b4e24729971a61cf7469daf119beSteve BlockDebug.findBreakPointActualLocations = function(break_point_number) { 5708defd9ff6930b4e24729971a61cf7469daf119beSteve Block for (var i = 0; i < script_break_points.length; i++) { 5718defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (script_break_points[i].number() == break_point_number) { 5728defd9ff6930b4e24729971a61cf7469daf119beSteve Block return script_break_points[i].actual_locations(); 5738defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 5748defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 5758defd9ff6930b4e24729971a61cf7469daf119beSteve Block for (var i = 0; i < break_points.length; i++) { 5768defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (break_points[i].number() == break_point_number) { 5778defd9ff6930b4e24729971a61cf7469daf119beSteve Block return [break_points[i].actual_location]; 5788defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 5798defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 5808defd9ff6930b4e24729971a61cf7469daf119beSteve Block return []; 5818defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 5823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 5833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setBreakPoint = function(func, opt_line, opt_column, opt_condition) { 5843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(func)) throw new Error('Parameters have wrong types.'); 5853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Break points in API functions are not supported. 5863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (%FunctionIsAPIFunction(func)) { 5873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Cannot set break point in native code.'); 5883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find source position relative to start of the function 5903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_position = 5913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.findFunctionSourceLocation(func, opt_line, opt_column).position; 5923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var source_position = break_position - this.sourcePosition(func); 5933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find the script for the function. 5943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = %FunctionGetScript(func); 5953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Break in builtin JavaScript code is not supported. 5963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script.type == Debug.ScriptType.Native) { 5973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Cannot set break point in native code.'); 5983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 5993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If the script for the function has a name convert this to a script break 6003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // point. 6013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script && script.id) { 6023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Adjust the source position to be script relative. 6033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu source_position += %FunctionGetScriptSourcePosition(func); 6043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find line and column for the position in the script and set a script 6053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // break point from that. 6063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var location = script.locationFromPosition(source_position, false); 6073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.setScriptBreakPointById(script.id, 6083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu location.line, location.column, 6093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition); 6103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 6113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set a break point directly on the function. 6123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = MakeBreakPoint(source_position, opt_line, opt_column); 6138defd9ff6930b4e24729971a61cf7469daf119beSteve Block var actual_position = 6148defd9ff6930b4e24729971a61cf7469daf119beSteve Block %SetFunctionBreakPoint(func, source_position, break_point); 6158defd9ff6930b4e24729971a61cf7469daf119beSteve Block actual_position += this.sourcePosition(func); 6168defd9ff6930b4e24729971a61cf7469daf119beSteve Block var actual_location = script.locationFromPosition(actual_position, true); 6178defd9ff6930b4e24729971a61cf7469daf119beSteve Block break_point.actual_location = { line: actual_location.line, 6188defd9ff6930b4e24729971a61cf7469daf119beSteve Block column: actual_location.column }; 6193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point.setCondition(opt_condition); 6203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return break_point.number(); 6213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 6233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.enableBreakPoint = function(break_point_number) { 6263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, false); 6273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point.enable(); 6283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 6293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.disableBreakPoint = function(break_point_number) { 6323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, false); 6333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point.disable(); 6343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 6353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.changeBreakPointCondition = function(break_point_number, condition) { 6383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, false); 6393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point.setCondition(condition); 6403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 6413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.changeBreakPointIgnoreCount = function(break_point_number, ignoreCount) { 6443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (ignoreCount < 0) { 6453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid argument'); 6463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, false); 6483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point.setIgnoreCount(ignoreCount); 6493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 6503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearBreakPoint = function(break_point_number) { 6533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = this.findBreakPoint(break_point_number, true); 6543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_point) { 6553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %ClearBreakPoint(break_point); 6563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 6573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point = this.findScriptBreakPoint(break_point_number, true); 6583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!break_point) { 6593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid breakpoint'); 6603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 6633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearAllBreakPoints = function() { 6663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < break_points.length; i++) { 6673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point = break_points[i]; 6683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %ClearBreakPoint(break_point); 6693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_points = []; 6713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 6723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.findScriptBreakPoint = function(break_point_number, remove) { 6753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point; 6763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < script_break_points.length; i++) { 6773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script_break_points[i].number() == break_point_number) { 6783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point = script_break_points[i]; 6793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Remove the break point from the list if requested. 6803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (remove) { 6813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.clear(); 6823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_points.splice(i,1); 6833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break; 6853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 6873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return script_break_point; 6883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 6893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 6913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Sets a breakpoint in a script identified through id or name at the 6923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// specified source line and column within that line. 6933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setScriptBreakPoint = function(type, script_id_or_name, 6943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_line, opt_column, opt_condition, 6953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_groupId) { 6963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create script break point object. 6973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = 6983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu new ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column, 6993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_groupId); 7003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Assign number to the new script break point and add it. 7023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.number_ = next_break_point_number++; 7033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.setCondition(opt_condition); 7043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_points.push(script_break_point); 7053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Run through all scripts to see if this script break point matches any 7073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // loaded scripts. 7083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scripts = this.scripts(); 7093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < scripts.length; i++) { 7103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script_break_point.matchesScript(scripts[i])) { 7113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.set(scripts[i]); 7123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return script_break_point.number(); 7163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 7173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setScriptBreakPointById = function(script_id, 7203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_line, opt_column, 7213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition, opt_groupId) { 7223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptId, 7233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_id, opt_line, opt_column, 7243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition, opt_groupId); 7253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 7263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setScriptBreakPointByName = function(script_name, 7293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_line, opt_column, 7303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition, opt_groupId) { 7313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptName, 7323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_name, opt_line, opt_column, 7333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu opt_condition, opt_groupId); 7343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 7353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.enableScriptBreakPoint = function(break_point_number) { 7383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = this.findScriptBreakPoint(break_point_number, false); 7393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.enable(); 7403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.disableScriptBreakPoint = function(break_point_number) { 7443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = this.findScriptBreakPoint(break_point_number, false); 7453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.disable(); 7463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.changeScriptBreakPointCondition = function(break_point_number, condition) { 7503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = this.findScriptBreakPoint(break_point_number, false); 7513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.setCondition(condition); 7523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.changeScriptBreakPointIgnoreCount = function(break_point_number, ignoreCount) { 7563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (ignoreCount < 0) { 7573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid argument'); 7583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 7593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = this.findScriptBreakPoint(break_point_number, false); 7603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_point.setIgnoreCount(ignoreCount); 7613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.scriptBreakPoints = function() { 7653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return script_break_points; 7663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 7673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearStepping = function() { 7703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %ClearStepping(); 7713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 7723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setBreakOnException = function() { 7743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %ChangeBreakOnException(Debug.ExceptionBreak.All, true); 7753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearBreakOnException = function() { 7783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %ChangeBreakOnException(Debug.ExceptionBreak.All, false); 7793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.setBreakOnUncaughtException = function() { 7823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, true); 7833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.clearBreakOnUncaughtException = function() { 7863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, false); 7873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 7883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 7893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.showBreakPoints = function(f, full) { 7903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.'); 7913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var source = full ? this.scriptSource(f) : this.source(f); 7923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var offset = full ? this.sourcePosition(f) : 0; 7933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var locations = this.breakLocations(f); 7943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!locations) return source; 7953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu locations.sort(function(x, y) { return x - y; }); 7963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var result = ""; 7973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var prev_pos = 0; 7983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var pos; 7993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < locations.length; i++) { 8003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu pos = locations[i] - offset; 8013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result += source.slice(prev_pos, pos); 8023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result += "[B" + i + "]"; 8033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu prev_pos = pos; 8043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 8053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu pos = source.length; 8063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result += source.substring(prev_pos, pos); 8073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return result; 8083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Get all the scripts currently loaded. Locating all the scripts is based on 8123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// scanning the heap. 8133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebug.scripts = function() { 8143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Collect all scripts in the heap. 8153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %DebugGetLoadedScripts(); 8163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 8173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeExecutionState(break_id) { 8193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new ExecutionState(break_id); 8203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 8213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ExecutionState(break_id) { 8233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.break_id = break_id; 8243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.selected_frame = 0; 8253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 8263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.prepareStep = function(opt_action, opt_count) { 8283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var action = Debug.StepAction.StepIn; 8293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(opt_action)) action = %ToNumber(opt_action); 8303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var count = opt_count ? %ToNumber(opt_count) : 1; 8313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %PrepareStep(this.break_id, action, count); 8333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 8343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.evaluateGlobal = function(source, disable_break) { 8363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return MakeMirror( 8373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu %DebugEvaluateGlobal(this.break_id, source, Boolean(disable_break))); 8383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.frameCount = function() { 8413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %GetFrameCount(this.break_id); 8423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.threadCount = function() { 8453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %GetThreadCount(this.break_id); 8463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.frame = function(opt_index) { 8493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If no index supplied return the selected frame. 8503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (opt_index == null) opt_index = this.selected_frame; 8516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (opt_index < 0 || opt_index >= this.frameCount()) 8526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block throw new Error('Illegal frame index.'); 8533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new FrameMirror(this.break_id, opt_index); 8543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.cframesValue = function(opt_from_index, opt_to_index) { 8573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %GetCFrames(this.break_id); 8583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.setSelectedFrame = function(index) { 8613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var i = %ToNumber(index); 8623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (i < 0 || i >= this.frameCount()) throw new Error('Illegal frame index.'); 8633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.selected_frame = i; 8643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.selectedFrame = function() { 8673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.selected_frame; 8683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExecutionState.prototype.debugCommandProcessor = function(opt_is_running) { 8713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new DebugCommandProcessor(this, opt_is_running); 8723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeBreakEvent(exec_state, break_points_hit) { 8763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new BreakEvent(exec_state, break_points_hit); 8773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 8783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction BreakEvent(exec_state, break_points_hit) { 8813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 8823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.break_points_hit_ = break_points_hit; 8833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 8843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.executionState = function() { 8873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_; 8883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.eventType = function() { 8923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.Break; 8933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 8963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.func = function() { 8973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).func(); 8983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 8993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.sourceLine = function() { 9023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceLine(); 9033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.sourceColumn = function() { 9073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceColumn(); 9083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.sourceLineText = function() { 9123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceLineText(); 9133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.breakPointsHit = function() { 9173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.break_points_hit_; 9183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuBreakEvent.prototype.toJSONProtocol = function() { 9223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = { seq: next_response_seq++, 9233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu type: "event", 9243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu event: "break", 9253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu body: { invocationText: this.exec_state_.frame(0).invocationText(), 9263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 9273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu }; 9283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add script related information to the event if available. 9303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = this.func().script(); 9313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script) { 9323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLine = this.sourceLine(), 9333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceColumn = this.sourceColumn(), 9343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLineText = this.sourceLineText(), 9353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.script = MakeScriptObject_(script, false); 9363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 9373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add an Array of break points hit if any. 9393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.breakPointsHit()) { 9403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.breakpoints = []; 9413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < this.breakPointsHit().length; i++) { 9423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find the break point number. For break points originating from a 9433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // script break point supply the script break point number. 9443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var breakpoint = this.breakPointsHit()[i]; 9453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script_break_point = breakpoint.script_break_point(); 9463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var number; 9473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script_break_point) { 9483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu number = script_break_point.number(); 9493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 9503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu number = breakpoint.number(); 9513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 9523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.breakpoints.push(number); 9533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 9543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 9553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return JSON.stringify(ObjectToProtocolObject_(o)); 9563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeExceptionEvent(exec_state, exception, uncaught) { 9603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new ExceptionEvent(exec_state, exception, uncaught); 9613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 9623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ExceptionEvent(exec_state, exception, uncaught) { 9653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 9663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exception_ = exception; 9673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.uncaught_ = uncaught; 9683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 9693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.executionState = function() { 9723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_; 9733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.eventType = function() { 9773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.Exception; 9783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.exception = function() { 9823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exception_; 9833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 9843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.uncaught = function() { 9873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.uncaught_; 9883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 9893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.func = function() { 9923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).func(); 9933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 9963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.sourceLine = function() { 9973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceLine(); 9983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 9993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.sourceColumn = function() { 10023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceColumn(); 10033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.sourceLineText = function() { 10073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(0).sourceLineText(); 10083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuExceptionEvent.prototype.toJSONProtocol = function() { 10123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = new ProtocolMessage(); 10133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.event = "exception"; 10143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body = { uncaught: this.uncaught_, 10153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu exception: MakeMirror(this.exception_) 10163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu }; 10173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Exceptions might happen whithout any JavaScript frames. 10193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() > 0) { 10203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLine = this.sourceLine(); 10213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceColumn = this.sourceColumn(); 10223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLineText = this.sourceLineText(); 10233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add script information to the event if available. 10253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = this.func().script(); 10263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (script) { 10273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.script = MakeScriptObject_(script, false); 10283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 10293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 10303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.sourceLine = -1; 10313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 10323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return o.toJSONProtocol(); 10343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeCompileEvent(exec_state, script, before) { 10383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new CompileEvent(exec_state, script, before); 10393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 10403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction CompileEvent(exec_state, script, before) { 10433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 10443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.script_ = MakeMirror(script); 10453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.before_ = before; 10463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 10473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuCompileEvent.prototype.executionState = function() { 10503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_; 10513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuCompileEvent.prototype.eventType = function() { 10553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.before_) { 10563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.BeforeCompile; 10573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 10583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.AfterCompile; 10593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 10603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuCompileEvent.prototype.script = function() { 10643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.script_; 10653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuCompileEvent.prototype.toJSONProtocol = function() { 10693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = new ProtocolMessage(); 10703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.running = true; 10713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.before_) { 10723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.event = "beforeCompile"; 10733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 10743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.event = "afterCompile"; 10753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 10763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body = {}; 10773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.script = this.script_; 10783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return o.toJSONProtocol(); 10803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 10813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeNewFunctionEvent(func) { 10843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new NewFunctionEvent(func); 10853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 10863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction NewFunctionEvent(func) { 10893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.func = func; 10903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 10913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuNewFunctionEvent.prototype.eventType = function() { 10943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return Debug.DebugEvent.NewFunction; 10953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 10963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 10983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuNewFunctionEvent.prototype.name = function() { 10993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.func.name; 11003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuNewFunctionEvent.prototype.setBreakPoint = function(p) { 11043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.setBreakPoint(this.func, p || 0); 11053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeScriptCollectedEvent(exec_state, id) { 11093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new ScriptCollectedEvent(exec_state, id); 11103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 11113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ScriptCollectedEvent(exec_state, id) { 11143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 11153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.id_ = id; 11163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 11173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptCollectedEvent.prototype.id = function() { 11203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.id_; 11213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptCollectedEvent.prototype.executionState = function() { 11253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_; 11263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuScriptCollectedEvent.prototype.toJSONProtocol = function() { 11303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = new ProtocolMessage(); 11313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.running = true; 11323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.event = "scriptCollected"; 11333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body = {}; 11343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.body.script = { id: this.id() }; 11353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return o.toJSONProtocol(); 11363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 11373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction MakeScriptObject_(script, include_source) { 11403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var o = { id: script.id(), 11413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu name: script.name(), 11423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu lineOffset: script.lineOffset(), 11433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu columnOffset: script.columnOffset(), 11443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu lineCount: script.lineCount(), 11453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu }; 11463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(script.data())) { 11473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.data = script.data(); 11483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 11493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (include_source) { 11503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu o.source = script.source(); 11513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 11523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return o; 11533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction DebugCommandProcessor(exec_state, opt_is_running) { 11573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_ = exec_state; 11583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.running_ = opt_is_running || false; 11593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 11603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.processDebugRequest = function (request) { 11633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.processDebugJSONRequest(request); 11643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 11653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ProtocolMessage(request) { 11683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Update sequence number. 11693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.seq = next_response_seq++; 11703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request) { 11723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If message is based on a request this is a response. Fill the initial 11733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // response from the request. 11743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.type = 'response'; 11753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.request_seq = request.seq; 11763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.command = request.command; 11773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 11783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If message is not based on a request it is a dabugger generated event. 11793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.type = 'event'; 11803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 11813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.success = true; 11823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Handler may set this field to control debugger state. 11833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.running = undefined; 11843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 11853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuProtocolMessage.prototype.setOption = function(name, value) { 11883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!this.options_) { 11893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.options_ = {}; 11903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 11913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.options_[name] = value; 11923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 11933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 11953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuProtocolMessage.prototype.failed = function(message) { 11963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.success = false; 11973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.message = message; 11983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 11993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuProtocolMessage.prototype.toJSONProtocol = function() { 12023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Encode the protocol header. 12033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var json = {}; 12043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.seq= this.seq; 12053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.request_seq) { 12063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.request_seq = this.request_seq; 12073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.type = this.type; 12093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.event) { 12103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.event = this.event; 12113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.command) { 12133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.command = this.command; 12143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.success) { 12163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.success = this.success; 12173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 12183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.success = false; 12193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.body) { 12213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Encode the body part. 12223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var bodyJson; 12233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var serializer = MakeMirrorSerializer(true, this.options_); 12243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.body instanceof Mirror) { 12253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson = serializer.serializeValue(this.body); 12263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (this.body instanceof Array) { 12273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson = []; 12283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < this.body.length; i++) { 12293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.body[i] instanceof Mirror) { 12303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson.push(serializer.serializeValue(this.body[i])); 12313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 12323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson.push(ObjectToProtocolObject_(this.body[i], serializer)); 12333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 12363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu bodyJson = ObjectToProtocolObject_(this.body, serializer); 12373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.body = bodyJson; 12393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.refs = serializer.serializeReferencedObjects(); 12403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.message) { 12423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.message = this.message; 12433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.running = this.running; 12453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return JSON.stringify(json); 12463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 12473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.createResponse = function(request) { 12503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return new ProtocolMessage(request); 12513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 12523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.processDebugJSONRequest = function(json_request) { 12553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var request; // Current request. 12563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var response; // Generated response. 12573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 12583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 12593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Convert the JSON string to an object. 12603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu request = %CompileString('(' + json_request + ')', false)(); 12613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create an initial response. 12633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response = this.createResponse(request); 12643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.type) { 12663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Type not specified'); 12673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.type != 'request') { 12703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error("Illegal type '" + request.type + "' in request"); 12713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.command) { 12743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Command not specified'); 12753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 1277402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu if (request.arguments) { 1278402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu var args = request.arguments; 1279402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu // TODO(yurys): remove request.arguments.compactFormat check once 1280402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu // ChromeDevTools are switched to 'inlineRefs' 1281402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu if (args.inlineRefs || args.compactFormat) { 1282402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu response.setOption('inlineRefs', true); 1283402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu } 1284402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu if (!IS_UNDEFINED(args.maxStringLength)) { 1285402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu response.setOption('maxStringLength', args.maxStringLength); 1286402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu } 12873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 12883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 12893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.command == 'continue') { 12903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.continueRequest_(request, response); 12913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'break') { 12923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.breakRequest_(request, response); 12933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'setbreakpoint') { 12943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.setBreakPointRequest_(request, response); 12953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'changebreakpoint') { 12963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.changeBreakPointRequest_(request, response); 12973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'clearbreakpoint') { 12983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.clearBreakPointRequest_(request, response); 12993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'clearbreakpointgroup') { 13003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.clearBreakPointGroupRequest_(request, response); 130125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen } else if (request.command == 'listbreakpoints') { 130225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen this.listBreakpointsRequest_(request, response); 13033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'backtrace') { 13043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.backtraceRequest_(request, response); 13053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'frame') { 13063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.frameRequest_(request, response); 13073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'scopes') { 13083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.scopesRequest_(request, response); 13093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'scope') { 13103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.scopeRequest_(request, response); 13113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'evaluate') { 13123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.evaluateRequest_(request, response); 13133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'lookup') { 13143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.lookupRequest_(request, response); 13153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'references') { 13163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.referencesRequest_(request, response); 13173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'source') { 13183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.sourceRequest_(request, response); 13193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'scripts') { 13203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.scriptsRequest_(request, response); 13213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'threads') { 13223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.threadsRequest_(request, response); 13233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'suspend') { 13243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.suspendRequest_(request, response); 13253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'version') { 13263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.versionRequest_(request, response); 13273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.command == 'profile') { 13286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block this.profileRequest_(request, response); 13296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } else if (request.command == 'changelive') { 13306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block this.changeLiveRequest_(request, response); 13313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 13323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Unknown command "' + request.command + '" in request'); 13333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch (e) { 13353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // If there is no response object created one (without command). 13363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!response) { 13373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response = this.createResponse(); 13383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.success = false; 13403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.message = %ToString(e); 13413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Return the response as a JSON encoded string. 13443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 13453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(response.running)) { 13463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Response controls running state. 13473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.running_ = response.running; 13483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block response.running = this.running_; 13503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.toJSONProtocol(); 13513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch (e) { 13523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Failed to generate response - return generic error. 13533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return '{"seq":' + response.seq + ',' + 13543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '"request_seq":' + request.seq + ',' + 13553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '"type":"response",' + 13563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '"success":false,' + 13573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '"message":"Internal error: ' + %ToString(e) + '"}'; 13583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch (e) { 13603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Failed in one of the catch blocks above - most generic error. 13613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return '{"seq":0,"type":"response","success":false,"message":"Internal error"}'; 13623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 13643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.continueRequest_ = function(request, response) { 13673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for arguments for continue. 13683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 13693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var count = 1; 13703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var action = Debug.StepAction.StepIn; 13713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 13733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var stepaction = request.arguments.stepaction; 13743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var stepcount = request.arguments.stepcount; 13753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the stepcount argument if any. 13773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (stepcount) { 13783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu count = %ToNumber(stepcount); 13793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (count < 0) { 13803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid stepcount argument "' + stepcount + '".'); 13813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the stepaction argument. 13853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (stepaction) { 13863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (stepaction == 'in') { 13873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu action = Debug.StepAction.StepIn; 13883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (stepaction == 'min') { 13893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu action = Debug.StepAction.StepMin; 13903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (stepaction == 'next') { 13913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu action = Debug.StepAction.StepNext; 13923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (stepaction == 'out') { 13933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu action = Debug.StepAction.StepOut; 13943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 13953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu throw new Error('Invalid stepaction argument "' + stepaction + '".'); 13963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 13983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 13993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Setup the VM for stepping. 14003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_.prepareStep(action, count); 14013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 14033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // VM should be running after executing this request. 14043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.running = true; 14053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 14063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 14073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 14083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.breakRequest_ = function(request, response) { 14093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Ignore as break command does not do anything when broken. 14103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 14113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 14123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 14133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.setBreakPointRequest_ = 14143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu function(request, response) { 14153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal request. 14163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 14173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing arguments'); 14183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 14193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 14213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 14223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var type = request.arguments.type; 14233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var target = request.arguments.target; 14243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var line = request.arguments.line; 14253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var column = request.arguments.column; 14263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var enabled = IS_UNDEFINED(request.arguments.enabled) ? 14273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu true : request.arguments.enabled; 14283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var condition = request.arguments.condition; 14293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var ignoreCount = request.arguments.ignoreCount; 14303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var groupId = request.arguments.groupId; 14313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 14323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 14333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!type || IS_UNDEFINED(target)) { 14343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing argument "type" or "target"'); 14353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 14363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (type != 'function' && type != 'handle' && 14383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu type != 'script' && type != 'scriptId') { 14393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Illegal type "' + type + '"'); 14403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 14413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 14433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Either function or script break point. 14443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point_number; 14453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (type == 'function') { 14463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Handle function break point. 14473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_STRING(target)) { 14483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Argument "target" is not a string value'); 14493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 14503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var f; 14523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 14533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find the function through a global evaluate. 14543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu f = this.exec_state_.evaluateGlobal(target).value(); 14553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch (e) { 14563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Error: "' + %ToString(e) + 14573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu '" evaluating "' + target + '"'); 14583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 14593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_FUNCTION(f)) { 14613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('"' + target + '" does not evaluate to a function'); 14623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 14633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 14653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set function break point. 14663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point_number = Debug.setBreakPoint(f, line, column, condition); 14673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (type == 'handle') { 14683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Find the object pointed by the specified handle. 14693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var handle = parseInt(target, 10); 14703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var mirror = LookupMirror(handle); 14713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!mirror) { 14723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Object #' + handle + '# not found'); 14733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!mirror.isFunction()) { 14753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Object #' + handle + '# is not a function'); 14763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 14783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set function break point. 14793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point_number = Debug.setBreakPoint(mirror.value(), 14803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu line, column, condition); 14813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (type == 'script') { 14823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // set script break point. 14833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point_number = 14843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.setScriptBreakPointByName(target, line, column, condition, 14853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu groupId); 14863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { // type == 'scriptId. 14873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break_point_number = 14883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.setScriptBreakPointById(target, line, column, condition, groupId); 14893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 14913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set additional break point properties. 14923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = Debug.findBreakPoint(break_point_number); 14933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (ignoreCount) { 14943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.changeBreakPointIgnoreCount(break_point_number, ignoreCount); 14953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!enabled) { 14973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.disableBreakPoint(break_point_number); 14983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 14993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add the break point number to the response. 15013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { type: type, 15023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu breakpoint: break_point_number } 15033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add break point information to the response. 15053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_point instanceof ScriptBreakPoint) { 15063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (break_point.type() == Debug.ScriptBreakPointType.ScriptId) { 15073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.type = 'scriptId'; 15083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.script_id = break_point.script_id(); 15093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 15103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.type = 'scriptName'; 15113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.script_name = break_point.script_name(); 15123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.line = break_point.line(); 15143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.column = break_point.column(); 15158defd9ff6930b4e24729971a61cf7469daf119beSteve Block response.body.actual_locations = break_point.actual_locations(); 15163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 15173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.type = 'function'; 15188defd9ff6930b4e24729971a61cf7469daf119beSteve Block response.body.actual_locations = [break_point.actual_location]; 15193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 15213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.changeBreakPointRequest_ = function(request, response) { 15243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal request. 15253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 15263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing arguments'); 15273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 15283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 15313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = %ToNumber(request.arguments.breakpoint); 15323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var enabled = request.arguments.enabled; 15333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var condition = request.arguments.condition; 15343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var ignoreCount = request.arguments.ignoreCount; 15353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 15373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!break_point) { 15383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing argument "breakpoint"'); 15393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 15403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Change enabled state if supplied. 15433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(enabled)) { 15443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (enabled) { 15453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.enableBreakPoint(break_point); 15463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 15473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.disableBreakPoint(break_point); 15483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Change condition if supplied 15523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(condition)) { 15533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.changeBreakPointCondition(break_point, condition); 15543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Change ignore count if supplied 15573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(ignoreCount)) { 15583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.changeBreakPointIgnoreCount(break_point, ignoreCount); 15593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 15613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.clearBreakPointGroupRequest_ = function(request, response) { 15643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal request. 15653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 15663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing arguments'); 15673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 15683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 15713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var group_id = request.arguments.groupId; 15723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 15743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!group_id) { 15753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing argument "groupId"'); 15763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 15773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var cleared_break_points = []; 15803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var new_script_break_points = []; 15813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < script_break_points.length; i++) { 15823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var next_break_point = script_break_points[i]; 15833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (next_break_point.groupId() == group_id) { 15843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu cleared_break_points.push(next_break_point.number()); 15853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu next_break_point.clear(); 15863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 15873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu new_script_break_points.push(next_break_point); 15883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 15903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu script_break_points = new_script_break_points; 15913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add the cleared break point numbers to the response. 15933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { breakpoints: cleared_break_points }; 15943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 15953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 15973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.clearBreakPointRequest_ = function(request, response) { 15983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal request. 15993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 16003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing arguments'); 16013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 16023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 16053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var break_point = %ToNumber(request.arguments.breakpoint); 16063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 16083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!break_point) { 16093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.failed('Missing argument "breakpoint"'); 16103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 16113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Clear break point. 16143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu Debug.clearBreakPoint(break_point); 16153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add the cleared break point number to the response. 16173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { breakpoint: break_point } 16183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 16193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 162025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian MonsenDebugCommandProcessor.prototype.listBreakpointsRequest_ = function(request, response) { 162125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen var array = []; 162225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen for (var i = 0; i < script_break_points.length; i++) { 162325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen var break_point = script_break_points[i]; 162425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 162525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen var description = { 162625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen number: break_point.number(), 162725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen line: break_point.line(), 162825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen column: break_point.column(), 162925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen groupId: break_point.groupId(), 163025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen hit_count: break_point.hit_count(), 163125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen active: break_point.active(), 163225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen condition: break_point.condition(), 16338defd9ff6930b4e24729971a61cf7469daf119beSteve Block ignoreCount: break_point.ignoreCount(), 16348defd9ff6930b4e24729971a61cf7469daf119beSteve Block actual_locations: break_point.actual_locations() 163525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen } 163625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 163725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen if (break_point.type() == Debug.ScriptBreakPointType.ScriptId) { 163825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen description.type = 'scriptId'; 163925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen description.script_id = break_point.script_id(); 164025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen } else { 164125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen description.type = 'scriptName'; 164225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen description.script_name = break_point.script_name(); 164325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen } 164425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen array.push(description); 164525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen } 164625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 164725f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen response.body = { breakpoints: array } 164825f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen} 164925f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 16503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.backtraceRequest_ = function(request, response) { 16523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the number of frames. 16533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var total_frames = this.exec_state_.frameCount(); 16543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create simple response if there are no frames. 16563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (total_frames == 0) { 16573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 16583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu totalFrames: total_frames 16593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 16613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Default frame range to include in backtrace. 16643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var from_index = 0 16653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var to_index = kDefaultBacktraceLength; 16663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the range from the arguments. 16683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 16693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments.fromFrame) { 16703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu from_index = request.arguments.fromFrame; 16713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments.toFrame) { 16733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu to_index = request.arguments.toFrame; 16743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments.bottom) { 16763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var tmp_index = total_frames - from_index; 16773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu from_index = total_frames - to_index 16783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu to_index = tmp_index; 16793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (from_index < 0 || to_index < 0) { 16813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame number'); 16823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Adjust the index. 16863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu to_index = Math.min(total_frames, to_index); 16873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (to_index <= from_index) { 16893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var error = 'Invalid frame range'; 16903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed(error); 16913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 16933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create the response body. 16943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frames = []; 16953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = from_index; i < to_index; i++) { 16963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu frames.push(this.exec_state_.frame(i)); 16973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 16983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 16993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu fromFrame: from_index, 17003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu toFrame: to_index, 17013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu totalFrames: total_frames, 17023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu frames: frames 17033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 17053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.backtracec = function(cmd, args) { 17083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.cframesValue(); 17093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 17103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.frameRequest_ = function(request, response) { 17133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no source. 17143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 17153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No frames'); 17163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // With no arguments just keep the selected frame. 17193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 17203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var index = request.arguments.number; 17213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (index < 0 || this.exec_state_.frameCount() <= index) { 17223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame number'); 17233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_.setSelectedFrame(request.arguments.number); 17263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = this.exec_state_.frame(); 17283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 17293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.frameForScopeRequest_ = function(request) { 17323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the frame for which the scope or scopes are requested. With no frameNumber 17333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // argument use the currently selected frame. 17343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments && !IS_UNDEFINED(request.arguments.frameNumber)) { 17353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu frame_index = request.arguments.frameNumber; 17363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (frame_index < 0 || this.exec_state_.frameCount() <= frame_index) { 17373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame number'); 17383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(frame_index); 17403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 17413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.exec_state_.frame(); 17423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 17443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.scopesRequest_ = function(request, response) { 17473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no scopes. 17483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 17493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No scopes'); 17503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the frame for which the scopes are requested. 17533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame = this.frameForScopeRequest_(request); 17543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Fill all scopes for this frame. 17563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var total_scopes = frame.scopeCount(); 17573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scopes = []; 17583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < total_scopes; i++) { 17593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu scopes.push(frame.scope(i)); 17603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 17623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu fromScope: 0, 17633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu toScope: total_scopes, 17643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu totalScopes: total_scopes, 17653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu scopes: scopes 17663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 17683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.scopeRequest_ = function(request, response) { 17713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no scopes. 17723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 17733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No scopes'); 17743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the frame for which the scope is requested. 17773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame = this.frameForScopeRequest_(request); 17783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // With no scope argument just return top scope. 17803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scope_index = 0; 17813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments && !IS_UNDEFINED(request.arguments.number)) { 17823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu scope_index = %ToNumber(request.arguments.number); 17833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (scope_index < 0 || frame.scopeCount() <= scope_index) { 17843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid scope number'); 17853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = frame.scope(scope_index); 17893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 17903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.evaluateRequest_ = function(request, response) { 17933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 17943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Missing arguments'); 17953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 17963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 17973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 17983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var expression = request.arguments.expression; 17993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame = request.arguments.frame; 18003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var global = request.arguments.global; 18013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var disable_break = request.arguments.disable_break; 18023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // The expression argument could be an integer so we convert it to a 18043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // string. 18053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu try { 18063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu expression = String(expression); 18073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } catch(e) { 18083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Failed to convert expression argument to string'); 18093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 18123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(frame) && global) { 18133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Arguments "frame" and "global" are exclusive'); 18143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Global evaluate. 18173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (global) { 18183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Evaluate in the global context. 18193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = 18203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu this.exec_state_.evaluateGlobal(expression, Boolean(disable_break)); 18213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 18223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Default value for disable_break is true. 18253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(disable_break)) { 18263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu disable_break = true; 18273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no evaluate in frame. 18303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 18313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No frames'); 18323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check whether a frame was specified. 18353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(frame)) { 18363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame_number = %ToNumber(frame); 18373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (frame_number < 0 || frame_number >= this.exec_state_.frameCount()) { 18383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame "' + frame + '"'); 18393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Evaluate in the specified frame. 18413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = this.exec_state_.frame(frame_number).evaluate( 18423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu expression, Boolean(disable_break)); 18433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 18443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 18453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Evaluate in the selected frame. 18463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = this.exec_state_.frame().evaluate( 18473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu expression, Boolean(disable_break)); 18483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return; 18493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 18513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.lookupRequest_ = function(request, response) { 18543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 18553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Missing arguments'); 18563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 18593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var handles = request.arguments.handles; 18603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 18623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(handles)) { 18633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Argument "handles" missing'); 18643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Set 'includeSource' option for script lookup. 18673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(request.arguments.includeSource)) { 18683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu includeSource = %ToBoolean(request.arguments.includeSource); 18693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.setOption('includeSource', includeSource); 18703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Lookup handles. 18733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var mirrors = {}; 18743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < handles.length; i++) { 18753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var handle = handles[i]; 18763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var mirror = LookupMirror(handle); 18773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!mirror) { 18783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Object #' + handle + '# not found'); 18793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu mirrors[handle] = mirror; 18813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = mirrors; 18833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 18843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.referencesRequest_ = 18873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu function(request, response) { 18883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 18893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Missing arguments'); 18903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 18913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 18933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var type = request.arguments.type; 18943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var handle = request.arguments.handle; 18953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 18963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Check for legal arguments. 18973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(type)) { 18983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Argument "type" missing'); 18993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_UNDEFINED(handle)) { 19013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Argument "handle" missing'); 19023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (type != 'referencedBy' && type != 'constructedBy') { 19043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid type "' + type + '"'); 19053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Lookup handle and return objects with references the object. 19083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var mirror = LookupMirror(handle); 19093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (mirror) { 19103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (type == 'referencedBy') { 19113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = mirror.referencedBy(); 19123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 19133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = mirror.constructedBy(); 19143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 19163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Object #' + handle + '# not found'); 19173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 19193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.sourceRequest_ = function(request, response) { 19223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // No frames no source. 19233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (this.exec_state_.frameCount() == 0) { 19243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No source'); 19253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var from_line; 19283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var to_line; 19293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame = this.exec_state_.frame(); 19303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 19313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 19323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu from_line = request.arguments.fromLine; 19333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu to_line = request.arguments.toLine; 19343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(request.arguments.frame)) { 19363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var frame_number = %ToNumber(request.arguments.frame); 19373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (frame_number < 0 || frame_number >= this.exec_state_.frameCount()) { 19383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid frame "' + frame + '"'); 19393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu frame = this.exec_state_.frame(frame_number); 19413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the script selected. 19453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var script = frame.func().script(); 19463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!script) { 19473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('No source'); 19483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the source slice and fill it into the response. 19513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var slice = script.sourceSlice(from_line, to_line); 19523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!slice) { 19533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid line interval'); 19543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = {}; 19563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.source = slice.sourceText(); 19573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.fromLine = slice.from_line; 19583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.toLine = slice.to_line; 19593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.fromPosition = slice.from_position; 19603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.toPosition = slice.to_position; 19613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.totalLines = script.lineCount(); 19623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 19633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.scriptsRequest_ = function(request, response) { 19663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var types = ScriptTypeFlag(Debug.ScriptType.Normal); 19673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var includeSource = false; 19683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var idsToInclude = null; 19693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments) { 19703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Pull out arguments. 19713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(request.arguments.types)) { 19723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu types = %ToNumber(request.arguments.types); 19733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (isNaN(types) || types < 0) { 19743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Invalid types "' + request.arguments.types + '"'); 19753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 19783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(request.arguments.includeSource)) { 19793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu includeSource = %ToBoolean(request.arguments.includeSource); 19803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.setOption('includeSource', includeSource); 19813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 19833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (IS_ARRAY(request.arguments.ids)) { 19843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu idsToInclude = {}; 19853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var ids = request.arguments.ids; 19863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < ids.length; i++) { 19873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu idsToInclude[ids[i]] = true; 19883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 19913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Collect all scripts in the heap. 19933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var scripts = %DebugGetLoadedScripts(); 19943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = []; 19963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 19973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < scripts.length; i++) { 19983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (idsToInclude && !idsToInclude[scripts[i].id]) { 19993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu continue; 20003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (types & ScriptTypeFlag(scripts[i].type)) { 20023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body.push(MakeMirror(scripts[i])); 20033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 20063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.threadsRequest_ = function(request, response) { 20093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get the number of threads. 20103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var total_threads = this.exec_state_.threadCount(); 20113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Get information for all threads. 20133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var threads = []; 20143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < total_threads; i++) { 20153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var details = %GetThreadDetails(this.exec_state_.break_id, i); 20163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var thread_info = { current: details[0], 20173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu id: details[1] 20183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu threads.push(thread_info); 20203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Create the response body. 20233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 20243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu totalThreads: total_threads, 20253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu threads: threads 20263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 20283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.suspendRequest_ = function(request, response) { 20313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.running = false; 20323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 20333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.versionRequest_ = function(request, response) { 20363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = { 20373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu V8Version: %GetV8Version() 20383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 20403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.profileRequest_ = function(request, response) { 20433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!request.arguments) { 20443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Missing arguments'); 20453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var modules = parseInt(request.arguments.modules); 20473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (isNaN(modules)) { 20483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Modules is not an integer'); 20493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 2050402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu var tag = parseInt(request.arguments.tag); 2051402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu if (isNaN(tag)) { 2052402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu tag = 0; 2053402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu } 20543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (request.arguments.command == 'resume') { 2055402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu %ProfilerResume(modules, tag); 20563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (request.arguments.command == 'pause') { 2057402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu %ProfilerPause(modules, tag); 20583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 20593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return response.failed('Unknown command'); 20603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 20613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu response.body = {}; 20623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 20633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 20656ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockDebugCommandProcessor.prototype.changeLiveRequest_ = function(request, response) { 20666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!Debug.LiveEdit) { 20676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return response.failed('LiveEdit feature is not supported'); 20686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 20696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!request.arguments) { 20706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return response.failed('Missing arguments'); 20716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 20726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var script_id = request.arguments.script_id; 20738defd9ff6930b4e24729971a61cf7469daf119beSteve Block var preview_only = !!request.arguments.preview_only; 20746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 20756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var scripts = %DebugGetLoadedScripts(); 20766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 20776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var the_script = null; 20786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block for (var i = 0; i < scripts.length; i++) { 20796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (scripts[i].id == script_id) { 20806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block the_script = scripts[i]; 20816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 20826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 20836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!the_script) { 20846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block response.failed('Script not found'); 20856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return; 20866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 20876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 20886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var change_log = new Array(); 20896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 20906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!IS_STRING(request.arguments.new_source)) { 20916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block throw "new_source argument expected"; 20926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 20936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 20946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block var new_source = request.arguments.new_source; 20956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 20968defd9ff6930b4e24729971a61cf7469daf119beSteve Block var result_description = Debug.LiveEdit.SetScriptSource(the_script, 20978defd9ff6930b4e24729971a61cf7469daf119beSteve Block new_source, preview_only, change_log); 20988defd9ff6930b4e24729971a61cf7469daf119beSteve Block response.body = {change_log: change_log, result: result_description}; 20996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 21006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 21016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 21023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Check whether the previously processed command caused the VM to become 21033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// running. 21043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.isRunning = function() { 21053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return this.running_; 21063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 21073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.systemBreak = function(cmd, args) { 21103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return %SystemBreak(); 21113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 21123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction NumberToHex8Str(n) { 21153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var r = ""; 21163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < 8; ++i) { 21173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var c = hexCharArray[n & 0x0F]; // hexCharArray is defined in uri.js 21183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu r = c + r; 21193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu n = n >>> 4; 21203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return r; 21223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 21233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.formatCFrames = function(cframes_value) { 21253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var result = ""; 21263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (cframes_value == null || cframes_value.length == 0) { 21273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result += "(stack empty)"; 21283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 21293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < cframes_value.length; ++i) { 21303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (i != 0) result += "\n"; 21313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result += this.formatCFrame(cframes_value[i]); 21323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return result; 21353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}; 21363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuDebugCommandProcessor.prototype.formatCFrame = function(cframe_value) { 21393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var result = ""; 21403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result += "0x" + NumberToHex8Str(cframe_value.address); 21413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(cframe_value.text)) { 21423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu result += " " + cframe_value.text; 21433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return result; 21453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 21463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/** 21493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Convert an Object to its debugger protocol representation. The representation 21503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * may be serilized to a JSON object using JSON.stringify(). 21513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * This implementation simply runs through all string property names, converts 21523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * each property value to a protocol value and adds the property to the result 21533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * object. For type "object" the function will be called recursively. Note that 21543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * circular structures will cause infinite recursion. 21553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Object} object The object to format as protocol object. 21563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {MirrorSerializer} mirror_serializer The serializer to use if any 21573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * mirror objects are encountered. 21583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Object} Protocol object value. 21593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */ 21603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ObjectToProtocolObject_(object, mirror_serializer) { 21613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var content = {}; 21623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var key in object) { 21633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Only consider string keys. 21643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (typeof key == 'string') { 21653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Format the value based on its type. 21663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var property_value_json = ValueToProtocolValue_(object[key], 21673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu mirror_serializer); 21683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Add the property if relevant. 21693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (!IS_UNDEFINED(property_value_json)) { 21703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu content[key] = property_value_json; 21713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 21753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return content; 21763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 21773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/** 21803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * Convert an array to its debugger protocol representation. It will convert 21813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * each array element to a protocol value. 21823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {Array} array The array to format as protocol array. 21833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {MirrorSerializer} mirror_serializer The serializer to use if any 21843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * mirror objects are encountered. 21853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {Array} Protocol array value. 21863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */ 21873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ArrayToProtocolArray_(array, mirror_serializer) { 21883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var json = []; 21893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu for (var i = 0; i < array.length; i++) { 21903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json.push(ValueToProtocolValue_(array[i], mirror_serializer)); 21913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 21923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return json; 21933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 21943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 21963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu/** 21976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block * Convert a value to its debugger protocol representation. 21983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {*} value The value to format as protocol value. 21993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @param {MirrorSerializer} mirror_serializer The serializer to use if any 22003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * mirror objects are encountered. 22013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu * @return {*} Protocol value. 22023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu */ 22033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescufunction ValueToProtocolValue_(value, mirror_serializer) { 22043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Format the value based on its type. 22053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu var json; 22063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu switch (typeof value) { 22073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu case 'object': 22083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu if (value instanceof Mirror) { 22093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = mirror_serializer.serializeValue(value); 22103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else if (IS_ARRAY(value)){ 22113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = ArrayToProtocolArray_(value, mirror_serializer); 22123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } else { 22133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = ObjectToProtocolObject_(value, mirror_serializer); 22143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break; 22163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu case 'boolean': 22183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu case 'string': 22193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu case 'number': 22203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = value; 22213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu break 22223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 22233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu default: 22243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu json = null; 22253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu } 22263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu return json; 22273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu} 2228