1967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met:
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions of source code must retain the above copyright
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       notice, this list of conditions and the following disclaimer.
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions in binary form must reproduce the above
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       copyright notice, this list of conditions and the following
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       disclaimer in the documentation and/or other materials provided
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       with the distribution.
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Neither the name of Google Inc. nor the names of its
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       contributors may be used to endorse or promote products derived
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       from this software without specific prior written permission.
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Default number of frames to include in the response to backtrace request.
29f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kDefaultBacktraceLength = 10;
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar Debug = {};
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Regular expression to skip "crud" at the beginning of a source line which is
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// not really code. Currently the regular expression matches whitespace and
3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// comments.
36f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar sourceLineBeginningSkip = /^(?:\s*(?:\/\*.*?\*\/)*)*/;
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Debug events which can occour in the V8 JavaScript engine. These originate
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// from the API include file debug.h.
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.DebugEvent = { Break: 1,
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     Exception: 2,
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     NewFunction: 3,
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     BeforeCompile: 4,
4471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org                     AfterCompile: 5,
4571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org                     ScriptCollected: 6 };
4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Types of exceptions that can be broken upon.
48c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgDebug.ExceptionBreak = { Caught : 0,
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                         Uncaught: 1 };
5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The different types of steps.
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.StepAction = { StepOut: 0,
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     StepNext: 1,
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     StepIn: 2,
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     StepMin: 3,
5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     StepInMin: 4 };
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The different types of scripts matching enum ScriptType in objects.h.
5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.ScriptType = { Native: 0,
6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     Extension: 1,
6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     Normal: 2 };
6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org// The different types of script compilations matching enum
64e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org// Script::CompilationType in objects.h.
65e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgDebug.ScriptCompilationType = { Host: 0,
66e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org                                Eval: 1,
67e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org                                JSON: 2 };
68e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
697be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// The different script break point types.
707be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgDebug.ScriptBreakPointType = { ScriptId: 0,
71ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                               ScriptName: 1,
72ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                               ScriptRegExp: 2 };
737be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
7493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// The different types of breakpoint position alignments.
7593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// Must match BreakPositionAlignment in debug.h.
7693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgDebug.BreakPositionAlignment = {
7793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  Statement: 0,
7893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  BreakPosition: 1
7993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org};
8093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ScriptTypeFlag(type) {
8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return (1 << type);
8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Globals.
8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvar next_response_seq = 0;
8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvar next_break_point_number = 1;
8843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvar break_points = [];
8943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvar script_break_points = [];
90e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.orgvar debugger_flags = {
91e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  breakPointsActive: {
92e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    value: true,
93e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    getValue: function() { return this.value; },
94e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    setValue: function(value) {
95e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      this.value = !!value;
96e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      %SetDisableBreak(!this.value);
97e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    }
98c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  },
99c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  breakOnCaughtException: {
100c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    getValue: function() { return Debug.isBreakOnException(); },
101c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    setValue: function(value) {
102c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      if (value) {
103c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org        Debug.setBreakOnException();
104c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      } else {
105c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org        Debug.clearBreakOnException();
106c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      }
107c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    }
108c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  },
109c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  breakOnUncaughtException: {
110c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    getValue: function() { return Debug.isBreakOnUncaughtException(); },
111c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    setValue: function(value) {
112c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      if (value) {
113c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org        Debug.setBreakOnUncaughtException();
114c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      } else {
115c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org        Debug.clearBreakOnUncaughtException();
116c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      }
117c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    }
118c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  },
119e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org};
12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Create a new break point object and add it to the list of break points.
123c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgfunction MakeBreakPoint(source_position, opt_script_break_point) {
124c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  var break_point = new BreakPoint(source_position, opt_script_break_point);
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  break_points.push(break_point);
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return break_point;
12741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Object representing a break point.
13143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// NOTE: This object does not have a reference to the function having break
13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// point as this would cause function not to be garbage collected when it is
13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// not used any more. We do not want break points to keep functions alive.
134c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgfunction BreakPoint(source_position, opt_script_break_point) {
13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.source_position_ = source_position;
13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (opt_script_break_point) {
13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    this.script_break_point_ = opt_script_break_point;
13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    this.number_ = next_break_point_number++;
14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
14143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.hit_count_ = 0;
14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.active_ = true;
14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.condition_ = null;
14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.ignoreCount_ = 0;
14541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.number = function() {
14943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.number_;
15043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
15143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.func = function() {
15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.func_;
15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.source_position = function() {
15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.source_position_;
16043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
16143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.hit_count = function() {
16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.hit_count_;
16543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
16643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.active = function() {
16943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.script_break_point()) {
17043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return this.script_break_point().active();
17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.active_;
17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.condition = function() {
17743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.script_break_point() && this.script_break_point().condition()) {
17843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return this.script_break_point().condition();
17943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.condition_;
18143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
18243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.ignoreCount = function() {
18543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.ignoreCount_;
18643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.script_break_point = function() {
19043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.script_break_point_;
19143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.enable = function() {
19543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.active_ = true;
19643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
19743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.disable = function() {
20043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.active_ = false;
20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
20243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.setCondition = function(condition) {
20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.condition_ = condition;
20643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.setIgnoreCount = function(ignoreCount) {
21043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.ignoreCount_ = ignoreCount;
21143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
21343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
21443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.isTriggered = function(exec_state) {
21543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Break point not active - not triggered.
21643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!this.active()) return false;
21743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
21843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for conditional break point.
21943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.condition()) {
22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // If break point has condition try to evaluate it in the top frame.
22143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    try {
2229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      var mirror = exec_state.frame(0).evaluate(this.condition());
22343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // If no sensible mirror or non true value break point not triggered.
22443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (!(mirror instanceof ValueMirror) || !%ToBoolean(mirror.value_)) {
22543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        return false;
22643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
22743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } catch (e) {
22843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Exception evaluating condition counts as not triggered.
22943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return false;
23043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
23143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
23243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Update the hit count.
23443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.hit_count_++;
23543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.script_break_point_) {
23643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    this.script_break_point_.hit_count_++;
23743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
23843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If the break point has an ignore count it is not triggered.
24043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.ignoreCount_ > 0) {
24143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    this.ignoreCount_--;
24243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return false;
24343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
24443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
24543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Break point triggered.
24643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return true;
24743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
24843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
24943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Function called from the runtime when a break point is hit. Returns true if
25143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// the break point is triggered and supposed to break execution.
25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction IsBreakPointTriggered(break_id, break_point) {
25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return break_point.isTriggered(MakeExecutionState(break_id));
25441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
25543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Object representing a script break point. The script is referenced by its
2587be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// script name or script id and the break point is represented as line and
2597be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// column.
26068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.orgfunction ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column,
26193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                          opt_groupId, opt_position_alignment) {
2627be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  this.type_ = type;
2637be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  if (type == Debug.ScriptBreakPointType.ScriptId) {
2647be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    this.script_id_ = script_id_or_name;
265ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  } else if (type == Debug.ScriptBreakPointType.ScriptName) {
2667be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    this.script_name_ = script_id_or_name;
267ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  } else if (type == Debug.ScriptBreakPointType.ScriptRegExp) {
268ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    this.script_regexp_object_ = new RegExp(script_id_or_name);
269ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  } else {
270ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    throw new Error("Unexpected breakpoint type " + type);
2717be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  }
27243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.line_ = opt_line || 0;
27343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.column_ = opt_column;
27468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  this.groupId_ = opt_groupId;
27593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  this.position_alignment_ = IS_UNDEFINED(opt_position_alignment)
27693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      ? Debug.BreakPositionAlignment.Statement : opt_position_alignment;
27743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.hit_count_ = 0;
27843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.active_ = true;
27943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.condition_ = null;
28043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.ignoreCount_ = 0;
28132d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  this.break_points_ = [];
28241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
28343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2854111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org//Creates a clone of script breakpoint that is linked to another script.
2864111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.orgScriptBreakPoint.prototype.cloneForOtherScript = function (other_script) {
2874111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  var copy = new ScriptBreakPoint(Debug.ScriptBreakPointType.ScriptId,
28893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      other_script.id, this.line_, this.column_, this.groupId_,
28993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      this.position_alignment_);
2904111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  copy.number_ = next_break_point_number++;
2914111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  script_break_points.push(copy);
292e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
2934111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  copy.hit_count_ = this.hit_count_;
2944111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  copy.active_ = this.active_;
2954111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  copy.condition_ = this.condition_;
2964111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  copy.ignoreCount_ = this.ignoreCount_;
2974111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  return copy;
2981b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
2994111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
3004111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
30143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.number = function() {
30243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.number_;
30343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
30443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.orgScriptBreakPoint.prototype.groupId = function() {
30768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  return this.groupId_;
30868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org};
30968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
31068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
3117be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgScriptBreakPoint.prototype.type = function() {
3127be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return this.type_;
3137be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org};
3147be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
3157be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
3167be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgScriptBreakPoint.prototype.script_id = function() {
3177be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return this.script_id_;
3187be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org};
3197be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
3207be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
32143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.script_name = function() {
32243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.script_name_;
32343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
32443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
326ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.orgScriptBreakPoint.prototype.script_regexp_object = function() {
327ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  return this.script_regexp_object_;
328ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org};
329ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org
330ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org
33143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.line = function() {
33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.line_;
33343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
33443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.column = function() {
33743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.column_;
33843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34132d961d4454609ab4251a760fc46b19f661da90clrn@chromium.orgScriptBreakPoint.prototype.actual_locations = function() {
34232d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  var locations = [];
34332d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  for (var i = 0; i < this.break_points_.length; i++) {
34432d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    locations.push(this.break_points_[i].actual_location);
34532d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  }
34632d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  return locations;
3471b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
34832d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org
34932d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org
3504111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.orgScriptBreakPoint.prototype.update_positions = function(line, column) {
3514111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  this.line_ = line;
3524111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  this.column_ = column;
3531b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
3544111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
3554111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
35643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.hit_count = function() {
35743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.hit_count_;
35843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
35943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.active = function() {
36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.active_;
36343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
36443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.condition = function() {
36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.condition_;
36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
36943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.ignoreCount = function() {
37243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.ignoreCount_;
37343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
37443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.enable = function() {
37743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.active_ = true;
37843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
37943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
38043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
38143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.disable = function() {
38243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.active_ = false;
38343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
38443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
38543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
38643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.setCondition = function(condition) {
38743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.condition_ = condition;
38843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
38943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.setIgnoreCount = function(ignoreCount) {
39243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.ignoreCount_ = ignoreCount;
39343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Set ignore count on all break points created from this script break point.
39532d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  for (var i = 0; i < this.break_points_.length; i++) {
39632d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    this.break_points_[i].setIgnoreCount(ignoreCount);
39743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
39843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Check whether a script matches this script break point. Currently this is
40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// only based on script name.
40343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.matchesScript = function(script) {
4047be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  if (this.type_ == Debug.ScriptBreakPointType.ScriptId) {
4057be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    return this.script_id_ == script.id;
406ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  } else {
407ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    // We might want to account columns here as well.
408ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    if (!(script.line_offset <= this.line_  &&
409ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org          this.line_ < script.line_offset + script.lineCount())) {
410ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      return false;
411ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    }
412ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    if (this.type_ == Debug.ScriptBreakPointType.ScriptName) {
413ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      return this.script_name_ == script.nameOrSourceURL();
414ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    } else if (this.type_ == Debug.ScriptBreakPointType.ScriptRegExp) {
415ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      return this.script_regexp_object_.test(script.nameOrSourceURL());
41628a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org    } else {
417ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      throw new Error("Unexpected breakpoint type " + this.type_);
418ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    }
4197be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  }
42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Set the script break point in a script.
42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.set = function (script) {
42543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var column = this.column();
42643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var line = this.line();
42743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If the column is undefined the break is on the line. To help locate the
42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // first piece of breakable code on the line try to find the column on the
42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // line which contains some source.
43043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (IS_UNDEFINED(column)) {
43143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var source_line = script.sourceLine(this.line());
43243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Allocate array for caching the columns where the actual source starts.
43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (!script.sourceColumnStart_) {
43543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      script.sourceColumnStart_ = new Array(script.lineCount());
43643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
437c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
43843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Fill cache if needed and get column where the actual source starts.
43943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (IS_UNDEFINED(script.sourceColumnStart_[line])) {
44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      script.sourceColumnStart_[line] =
44143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          source_line.match(sourceLineBeginningSkip)[0].length;
44243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
44343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    column = script.sourceColumnStart_[line];
44443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
44543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Convert the line and column into an absolute position within the script.
44732d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  var position = Debug.findScriptSourcePosition(script, this.line(), column);
448c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
4498bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  // If the position is not found in the script (the script might be shorter
4508bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  // than it used to be) just ignore it.
451690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  if (IS_NULL(position)) return;
452c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
45343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Create a break point object and set the break point.
454c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  break_point = MakeBreakPoint(position, this);
45543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  break_point.setIgnoreCount(this.ignoreCount());
45693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  var actual_position = %SetScriptBreakPoint(script, position,
45793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                             this.position_alignment_,
45893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                             break_point);
45932d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  if (IS_UNDEFINED(actual_position)) {
46032d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    actual_position = position;
4615ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org  }
46232d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  var actual_location = script.locationFromPosition(actual_position, true);
46332d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  break_point.actual_location = { line: actual_location.line,
464ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                  column: actual_location.column,
465ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                  script_id: script.id };
46632d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  this.break_points_.push(break_point);
46743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return break_point;
46843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
46943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
47043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
47143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Clear all the break points created from this script break point
47243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.clear = function () {
47343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var remaining_break_points = [];
47443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < break_points.length; i++) {
47543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (break_points[i].script_break_point() &&
47643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        break_points[i].script_break_point() === this) {
47743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      %ClearBreakPoint(break_points[i]);
47843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
47943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      remaining_break_points.push(break_points[i]);
48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
48243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  break_points = remaining_break_points;
48332d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  this.break_points_ = [];
48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Function called from runtime when a new script is compiled to set any script
48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// break points set in this script.
48943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction UpdateScriptBreakPoints(script) {
49043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < script_break_points.length; i++) {
4911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    var break_point = script_break_points[i];
492967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org    if ((break_point.type() == Debug.ScriptBreakPointType.ScriptName ||
493967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org         break_point.type() == Debug.ScriptBreakPointType.ScriptRegExp) &&
4941b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        break_point.matchesScript(script)) {
4951b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      break_point.set(script);
49643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
49743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
49841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
49943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
50043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5014111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.orgfunction GetScriptBreakPoints(script) {
5024111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  var result = [];
5034111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  for (var i = 0; i < script_break_points.length; i++) {
5044111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org    if (script_break_points[i].matchesScript(script)) {
5054111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org      result.push(script_break_points[i]);
5064111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org    }
5074111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  }
5084111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  return result;
5094111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org}
5104111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
5114111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
512245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebug.setListener = function(listener, opt_data) {
513245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (!IS_FUNCTION(listener) && !IS_UNDEFINED(listener) && !IS_NULL(listener)) {
514245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    throw new Error('Parameters have wrong types.');
515245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
516245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  %SetDebugEventListener(listener, opt_data);
51743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
51843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comDebug.breakExecution = function(f) {
52131e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager  %Break();
52243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
52343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgDebug.breakLocations = function(f, opt_position_aligment) {
52543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.');
52693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  var position_aligment = IS_UNDEFINED(opt_position_aligment)
52793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      ? Debug.BreakPositionAlignment.Statement : opt_position_aligment;
52893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  return %GetBreakLocations(f, position_aligment);
52943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
53043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns a Script object. If the parameter is a function the return value
53243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// is the script in which the function is defined. If the parameter is a string
53343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// the return value is the script for which the script name has that string
534cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// value.  If it is a regexp and there is a unique script whose name matches
535cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// we return that, otherwise undefined.
53643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.findScript = function(func_or_script_name) {
53743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (IS_FUNCTION(func_or_script_name)) {
53843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return %FunctionGetScript(func_or_script_name);
539cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager  } else if (IS_REGEXP(func_or_script_name)) {
540cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    var scripts = Debug.scripts();
541cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    var last_result = null;
542cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    var result_count = 0;
543cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    for (var i in scripts) {
544cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager      var script = scripts[i];
545cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager      if (func_or_script_name.test(script.name)) {
546cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager        last_result = script;
547cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager        result_count++;
548cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager      }
549cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    }
550cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    // Return the unique script matching the regexp.  If there are more
551cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    // than one we don't return a value since there is no good way to
552cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    // decide which one to return.  Returning a "random" one, say the
553cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    // first, would introduce nondeterminism (or something close to it)
554cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    // because the order is the heap iteration order.
555cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    if (result_count == 1) {
556cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager      return last_result;
557cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    } else {
558cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager      return undefined;
559cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    }
56043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
56143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return %GetScript(func_or_script_name);
56243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
56343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
56443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
56543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns the script source. If the parameter is a function the return value
56643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// is the script source for the script in which the function is defined. If the
56743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// parameter is a string the return value is the script for which the script
56843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// name has that string value.
56943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.scriptSource = function(func_or_script_name) {
57043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.findScript(func_or_script_name).source;
57143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
57243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
57343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.source = function(f) {
57443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.');
57543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return %FunctionGetSourceCode(f);
57643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
57743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
57818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgDebug.disassemble = function(f) {
57943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.');
58018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return %DebugDisassembleFunction(f);
58118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org};
58218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
58318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgDebug.disassembleConstructor = function(f) {
58418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.');
58518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return %DebugDisassembleConstructor(f);
58643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
58743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
588357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgDebug.ExecuteInDebugContext = function(f, without_debugger) {
589357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.');
590357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  return %ExecuteInDebugContext(f, !!without_debugger);
591357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org};
592357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
59343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.sourcePosition = function(f) {
59443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.');
59543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return %FunctionGetScriptSourcePosition(f);
59643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
59743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5987be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
5997be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgDebug.findFunctionSourceLocation = function(func, opt_line, opt_column) {
60043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script = %FunctionGetScript(func);
60143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script_offset = %FunctionGetScriptSourcePosition(func);
6027be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return script.locationFromLine(opt_line, opt_column, script_offset);
6031b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
60443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns the character position in a script based on a line number and an
60743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// optional position within that line.
60843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.findScriptSourcePosition = function(script, opt_line, opt_column) {
609c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  var location = script.locationFromLine(opt_line, opt_column);
6108bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  return location ? location.position : null;
6111b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
61243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.findBreakPoint = function(break_point_number, remove) {
61543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point;
61643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < break_points.length; i++) {
61743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (break_points[i].number() == break_point_number) {
61843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      break_point = break_points[i];
61943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Remove the break point from the list if requested.
62043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (remove) {
62143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        break_points.splice(i, 1);
62243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
62343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      break;
62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
62543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
62643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (break_point) {
62743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return break_point;
62843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
62943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return this.findScriptBreakPoint(break_point_number, remove);
63043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
63143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63332d961d4454609ab4251a760fc46b19f661da90clrn@chromium.orgDebug.findBreakPointActualLocations = function(break_point_number) {
63432d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  for (var i = 0; i < script_break_points.length; i++) {
63532d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    if (script_break_points[i].number() == break_point_number) {
63632d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org      return script_break_points[i].actual_locations();
63732d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    }
63832d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  }
63932d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  for (var i = 0; i < break_points.length; i++) {
64032d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    if (break_points[i].number() == break_point_number) {
64132d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org      return [break_points[i].actual_location];
64232d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    }
64332d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  }
64432d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  return [];
6451b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
64643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.setBreakPoint = function(func, opt_line, opt_column, opt_condition) {
64843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_FUNCTION(func)) throw new Error('Parameters have wrong types.');
64937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Break points in API functions are not supported.
65037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (%FunctionIsAPIFunction(func)) {
65137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    throw new Error('Cannot set break point in native code.');
65237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
6537be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  // Find source position relative to start of the function
6547be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  var break_position =
6557be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      this.findFunctionSourceLocation(func, opt_line, opt_column).position;
6567be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  var source_position = break_position - this.sourcePosition(func);
65743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Find the script for the function.
65843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script = %FunctionGetScript(func);
65937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Break in builtin JavaScript code is not supported.
66037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (script.type == Debug.ScriptType.Native) {
66137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    throw new Error('Cannot set break point in native code.');
66237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
66343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If the script for the function has a name convert this to a script break
66443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // point.
6657be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  if (script && script.id) {
66643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Adjust the source position to be script relative.
66743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    source_position += %FunctionGetScriptSourcePosition(func);
66843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Find line and column for the position in the script and set a script
66943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // break point from that.
6703a6061e672323303da424aa33256d0ae621aa3bdager@chromium.org    var location = script.locationFromPosition(source_position, false);
6717be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    return this.setScriptBreakPointById(script.id,
6727be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org                                        location.line, location.column,
6737be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org                                        opt_condition);
67443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
67543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Set a break point directly on the function.
676c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    var break_point = MakeBreakPoint(source_position);
67732d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    var actual_position =
67832d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org        %SetFunctionBreakPoint(func, source_position, break_point);
67932d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    actual_position += this.sourcePosition(func);
68032d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    var actual_location = script.locationFromPosition(actual_position, true);
68132d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    break_point.actual_location = { line: actual_location.line,
682ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                    column: actual_location.column,
683ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                    script_id: script.id };
68443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    break_point.setCondition(opt_condition);
68543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return break_point.number();
68643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
68743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
68843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
68943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
690c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgDebug.setBreakPointByScriptIdAndPosition = function(script_id, position,
69193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                                    condition, enabled,
69293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                                    opt_position_alignment)
693c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org{
694c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  break_point = MakeBreakPoint(position);
695c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  break_point.setCondition(condition);
6961b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!enabled) {
697c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    break_point.disable();
6981b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  }
699c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  var scripts = this.scripts();
70093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  var position_alignment = IS_UNDEFINED(opt_position_alignment)
70193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      ? Debug.BreakPositionAlignment.Statement : opt_position_alignment;
702c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  for (var i = 0; i < scripts.length; i++) {
703c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    if (script_id == scripts[i].id) {
704c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org      break_point.actual_position = %SetScriptBreakPoint(scripts[i], position,
70593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org          position_alignment, break_point);
706c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org      break;
707c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    }
708c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
709c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  return break_point;
710c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
711c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
712c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
71343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.enableBreakPoint = function(break_point_number) {
71443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = this.findBreakPoint(break_point_number, false);
715d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Only enable if the breakpoint hasn't been deleted:
716d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (break_point) {
717d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    break_point.enable();
718d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
71943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
72043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
72143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
72243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.disableBreakPoint = function(break_point_number) {
72343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = this.findBreakPoint(break_point_number, false);
724d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Only enable if the breakpoint hasn't been deleted:
725d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (break_point) {
726d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    break_point.disable();
727d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
72843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
72943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.changeBreakPointCondition = function(break_point_number, condition) {
73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = this.findBreakPoint(break_point_number, false);
73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  break_point.setCondition(condition);
73443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
73543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.changeBreakPointIgnoreCount = function(break_point_number, ignoreCount) {
73843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (ignoreCount < 0) {
73943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    throw new Error('Invalid argument');
74043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
74143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = this.findBreakPoint(break_point_number, false);
74243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  break_point.setIgnoreCount(ignoreCount);
74343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
74443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.clearBreakPoint = function(break_point_number) {
74743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = this.findBreakPoint(break_point_number, true);
74843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (break_point) {
74943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return %ClearBreakPoint(break_point);
75043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
75143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    break_point = this.findScriptBreakPoint(break_point_number, true);
75243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (!break_point) {
75343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      throw new Error('Invalid breakpoint');
75443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
75543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
75643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
75743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.clearAllBreakPoints = function() {
76043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < break_points.length; i++) {
76143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    break_point = break_points[i];
76243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    %ClearBreakPoint(break_point);
76343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
76443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  break_points = [];
76543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
76643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
76743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
768d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebug.disableAllBreakPoints = function() {
769d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Disable all user defined breakpoints:
770d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  for (var i = 1; i < next_break_point_number; i++) {
771d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    Debug.disableBreakPoint(i);
772d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
773d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Disable all exception breakpoints:
774d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  %ChangeBreakOnException(Debug.ExceptionBreak.Caught, false);
775d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, false);
776d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
777d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
778d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
77943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.findScriptBreakPoint = function(break_point_number, remove) {
78043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script_break_point;
78143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < script_break_points.length; i++) {
78243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (script_break_points[i].number() == break_point_number) {
78343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      script_break_point = script_break_points[i];
78443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Remove the break point from the list if requested.
78543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (remove) {
78643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        script_break_point.clear();
78743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        script_break_points.splice(i,1);
78843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
78943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      break;
79043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
79143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
79243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return script_break_point;
7931b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
79443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
79543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7967be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// Sets a breakpoint in a script identified through id or name at the
79743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// specified source line and column within that line.
7987be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgDebug.setScriptBreakPoint = function(type, script_id_or_name,
79968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org                                     opt_line, opt_column, opt_condition,
80093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                     opt_groupId, opt_position_alignment) {
80143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Create script break point object.
8027be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  var script_break_point =
80368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org      new ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column,
80493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                           opt_groupId, opt_position_alignment);
80543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
80643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Assign number to the new script break point and add it.
80743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  script_break_point.number_ = next_break_point_number++;
80843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  script_break_point.setCondition(opt_condition);
80943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  script_break_points.push(script_break_point);
81043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8117be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  // Run through all scripts to see if this script break point matches any
81243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // loaded scripts.
81343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var scripts = this.scripts();
81443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < scripts.length; i++) {
81543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (script_break_point.matchesScript(scripts[i])) {
81643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      script_break_point.set(scripts[i]);
81743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
81843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
81943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return script_break_point.number();
8211b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
82243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8247be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgDebug.setScriptBreakPointById = function(script_id,
8257be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org                                         opt_line, opt_column,
82693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                         opt_condition, opt_groupId,
82793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                         opt_position_alignment) {
8287be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptId,
8297be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org                                  script_id, opt_line, opt_column,
83093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                  opt_condition, opt_groupId,
83193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                  opt_position_alignment);
8321b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
8337be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
8347be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
8357be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgDebug.setScriptBreakPointByName = function(script_name,
8367be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org                                           opt_line, opt_column,
83768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org                                           opt_condition, opt_groupId) {
8387be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptName,
8397be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org                                  script_name, opt_line, opt_column,
84068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org                                  opt_condition, opt_groupId);
8411b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
8427be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
8437be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
844ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.orgDebug.setScriptBreakPointByRegExp = function(script_regexp,
845ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                             opt_line, opt_column,
846ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                             opt_condition, opt_groupId) {
847ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptRegExp,
848ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                  script_regexp, opt_line, opt_column,
849ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                  opt_condition, opt_groupId);
8501b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
851ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org
852ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org
85343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.enableScriptBreakPoint = function(break_point_number) {
85443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script_break_point = this.findScriptBreakPoint(break_point_number, false);
85543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  script_break_point.enable();
85643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
85743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
85843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
85943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.disableScriptBreakPoint = function(break_point_number) {
86043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script_break_point = this.findScriptBreakPoint(break_point_number, false);
86143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  script_break_point.disable();
86243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
86343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
86443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8651b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebug.changeScriptBreakPointCondition = function(
8661b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    break_point_number, condition) {
86743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script_break_point = this.findScriptBreakPoint(break_point_number, false);
86843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  script_break_point.setCondition(condition);
86943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
87043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8721b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebug.changeScriptBreakPointIgnoreCount = function(
8731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    break_point_number, ignoreCount) {
87443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (ignoreCount < 0) {
87543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    throw new Error('Invalid argument');
87643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
87743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script_break_point = this.findScriptBreakPoint(break_point_number, false);
87843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  script_break_point.setIgnoreCount(ignoreCount);
87943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
88043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.scriptBreakPoints = function() {
88343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return script_break_points;
8841b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
88543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.clearStepping = function() {
88831e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager  %ClearStepping();
8891b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
89043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
89143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.setBreakOnException = function() {
892c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  return %ChangeBreakOnException(Debug.ExceptionBreak.Caught, true);
89343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
89443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
89543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.clearBreakOnException = function() {
896c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  return %ChangeBreakOnException(Debug.ExceptionBreak.Caught, false);
897c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org};
898c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
899c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgDebug.isBreakOnException = function() {
900c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  return !!%IsBreakOnException(Debug.ExceptionBreak.Caught);
90143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
90243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
90343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.setBreakOnUncaughtException = function() {
90443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, true);
90543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
90643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
90743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.clearBreakOnUncaughtException = function() {
90843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, false);
90943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
91043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
911c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgDebug.isBreakOnUncaughtException = function() {
912c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  return !!%IsBreakOnException(Debug.ExceptionBreak.Uncaught);
913c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org};
914c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
91593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgDebug.showBreakPoints = function(f, full, opt_position_alignment) {
91643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.');
91743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var source = full ? this.scriptSource(f) : this.source(f);
91843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var offset = full ? this.sourcePosition(f) : 0;
91993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  var locations = this.breakLocations(f, opt_position_alignment);
92043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!locations) return source;
92143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  locations.sort(function(x, y) { return x - y; });
92243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var result = "";
92343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var prev_pos = 0;
92443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var pos;
92543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < locations.length; i++) {
92643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    pos = locations[i] - offset;
92743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += source.slice(prev_pos, pos);
92843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += "[B" + i + "]";
92943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    prev_pos = pos;
93043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
93143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  pos = source.length;
93243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  result += source.substring(prev_pos, pos);
93343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
93443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Get all the scripts currently loaded. Locating all the scripts is based on
93843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// scanning the heap.
93943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.scripts = function() {
94043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Collect all scripts in the heap.
94131e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager  return %DebugGetLoadedScripts();
942e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org};
943e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
944e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
945e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.orgDebug.debuggerFlags = function() {
946e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  return debugger_flags;
947e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org};
948e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
9495f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgDebug.MakeMirror = MakeMirror;
95043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
95143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeExecutionState(break_id) {
95243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return new ExecutionState(break_id);
95341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
95443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
95543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ExecutionState(break_id) {
95643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.break_id = break_id;
95743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.selected_frame = 0;
95841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
95943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
960639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgExecutionState.prototype.prepareStep = function(opt_action, opt_count,
961639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    opt_callframe) {
96243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var action = Debug.StepAction.StepIn;
96343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(opt_action)) action = %ToNumber(opt_action);
96443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var count = opt_count ? %ToNumber(opt_count) : 1;
965639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  var callFrameId = 0;
966639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  if (!IS_UNDEFINED(opt_callframe)) {
967639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    callFrameId = opt_callframe.details_.frameId();
968639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  }
96943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
970639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  return %PrepareStep(this.break_id, action, count, callFrameId);
9711b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
97243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9735f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgExecutionState.prototype.evaluateGlobal = function(source, disable_break,
9745f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    opt_additional_context) {
9755f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  return MakeMirror(%DebugEvaluateGlobal(this.break_id, source,
9765f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org                                         Boolean(disable_break),
9775f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org                                         opt_additional_context));
97843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
97943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comExecutionState.prototype.frameCount = function() {
98143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return %GetFrameCount(this.break_id);
98243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
98343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
984bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgExecutionState.prototype.threadCount = function() {
985bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  return %GetThreadCount(this.break_id);
986bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org};
987bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
9889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comExecutionState.prototype.frame = function(opt_index) {
98943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If no index supplied return the selected frame.
99043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (opt_index == null) opt_index = this.selected_frame;
9911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (opt_index < 0 || opt_index >= this.frameCount()) {
992df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org    throw new Error('Illegal frame index.');
9931b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  }
99443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return new FrameMirror(this.break_id, opt_index);
99543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
99643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
99743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExecutionState.prototype.setSelectedFrame = function(index) {
99843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var i = %ToNumber(index);
9999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (i < 0 || i >= this.frameCount()) throw new Error('Illegal frame index.');
100043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.selected_frame = i;
100143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
100243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comExecutionState.prototype.selectedFrame = function() {
100443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.selected_frame;
100543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
100643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10079d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comExecutionState.prototype.debugCommandProcessor = function(opt_is_running) {
10089d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  return new DebugCommandProcessor(this, opt_is_running);
100943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
101043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
101143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
101243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeBreakEvent(exec_state, break_points_hit) {
101343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return new BreakEvent(exec_state, break_points_hit);
101441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
101543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
101643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
101743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction BreakEvent(exec_state, break_points_hit) {
101843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.exec_state_ = exec_state;
101943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.break_points_hit_ = break_points_hit;
102041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
102143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
102243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10238bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgBreakEvent.prototype.executionState = function() {
10248bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  return this.exec_state_;
10258bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org};
10268bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
10278bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
10288bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgBreakEvent.prototype.eventType = function() {
10298bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  return Debug.DebugEvent.Break;
10308bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org};
10318bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
10328bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
103343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakEvent.prototype.func = function() {
10349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return this.exec_state_.frame(0).func();
103543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
103643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
103743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
103843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakEvent.prototype.sourceLine = function() {
10399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return this.exec_state_.frame(0).sourceLine();
104043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
104143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakEvent.prototype.sourceColumn = function() {
10449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return this.exec_state_.frame(0).sourceColumn();
104543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
104643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakEvent.prototype.sourceLineText = function() {
10499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return this.exec_state_.frame(0).sourceLineText();
105043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
105143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
105243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
105343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakEvent.prototype.breakPointsHit = function() {
105443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.break_points_hit_;
105543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
105643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
105743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
105843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakEvent.prototype.toJSONProtocol = function() {
105943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var o = { seq: next_response_seq++,
106043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            type: "event",
106143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            event: "break",
10629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com            body: { invocationText: this.exec_state_.frame(0).invocationText(),
106343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                  }
1064b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org          };
106543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
106643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Add script related information to the event if available.
106743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script = this.func().script();
106843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (script) {
106943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    o.body.sourceLine = this.sourceLine(),
107043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    o.body.sourceColumn = this.sourceColumn(),
107143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    o.body.sourceLineText = this.sourceLineText(),
10727be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    o.body.script = MakeScriptObject_(script, false);
107343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
107443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
107543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Add an Array of break points hit if any.
107643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.breakPointsHit()) {
107743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    o.body.breakpoints = [];
107843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (var i = 0; i < this.breakPointsHit().length; i++) {
107943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Find the break point number. For break points originating from a
108043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // script break point supply the script break point number.
108143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      var breakpoint = this.breakPointsHit()[i];
108243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      var script_break_point = breakpoint.script_break_point();
108343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      var number;
108443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (script_break_point) {
108543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        number = script_break_point.number();
108643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else {
108743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        number = breakpoint.number();
108843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
108943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      o.body.breakpoints.push(number);
109043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
109143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
1092b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  return JSON.stringify(ObjectToProtocolObject_(o));
109343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
109443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeExceptionEvent(exec_state, exception, uncaught) {
109743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return new ExceptionEvent(exec_state, exception, uncaught);
109841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
109943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11008bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
110143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ExceptionEvent(exec_state, exception, uncaught) {
110243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.exec_state_ = exec_state;
110343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.exception_ = exception;
110443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.uncaught_ = uncaught;
110541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
110643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11078bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
11088bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgExceptionEvent.prototype.executionState = function() {
11098bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  return this.exec_state_;
11108bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org};
11118bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
11128bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
11138bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgExceptionEvent.prototype.eventType = function() {
11148bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  return Debug.DebugEvent.Exception;
11158bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org};
11168bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
11178bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
11188bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgExceptionEvent.prototype.exception = function() {
11198bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  return this.exception_;
11201b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
11218bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
11228bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
112343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExceptionEvent.prototype.uncaught = function() {
112443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.uncaught_;
11251b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
112643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11278bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
112843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExceptionEvent.prototype.func = function() {
11299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return this.exec_state_.frame(0).func();
113043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
113143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExceptionEvent.prototype.sourceLine = function() {
11349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return this.exec_state_.frame(0).sourceLine();
113543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
113643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExceptionEvent.prototype.sourceColumn = function() {
11399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return this.exec_state_.frame(0).sourceColumn();
114043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
114143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
114243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
114343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExceptionEvent.prototype.sourceLineText = function() {
11449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return this.exec_state_.frame(0).sourceLineText();
114543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
114643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
114743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
114843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExceptionEvent.prototype.toJSONProtocol = function() {
1149061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  var o = new ProtocolMessage();
1150061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  o.event = "exception";
1151061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  o.body = { uncaught: this.uncaught_,
1152061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org             exception: MakeMirror(this.exception_)
1153b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org           };
1154c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
1155061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  // Exceptions might happen whithout any JavaScript frames.
1156061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  if (this.exec_state_.frameCount() > 0) {
1157061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    o.body.sourceLine = this.sourceLine();
1158061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    o.body.sourceColumn = this.sourceColumn();
1159061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    o.body.sourceLineText = this.sourceLineText();
1160061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
1161061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    // Add script information to the event if available.
1162061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    var script = this.func().script();
1163061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    if (script) {
11647be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      o.body.script = MakeScriptObject_(script, false);
1165061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    }
1166061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  } else {
1167061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    o.body.sourceLine = -1;
116843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
116943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1170061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  return o.toJSONProtocol();
117143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
117243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1173a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
1174245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgfunction MakeCompileEvent(exec_state, script, before) {
1175245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return new CompileEvent(exec_state, script, before);
117641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
117743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1178a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
1179245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgfunction CompileEvent(exec_state, script, before) {
1180245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  this.exec_state_ = exec_state;
1181245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  this.script_ = MakeMirror(script);
1182245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  this.before_ = before;
118341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
118443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
118543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1186245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgCompileEvent.prototype.executionState = function() {
1187245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return this.exec_state_;
1188245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org};
1189245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
1190245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
11918bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgCompileEvent.prototype.eventType = function() {
1192245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (this.before_) {
1193245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return Debug.DebugEvent.BeforeCompile;
11948bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  } else {
1195245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return Debug.DebugEvent.AfterCompile;
11968bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  }
11978bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org};
11988bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
11998bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
1200245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgCompileEvent.prototype.script = function() {
1201245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return this.script_;
1202245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org};
1203245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
1204245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
1205061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.orgCompileEvent.prototype.toJSONProtocol = function() {
1206061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  var o = new ProtocolMessage();
12075ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org  o.running = true;
1208061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  if (this.before_) {
1209061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    o.event = "beforeCompile";
1210061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  } else {
1211061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    o.event = "afterCompile";
1212061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  }
1213061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  o.body = {};
1214b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  o.body.script = this.script_;
1215061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
1216061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  return o.toJSONProtocol();
12171b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1218061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
1219061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
122043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeNewFunctionEvent(func) {
122143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return new NewFunctionEvent(func);
122241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
122343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1224a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
122543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction NewFunctionEvent(func) {
122643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.func = func;
122741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
122843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12298bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
12308bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgNewFunctionEvent.prototype.eventType = function() {
12318bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  return Debug.DebugEvent.NewFunction;
12328bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org};
12338bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
12348bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
123543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenNewFunctionEvent.prototype.name = function() {
123643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.func.name;
123743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
123843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1239a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
124043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenNewFunctionEvent.prototype.setBreakPoint = function(p) {
124143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Debug.setBreakPoint(this.func, p || 0);
124243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
124343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1244a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
124571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgfunction MakeScriptCollectedEvent(exec_state, id) {
124671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  return new ScriptCollectedEvent(exec_state, id);
124771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org}
124871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
124971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
125071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgfunction ScriptCollectedEvent(exec_state, id) {
125171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  this.exec_state_ = exec_state;
125271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  this.id_ = id;
125371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org}
125471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
125571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
125671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgScriptCollectedEvent.prototype.id = function() {
125771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  return this.id_;
125871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org};
125971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
126071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
126171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgScriptCollectedEvent.prototype.executionState = function() {
126271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  return this.exec_state_;
126371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org};
126471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
126571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
126671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgScriptCollectedEvent.prototype.toJSONProtocol = function() {
126771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  var o = new ProtocolMessage();
126871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  o.running = true;
126971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  o.event = "scriptCollected";
127071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  o.body = {};
127171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  o.body.script = { id: this.id() };
127271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  return o.toJSONProtocol();
12731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
127471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
127571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
12767be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgfunction MakeScriptObject_(script, include_source) {
12777be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  var o = { id: script.id(),
12787be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            name: script.name(),
12797be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            lineOffset: script.lineOffset(),
12807be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            columnOffset: script.columnOffset(),
12817be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            lineCount: script.lineCount(),
12827be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          };
128365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  if (!IS_UNDEFINED(script.data())) {
128465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    o.data = script.data();
128565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  }
12867be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  if (include_source) {
12877be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    o.source = script.source();
12887be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  }
12897be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return o;
12901b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
12917be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
12927be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
12939d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comfunction DebugCommandProcessor(exec_state, opt_is_running) {
129443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.exec_state_ = exec_state;
12959d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  this.running_ = opt_is_running || false;
12961b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
129743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
129843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1299a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgDebugCommandProcessor.prototype.processDebugRequest = function (request) {
1300a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return this.processDebugJSONRequest(request);
13011b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
130243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
130343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1304061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.orgfunction ProtocolMessage(request) {
1305061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  // Update sequence number.
130643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.seq = next_response_seq++;
1307c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
1308061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  if (request) {
1309061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    // If message is based on a request this is a response. Fill the initial
1310061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    // response from the request.
1311061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    this.type = 'response';
1312061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    this.request_seq = request.seq;
1313061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    this.command = request.command;
1314061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  } else {
1315061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    // If message is not based on a request it is a dabugger generated event.
1316061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    this.type = 'event';
1317061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  }
131843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.success = true;
13199d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  // Handler may set this field to control debugger state.
13209d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  this.running = undefined;
132141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
132243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
132343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13249085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgProtocolMessage.prototype.setOption = function(name, value) {
13259085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  if (!this.options_) {
13269085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org    this.options_ = {};
13279085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  }
13289085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  this.options_[name] = value;
13291b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
13309085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
13319085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
133249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgProtocolMessage.prototype.failed = function(message, opt_details) {
133343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.success = false;
133443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.message = message;
133549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (IS_OBJECT(opt_details)) {
133649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    this.error_details = opt_details;
133749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
13381b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
133943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
134043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1341061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.orgProtocolMessage.prototype.toJSONProtocol = function() {
134243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Encode the protocol header.
1343b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var json = {};
1344b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  json.seq= this.seq;
134543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.request_seq) {
1346b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.request_seq = this.request_seq;
134743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
1348b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  json.type = this.type;
1349061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  if (this.event) {
1350b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.event = this.event;
1351061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  }
135243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.command) {
1353b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.command = this.command;
135443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
135543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.success) {
1356b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.success = this.success;
135743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
1358b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.success = false;
135943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
136043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.body) {
136143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Encode the body part.
1362b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    var bodyJson;
13639085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org    var serializer = MakeMirrorSerializer(true, this.options_);
13643291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    if (this.body instanceof Mirror) {
1365b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      bodyJson = serializer.serializeValue(this.body);
136643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else if (this.body instanceof Array) {
1367b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      bodyJson = [];
136843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      for (var i = 0; i < this.body.length; i++) {
13693291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        if (this.body[i] instanceof Mirror) {
1370b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org          bodyJson.push(serializer.serializeValue(this.body[i]));
137143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        } else {
1372b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org          bodyJson.push(ObjectToProtocolObject_(this.body[i], serializer));
137343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        }
137443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
137543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
1376b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      bodyJson = ObjectToProtocolObject_(this.body, serializer);
137743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
1378b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.body = bodyJson;
1379b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.refs = serializer.serializeReferencedObjects();
138043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
138143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.message) {
1382b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.message = this.message;
138343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
138449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (this.error_details) {
138549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    json.error_details = this.error_details;
138649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
13879d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  json.running = this.running;
1388b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  return JSON.stringify(json);
13891b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
139043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
139143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
139243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.createResponse = function(request) {
1393061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  return new ProtocolMessage(request);
139443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
139543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
139643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13971b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebugCommandProcessor.prototype.processDebugJSONRequest = function(
13981b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    json_request) {
139943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var request;  // Current request.
140043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var response;  // Generated response.
140143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  try {
140243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    try {
140343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Convert the JSON string to an object.
1404fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org      request = JSON.parse(json_request);
140543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
140643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Create an initial response.
140743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      response = this.createResponse(request);
140843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
140943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (!request.type) {
141043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        throw new Error('Type not specified');
141143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
141243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
141343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (request.type != 'request') {
141443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        throw new Error("Illegal type '" + request.type + "' in request");
141543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
141643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
141743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (!request.command) {
141843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        throw new Error('Command not specified');
141943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
142043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1421b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org      if (request.arguments) {
1422b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        var args = request.arguments;
1423b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        // TODO(yurys): remove request.arguments.compactFormat check once
1424b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        // ChromeDevTools are switched to 'inlineRefs'
1425b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        if (args.inlineRefs || args.compactFormat) {
1426b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org          response.setOption('inlineRefs', true);
1427b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        }
1428b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        if (!IS_UNDEFINED(args.maxStringLength)) {
1429b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org          response.setOption('maxStringLength', args.maxStringLength);
1430b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        }
14313e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org      }
14323e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org
143343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (request.command == 'continue') {
143443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        this.continueRequest_(request, response);
143543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (request.command == 'break') {
143643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        this.breakRequest_(request, response);
143743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (request.command == 'setbreakpoint') {
143843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        this.setBreakPointRequest_(request, response);
143943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (request.command == 'changebreakpoint') {
144043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        this.changeBreakPointRequest_(request, response);
144143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (request.command == 'clearbreakpoint') {
144243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        this.clearBreakPointRequest_(request, response);
144368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org      } else if (request.command == 'clearbreakpointgroup') {
144468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org        this.clearBreakPointGroupRequest_(request, response);
1445d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      } else if (request.command == 'disconnect') {
1446d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        this.disconnectRequest_(request, response);
1447d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      } else if (request.command == 'setexceptionbreak') {
1448d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        this.setExceptionBreakRequest_(request, response);
1449dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      } else if (request.command == 'listbreakpoints') {
1450dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org        this.listBreakpointsRequest_(request, response);
145143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (request.command == 'backtrace') {
145243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        this.backtraceRequest_(request, response);
145343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (request.command == 'frame') {
145443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        this.frameRequest_(request, response);
1455eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      } else if (request.command == 'scopes') {
1456eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        this.scopesRequest_(request, response);
1457eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      } else if (request.command == 'scope') {
1458eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org        this.scopeRequest_(request, response);
145949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      } else if (request.command == 'setVariableValue') {
146049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org        this.setVariableValueRequest_(request, response);
146143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (request.command == 'evaluate') {
146243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        this.evaluateRequest_(request, response);
1463ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      } else if (request.command == 'lookup') {
1464ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org        this.lookupRequest_(request, response);
1465245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      } else if (request.command == 'references') {
1466245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        this.referencesRequest_(request, response);
146743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (request.command == 'source') {
146843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        this.sourceRequest_(request, response);
146943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (request.command == 'scripts') {
147043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        this.scriptsRequest_(request, response);
1471bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org      } else if (request.command == 'threads') {
1472bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org        this.threadsRequest_(request, response);
14739d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      } else if (request.command == 'suspend') {
14749d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com        this.suspendRequest_(request, response);
14753811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org      } else if (request.command == 'version') {
14763811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org        this.versionRequest_(request, response);
1477ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org      } else if (request.command == 'changelive') {
1478e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org        this.changeLiveRequest_(request, response);
14795a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      } else if (request.command == 'restartframe') {
14805a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        this.restartFrameRequest_(request, response);
1481e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      } else if (request.command == 'flags') {
1482e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org        this.debuggerFlagsRequest_(request, response);
1483d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      } else if (request.command == 'v8flags') {
1484d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        this.v8FlagsRequest_(request, response);
1485d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1486d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      // GC tools:
1487d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      } else if (request.command == 'gc') {
1488d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        this.gcRequest_(request, response);
1489d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
149043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else {
149143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        throw new Error('Unknown command "' + request.command + '" in request');
149243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
149343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } catch (e) {
149443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // If there is no response object created one (without command).
149543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (!response) {
149643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        response = this.createResponse();
149743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
149843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      response.success = false;
149943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      response.message = %ToString(e);
150043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
150143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
150243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Return the response as a JSON encoded string.
150343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    try {
15049d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      if (!IS_UNDEFINED(response.running)) {
15059d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com        // Response controls running state.
15069d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com        this.running_ = response.running;
15079d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      }
150825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org      response.running = this.running_;
150943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return response.toJSONProtocol();
151043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } catch (e) {
151143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Failed to generate response - return generic error.
151243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return '{"seq":' + response.seq + ',' +
151343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen              '"request_seq":' + request.seq + ',' +
151443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen              '"type":"response",' +
151543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen              '"success":false,' +
151643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen              '"message":"Internal error: ' + %ToString(e) + '"}';
151743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
151843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } catch (e) {
151943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Failed in one of the catch blocks above - most generic error.
152043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return '{"seq":0,"type":"response","success":false,"message":"Internal error"}';
152143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
152243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
152343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
152443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
152543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.continueRequest_ = function(request, response) {
152643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for arguments for continue.
152743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (request.arguments) {
152843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var count = 1;
152943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var action = Debug.StepAction.StepIn;
153043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
153143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Pull out arguments.
153243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var stepaction = request.arguments.stepaction;
153343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var stepcount = request.arguments.stepcount;
153443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
153543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Get the stepcount argument if any.
153643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (stepcount) {
153743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      count = %ToNumber(stepcount);
153843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (count < 0) {
153943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        throw new Error('Invalid stepcount argument "' + stepcount + '".');
154043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
154143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
154243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
154343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Get the stepaction argument.
154443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (stepaction) {
154543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (stepaction == 'in') {
154643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        action = Debug.StepAction.StepIn;
154743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (stepaction == 'min') {
154843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        action = Debug.StepAction.StepMin;
154943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (stepaction == 'next') {
155043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        action = Debug.StepAction.StepNext;
155143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (stepaction == 'out') {
155243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        action = Debug.StepAction.StepOut;
155343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else {
155443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        throw new Error('Invalid stepaction argument "' + stepaction + '".');
155543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
155643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
155743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1558f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    // Set up the VM for stepping.
155943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    this.exec_state_.prepareStep(action, count);
156043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
156143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
156243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // VM should be running after executing this request.
156343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.running = true;
156443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
156543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
156643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
156743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.breakRequest_ = function(request, response) {
156843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Ignore as break command does not do anything when broken.
156943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
157043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
157143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
157243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.setBreakPointRequest_ =
157343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    function(request, response) {
157443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for legal request.
157543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!request.arguments) {
157643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.failed('Missing arguments');
157743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
157843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
157943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
158043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Pull out arguments.
158143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var type = request.arguments.type;
158243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var target = request.arguments.target;
158343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var line = request.arguments.line;
158443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var column = request.arguments.column;
158543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var enabled = IS_UNDEFINED(request.arguments.enabled) ?
158643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      true : request.arguments.enabled;
158743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var condition = request.arguments.condition;
158843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var ignoreCount = request.arguments.ignoreCount;
158968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  var groupId = request.arguments.groupId;
159043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
159143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for legal arguments.
159265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  if (!type || IS_UNDEFINED(target)) {
159343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.failed('Missing argument "type" or "target"');
159443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
159543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
159628a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org
159743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Either function or script break point.
159843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point_number;
159943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (type == 'function') {
160043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Handle function break point.
160143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (!IS_STRING(target)) {
160243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      response.failed('Argument "target" is not a string value');
160343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return;
160443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
160543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var f;
160643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    try {
160743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Find the function through a global evaluate.
16089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      f = this.exec_state_.evaluateGlobal(target).value();
160943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } catch (e) {
161043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      response.failed('Error: "' + %ToString(e) +
161143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                      '" evaluating "' + target + '"');
161243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return;
161343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
161443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (!IS_FUNCTION(f)) {
161543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      response.failed('"' + target + '" does not evaluate to a function');
161643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return;
161743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
161843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
161943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Set function break point.
162043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    break_point_number = Debug.setBreakPoint(f, line, column, condition);
162165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  } else if (type == 'handle') {
162265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    // Find the object pointed by the specified handle.
162365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var handle = parseInt(target, 10);
162465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var mirror = LookupMirror(handle);
162565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    if (!mirror) {
162665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      return response.failed('Object #' + handle + '# not found');
162765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    }
162865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    if (!mirror.isFunction()) {
162965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      return response.failed('Object #' + handle + '# is not a function');
163065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    }
163165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
163265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    // Set function break point.
163365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    break_point_number = Debug.setBreakPoint(mirror.value(),
163465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org                                             line, column, condition);
16357be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  } else if (type == 'script') {
163643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // set script break point.
16377be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    break_point_number =
163868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org        Debug.setScriptBreakPointByName(target, line, column, condition,
163968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org                                        groupId);
164028a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  } else if (type == 'scriptId') {
16417be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    break_point_number =
164268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org        Debug.setScriptBreakPointById(target, line, column, condition, groupId);
164328a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  } else if (type == 'scriptRegExp') {
1644ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    break_point_number =
1645ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org        Debug.setScriptBreakPointByRegExp(target, line, column, condition,
1646ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                          groupId);
1647ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  } else {
1648ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    response.failed('Illegal type "' + type + '"');
1649ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    return;
165043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
165143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
165243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Set additional break point properties.
165343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = Debug.findBreakPoint(break_point_number);
165443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (ignoreCount) {
165543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Debug.changeBreakPointIgnoreCount(break_point_number, ignoreCount);
165643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
165743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!enabled) {
165843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Debug.disableBreakPoint(break_point_number);
165943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
166043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
166143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Add the break point number to the response.
166243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body = { type: type,
16631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                    breakpoint: break_point_number };
166443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
166543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Add break point information to the response.
166643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (break_point instanceof ScriptBreakPoint) {
16677be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    if (break_point.type() == Debug.ScriptBreakPointType.ScriptId) {
16687be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      response.body.type = 'scriptId';
16697be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      response.body.script_id = break_point.script_id();
1670ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptName) {
16717be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      response.body.type = 'scriptName';
16727be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      response.body.script_name = break_point.script_name();
1673ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptRegExp) {
1674ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      response.body.type = 'scriptRegExp';
1675ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      response.body.script_regexp = break_point.script_regexp_object().source;
1676ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    } else {
16771b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      throw new Error("Internal error: Unexpected breakpoint type: " +
16781b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                      break_point.type());
16797be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    }
168043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.body.line = break_point.line();
168143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.body.column = break_point.column();
168232d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    response.body.actual_locations = break_point.actual_locations();
168343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
168443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.body.type = 'function';
168532d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    response.body.actual_locations = [break_point.actual_location];
168643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
168743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
168843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
168943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16901b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebugCommandProcessor.prototype.changeBreakPointRequest_ = function(
16911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    request, response) {
169243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for legal request.
169343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!request.arguments) {
169443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.failed('Missing arguments');
169543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
169643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
169743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
169843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Pull out arguments.
169943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = %ToNumber(request.arguments.breakpoint);
170043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var enabled = request.arguments.enabled;
170143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var condition = request.arguments.condition;
170243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var ignoreCount = request.arguments.ignoreCount;
170343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
170443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for legal arguments.
170543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!break_point) {
170643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.failed('Missing argument "breakpoint"');
170743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
170843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
170943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
171043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Change enabled state if supplied.
171143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(enabled)) {
171243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (enabled) {
171343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Debug.enableBreakPoint(break_point);
171443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
171543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Debug.disableBreakPoint(break_point);
171643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
171743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
171843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
171943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Change condition if supplied
172043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(condition)) {
172143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Debug.changeBreakPointCondition(break_point, condition);
172243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
172343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
172443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Change ignore count if supplied
172543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(ignoreCount)) {
172643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Debug.changeBreakPointIgnoreCount(break_point, ignoreCount);
172743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
17281b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
172943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
173043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17311b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebugCommandProcessor.prototype.clearBreakPointGroupRequest_ = function(
17321b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    request, response) {
173368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  // Check for legal request.
173468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  if (!request.arguments) {
173568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    response.failed('Missing arguments');
173668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    return;
173768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  }
173868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
173968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  // Pull out arguments.
174068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  var group_id = request.arguments.groupId;
174168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
174268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  // Check for legal arguments.
174368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  if (!group_id) {
174468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    response.failed('Missing argument "groupId"');
174568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    return;
174668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  }
1747c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
174868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  var cleared_break_points = [];
174968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  var new_script_break_points = [];
175068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  for (var i = 0; i < script_break_points.length; i++) {
175168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    var next_break_point = script_break_points[i];
175268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    if (next_break_point.groupId() == group_id) {
175368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org      cleared_break_points.push(next_break_point.number());
175468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org      next_break_point.clear();
175568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    } else {
175668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org      new_script_break_points.push(next_break_point);
175768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    }
175868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  }
175968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  script_break_points = new_script_break_points;
176068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
176168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  // Add the cleared break point numbers to the response.
176268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  response.body = { breakpoints: cleared_break_points };
17631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
176468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
176568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
17661b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebugCommandProcessor.prototype.clearBreakPointRequest_ = function(
17671b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    request, response) {
176843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for legal request.
176943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!request.arguments) {
177043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.failed('Missing arguments');
177143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
177243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
177343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
177443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Pull out arguments.
177543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = %ToNumber(request.arguments.breakpoint);
177643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
177743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for legal arguments.
177843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!break_point) {
177943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.failed('Missing argument "breakpoint"');
178043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
178143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
178243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
178343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Clear break point.
178443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Debug.clearBreakPoint(break_point);
178537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
178637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Add the cleared break point number to the response.
17871b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  response.body = { breakpoint: break_point };
17881b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
178943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1790e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
17911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebugCommandProcessor.prototype.listBreakpointsRequest_ = function(
17921b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    request, response) {
1793dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  var array = [];
1794dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  for (var i = 0; i < script_break_points.length; i++) {
1795dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    var break_point = script_break_points[i];
1796dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
1797dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    var description = {
1798dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      number: break_point.number(),
1799dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      line: break_point.line(),
1800dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      column: break_point.column(),
1801dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      groupId: break_point.groupId(),
1802dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      hit_count: break_point.hit_count(),
1803dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      active: break_point.active(),
1804dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      condition: break_point.condition(),
180532d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org      ignoreCount: break_point.ignoreCount(),
180632d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org      actual_locations: break_point.actual_locations()
18071b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    };
1808e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
1809dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    if (break_point.type() == Debug.ScriptBreakPointType.ScriptId) {
1810dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      description.type = 'scriptId';
1811dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      description.script_id = break_point.script_id();
1812ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptName) {
1813dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      description.type = 'scriptName';
1814dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      description.script_name = break_point.script_name();
1815ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptRegExp) {
1816ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      description.type = 'scriptRegExp';
1817ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      description.script_regexp = break_point.script_regexp_object().source;
1818ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    } else {
18191b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      throw new Error("Internal error: Unexpected breakpoint type: " +
18201b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                      break_point.type());
1821dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    }
1822dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    array.push(description);
1823dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  }
1824e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
1825d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  response.body = {
1826d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    breakpoints: array,
1827d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    breakOnExceptions: Debug.isBreakOnException(),
1828d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    breakOnUncaughtExceptions: Debug.isBreakOnUncaughtException()
18291b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  };
18301b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1831d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1832d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1833d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugCommandProcessor.prototype.disconnectRequest_ =
1834d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    function(request, response) {
1835d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  Debug.disableAllBreakPoints();
1836d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  this.continueRequest_(request, response);
18371b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1838d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1839d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1840d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugCommandProcessor.prototype.setExceptionBreakRequest_ =
1841d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    function(request, response) {
1842d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Check for legal request.
1843d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (!request.arguments) {
1844d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    response.failed('Missing arguments');
1845d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    return;
1846d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1847d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1848d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Pull out and check the 'type' argument:
1849d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var type = request.arguments.type;
1850d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (!type) {
1851d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    response.failed('Missing argument "type"');
1852d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    return;
1853d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1854d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1855d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Initialize the default value of enable:
1856d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var enabled;
1857d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (type == 'all') {
1858d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    enabled = !Debug.isBreakOnException();
1859d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if (type == 'uncaught') {
1860d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    enabled = !Debug.isBreakOnUncaughtException();
186128a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
1862d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1863d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Pull out and check the 'enabled' argument if present:
1864d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (!IS_UNDEFINED(request.arguments.enabled)) {
1865d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    enabled = request.arguments.enabled;
1866d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if ((enabled != true) && (enabled != false)) {
1867d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      response.failed('Illegal value for "enabled":"' + enabled + '"');
1868d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
1869d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1870d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1871d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Now set the exception break state:
1872d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (type == 'all') {
1873d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    %ChangeBreakOnException(Debug.ExceptionBreak.Caught, enabled);
1874d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if (type == 'uncaught') {
1875d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, enabled);
1876d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else {
1877d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    response.failed('Unknown "type":"' + type + '"');
1878d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1879d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1880d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Add the cleared break point number to the response.
1881d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  response.body = { 'type': type, 'enabled': enabled };
18821b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1883dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
188443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebugCommandProcessor.prototype.backtraceRequest_ = function(
18861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    request, response) {
188743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Get the number of frames.
18889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  var total_frames = this.exec_state_.frameCount();
188943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18908bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  // Create simple response if there are no frames.
18918bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  if (total_frames == 0) {
18928bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org    response.body = {
18938bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org      totalFrames: total_frames
18941b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    };
18958bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org    return;
18968bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  }
18978bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
189843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Default frame range to include in backtrace.
18991b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  var from_index = 0;
190043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var to_index = kDefaultBacktraceLength;
190143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
190243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Get the range from the arguments.
190343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (request.arguments) {
1904b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (request.arguments.fromFrame) {
1905b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      from_index = request.arguments.fromFrame;
1906b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    }
1907b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (request.arguments.toFrame) {
1908b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      to_index = request.arguments.toFrame;
190943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
1910b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (request.arguments.bottom) {
1911b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      var tmp_index = total_frames - from_index;
19121b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      from_index = total_frames - to_index;
1913b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      to_index = tmp_index;
1914b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    }
1915b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (from_index < 0 || to_index < 0) {
191643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return response.failed('Invalid frame number');
191743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
191843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
191943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
192043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Adjust the index.
192143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  to_index = Math.min(total_frames, to_index);
192243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
192343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (to_index <= from_index) {
192443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var error = 'Invalid frame range';
192543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return response.failed(error);
192643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
192743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
192843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Create the response body.
192943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var frames = [];
193043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = from_index; i < to_index; i++) {
19319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    frames.push(this.exec_state_.frame(i));
193243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
193343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body = {
193443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    fromFrame: from_index,
193543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    toFrame: to_index,
193643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    totalFrames: total_frames,
193743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    frames: frames
19381b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  };
193943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
194043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
194143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
194243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.frameRequest_ = function(request, response) {
194337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // No frames no source.
194437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (this.exec_state_.frameCount() == 0) {
194537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    return response.failed('No frames');
194637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
194737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
194843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // With no arguments just keep the selected frame.
1949ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  if (request.arguments) {
1950eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    var index = request.arguments.number;
1951ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    if (index < 0 || this.exec_state_.frameCount() <= index) {
1952ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      return response.failed('Invalid frame number');
1953ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    }
1954c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
195543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    this.exec_state_.setSelectedFrame(request.arguments.number);
195643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
19579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  response.body = this.exec_state_.frame();
195843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
195943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
196043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
196149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgDebugCommandProcessor.prototype.resolveFrameFromScopeDescription_ =
196249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    function(scope_description) {
19631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  // Get the frame for which the scope or scopes are requested.
19641b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  // With no frameNumber argument use the currently selected frame.
196549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (scope_description && !IS_UNDEFINED(scope_description.frameNumber)) {
196649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    frame_index = scope_description.frameNumber;
1967eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    if (frame_index < 0 || this.exec_state_.frameCount() <= frame_index) {
19681044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org      throw new Error('Invalid frame number');
1969eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    }
1970eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return this.exec_state_.frame(frame_index);
1971eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  } else {
1972eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return this.exec_state_.frame();
1973eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
19741b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1975eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1976eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
19771044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// Gets scope host object from request. It is either a function
19781044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// ('functionHandle' argument must be specified) or a stack frame
19791044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// ('frameNumber' may be specified and the current frame is taken by default).
198049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgDebugCommandProcessor.prototype.resolveScopeHolder_ =
198149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    function(scope_description) {
198249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (scope_description && "functionHandle" in scope_description) {
198349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    if (!IS_NUMBER(scope_description.functionHandle)) {
19841044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org      throw new Error('Function handle must be a number');
19851044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    }
198649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    var function_mirror = LookupMirror(scope_description.functionHandle);
19871044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    if (!function_mirror) {
19881044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org      throw new Error('Failed to find function object by handle');
19891044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    }
19901044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    if (!function_mirror.isFunction()) {
19911044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org      throw new Error('Value of non-function type is found by handle');
19921044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    }
19931044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    return function_mirror;
19941044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  } else {
19951044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // No frames no scopes.
19961044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    if (this.exec_state_.frameCount() == 0) {
19971044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org      throw new Error('No scopes');
19981044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    }
19991044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
20001044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // Get the frame for which the scopes are requested.
200149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    var frame = this.resolveFrameFromScopeDescription_(scope_description);
20021044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    return frame;
2003eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
20041044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org}
2005eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2006c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
20071044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgDebugCommandProcessor.prototype.scopesRequest_ = function(request, response) {
200849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var scope_holder = this.resolveScopeHolder_(request.arguments);
20091044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
20101044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  // Fill all scopes for this frame or function.
20111044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  var total_scopes = scope_holder.scopeCount();
2012eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var scopes = [];
2013eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  for (var i = 0; i < total_scopes; i++) {
20141044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    scopes.push(scope_holder.scope(i));
2015eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
2016eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  response.body = {
2017eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    fromScope: 0,
2018eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    toScope: total_scopes,
2019eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    totalScopes: total_scopes,
2020eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    scopes: scopes
20211b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  };
2022eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org};
2023eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2024eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2025eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgDebugCommandProcessor.prototype.scopeRequest_ = function(request, response) {
20261044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  // Get the frame or function for which the scope is requested.
202749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var scope_holder = this.resolveScopeHolder_(request.arguments);
2028eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2029eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // With no scope argument just return top scope.
2030eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var scope_index = 0;
2031eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  if (request.arguments && !IS_UNDEFINED(request.arguments.number)) {
2032eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    scope_index = %ToNumber(request.arguments.number);
20331044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    if (scope_index < 0 || scope_holder.scopeCount() <= scope_index) {
2034eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      return response.failed('Invalid scope number');
2035eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    }
2036eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
2037eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
20381044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  response.body = scope_holder.scope(scope_index);
2039eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org};
2040eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
2041eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
204249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org// Reads value from protocol description. Description may be in form of type
204349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org// (for singletons), raw value (primitive types supported in JSON),
204449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org// string value description plus type (for primitive values) or handle id.
204549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org// Returns raw value or throws exception.
204649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgDebugCommandProcessor.resolveValue_ = function(value_description) {
204749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if ("handle" in value_description) {
204849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    var value_mirror = LookupMirror(value_description.handle);
204949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    if (!value_mirror) {
205049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      throw new Error("Failed to resolve value by handle, ' #" +
205149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org          mapping.handle + "# not found");
205249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    }
205349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    return value_mirror.value();
205449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  } else if ("stringDescription" in value_description) {
205549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    if (value_description.type == BOOLEAN_TYPE) {
205649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      return Boolean(value_description.stringDescription);
205749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    } else if (value_description.type == NUMBER_TYPE) {
205849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      return Number(value_description.stringDescription);
205949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    } if (value_description.type == STRING_TYPE) {
206049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      return String(value_description.stringDescription);
206149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    } else {
206249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      throw new Error("Unknown type");
206349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    }
206449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  } else if ("value" in value_description) {
206549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    return value_description.value;
206649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  } else if (value_description.type == UNDEFINED_TYPE) {
2067690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org    return UNDEFINED;
206849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  } else if (value_description.type == NULL_TYPE) {
206949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    return null;
207049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  } else {
207149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    throw new Error("Failed to parse value description");
207249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
207349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org};
207449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
207549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
207649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgDebugCommandProcessor.prototype.setVariableValueRequest_ =
207749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    function(request, response) {
207849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (!request.arguments) {
207949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    response.failed('Missing arguments');
208049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    return;
208149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
208249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
208349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (IS_UNDEFINED(request.arguments.name)) {
208449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    response.failed('Missing variable name');
208549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
208649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var variable_name = request.arguments.name;
208749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
208849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var scope_description = request.arguments.scope;
208949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
209049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  // Get the frame or function for which the scope is requested.
209149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var scope_holder = this.resolveScopeHolder_(scope_description);
209249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
209349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (IS_UNDEFINED(scope_description.number)) {
209449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    response.failed('Missing scope number');
209549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
209649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var scope_index = %ToNumber(scope_description.number);
209749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
209849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var scope = scope_holder.scope(scope_index);
209949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
210049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var new_value =
210149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      DebugCommandProcessor.resolveValue_(request.arguments.newValue);
210249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
210349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  scope.setVariableValue(variable_name, new_value);
210449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
210549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var new_value_mirror = MakeMirror(new_value);
210649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
210749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  response.body = {
210849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    newValue: new_value_mirror
210949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  };
211049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org};
211149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
211249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
211343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.evaluateRequest_ = function(request, response) {
211443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!request.arguments) {
211543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return response.failed('Missing arguments');
211643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
211743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
211843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Pull out arguments.
211943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var expression = request.arguments.expression;
212043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var frame = request.arguments.frame;
212143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var global = request.arguments.global;
2122bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  var disable_break = request.arguments.disable_break;
21235f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  var additional_context = request.arguments.additional_context;
2124bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund
2125bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  // The expression argument could be an integer so we convert it to a
2126bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  // string.
2127bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  try {
2128bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund    expression = String(expression);
2129bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  } catch(e) {
2130bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund    return response.failed('Failed to convert expression argument to string');
2131bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  }
213243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
213343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for legal arguments.
213443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(frame) && global) {
213543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return response.failed('Arguments "frame" and "global" are exclusive');
213643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
213728a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org
21385f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  var additional_context_object;
21395f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  if (additional_context) {
21405f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    additional_context_object = {};
21415f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    for (var i = 0; i < additional_context.length; i++) {
21425f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      var mapping = additional_context[i];
2143a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
2144a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      if (!IS_STRING(mapping.name)) {
214528a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org        return response.failed("Context element #" + i +
2146a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org            " doesn't contain name:string property");
21475f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      }
2148a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
2149a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      var raw_value = DebugCommandProcessor.resolveValue_(mapping);
2150a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      additional_context_object[mapping.name] = raw_value;
21515f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    }
21525f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  }
215343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
215443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Global evaluate.
215543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (global) {
215646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    // Evaluate in the native context.
21575f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    response.body = this.exec_state_.evaluateGlobal(
21585f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org        expression, Boolean(disable_break), additional_context_object);
215943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
216043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
216143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2162bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  // Default value for disable_break is true.
2163bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  if (IS_UNDEFINED(disable_break)) {
2164bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund    disable_break = true;
2165bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  }
2166bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund
2167381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org  // No frames no evaluate in frame.
2168381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org  if (this.exec_state_.frameCount() == 0) {
2169381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    return response.failed('No frames');
2170381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org  }
2171381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
217243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check whether a frame was specified.
217343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(frame)) {
217443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var frame_number = %ToNumber(frame);
21759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    if (frame_number < 0 || frame_number >= this.exec_state_.frameCount()) {
217643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return response.failed('Invalid frame "' + frame + '"');
217743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
217843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Evaluate in the specified frame.
21799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    response.body = this.exec_state_.frame(frame_number).evaluate(
21805f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org        expression, Boolean(disable_break), additional_context_object);
218143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
218243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
218343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Evaluate in the selected frame.
21849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    response.body = this.exec_state_.frame().evaluate(
21855f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org        expression, Boolean(disable_break), additional_context_object);
218643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
218743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
218843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
218943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
219043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2191ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgDebugCommandProcessor.prototype.lookupRequest_ = function(request, response) {
2192ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  if (!request.arguments) {
2193ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    return response.failed('Missing arguments');
2194ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
2195ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
2196ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Pull out arguments.
219765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  var handles = request.arguments.handles;
2198ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
2199ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Check for legal arguments.
220065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  if (IS_UNDEFINED(handles)) {
220165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    return response.failed('Argument "handles" missing');
2202ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
2203ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
2204b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  // Set 'includeSource' option for script lookup.
2205b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  if (!IS_UNDEFINED(request.arguments.includeSource)) {
2206b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    includeSource = %ToBoolean(request.arguments.includeSource);
2207b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    response.setOption('includeSource', includeSource);
2208b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  }
2209c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
221065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  // Lookup handles.
221165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  var mirrors = {};
221265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  for (var i = 0; i < handles.length; i++) {
221365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var handle = handles[i];
221465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var mirror = LookupMirror(handle);
221565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    if (!mirror) {
221665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      return response.failed('Object #' + handle + '# not found');
221765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    }
221865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    mirrors[handle] = mirror;
2219ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
222065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  response.body = mirrors;
2221ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org};
2222ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
2223ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
2224245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebugCommandProcessor.prototype.referencesRequest_ =
2225245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    function(request, response) {
2226245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (!request.arguments) {
2227245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return response.failed('Missing arguments');
2228245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
2229245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
2230245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Pull out arguments.
2231245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var type = request.arguments.type;
2232245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var handle = request.arguments.handle;
2233245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
2234245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Check for legal arguments.
2235245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (IS_UNDEFINED(type)) {
2236245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return response.failed('Argument "type" missing');
2237245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
2238245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (IS_UNDEFINED(handle)) {
2239245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return response.failed('Argument "handle" missing');
2240245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
2241245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (type != 'referencedBy' && type != 'constructedBy') {
2242245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return response.failed('Invalid type "' + type + '"');
2243245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
2244245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
2245245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Lookup handle and return objects with references the object.
2246245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var mirror = LookupMirror(handle);
2247245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (mirror) {
2248245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    if (type == 'referencedBy') {
2249245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      response.body = mirror.referencedBy();
2250245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    } else {
2251245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      response.body = mirror.constructedBy();
2252245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    }
2253245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  } else {
2254245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return response.failed('Object #' + handle + '# not found');
2255245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
2256245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org};
2257245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
2258245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
225943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.sourceRequest_ = function(request, response) {
226037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // No frames no source.
226137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (this.exec_state_.frameCount() == 0) {
226237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    return response.failed('No source');
226337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
226437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
226543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var from_line;
226643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var to_line;
22679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  var frame = this.exec_state_.frame();
226843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (request.arguments) {
226943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Pull out arguments.
227043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    from_line = request.arguments.fromLine;
227143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    to_line = request.arguments.toLine;
227243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
227343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (!IS_UNDEFINED(request.arguments.frame)) {
227443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      var frame_number = %ToNumber(request.arguments.frame);
22759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      if (frame_number < 0 || frame_number >= this.exec_state_.frameCount()) {
227643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        return response.failed('Invalid frame "' + frame + '"');
227743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
22789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      frame = this.exec_state_.frame(frame_number);
227943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
228043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
228143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
228243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Get the script selected.
228343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script = frame.func().script();
228443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!script) {
228543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return response.failed('No source');
228643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
228743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
228843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Get the source slice and fill it into the response.
228943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var slice = script.sourceSlice(from_line, to_line);
229043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!slice) {
229143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return response.failed('Invalid line interval');
229243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
229343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body = {};
229443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body.source = slice.sourceText();
229543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body.fromLine = slice.from_line;
229643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body.toLine = slice.to_line;
229743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body.fromPosition = slice.from_position;
229843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body.toPosition = slice.to_position;
229943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body.totalLines = script.lineCount();
230043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
230143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
230243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
230343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.scriptsRequest_ = function(request, response) {
230443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var types = ScriptTypeFlag(Debug.ScriptType.Normal);
230541826e77311db718135ef6517b846933dfd275f3ager@chromium.org  var includeSource = false;
2306b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var idsToInclude = null;
230743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (request.arguments) {
230843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Pull out arguments.
230943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (!IS_UNDEFINED(request.arguments.types)) {
231043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      types = %ToNumber(request.arguments.types);
231143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (isNaN(types) || types < 0) {
23121b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        return response.failed('Invalid types "' +
23131b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                               request.arguments.types + '"');
231443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
231543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
231625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
231741826e77311db718135ef6517b846933dfd275f3ager@chromium.org    if (!IS_UNDEFINED(request.arguments.includeSource)) {
231841826e77311db718135ef6517b846933dfd275f3ager@chromium.org      includeSource = %ToBoolean(request.arguments.includeSource);
23199085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org      response.setOption('includeSource', includeSource);
232041826e77311db718135ef6517b846933dfd275f3ager@chromium.org    }
232125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
2322b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (IS_ARRAY(request.arguments.ids)) {
2323b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      idsToInclude = {};
2324b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      var ids = request.arguments.ids;
2325b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      for (var i = 0; i < ids.length; i++) {
2326b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        idsToInclude[ids[i]] = true;
2327b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      }
2328b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    }
2329d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2330d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var filterStr = null;
2331d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var filterNum = null;
2332d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if (!IS_UNDEFINED(request.arguments.filter)) {
2333d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      var num = %ToNumber(request.arguments.filter);
2334d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (!isNaN(num)) {
2335d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        filterNum = num;
2336d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      }
2337d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      filterStr = request.arguments.filter;
2338d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
233943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
234043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
234143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Collect all scripts in the heap.
234231e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager  var scripts = %DebugGetLoadedScripts();
234343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
234443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body = [];
234543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
234643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < scripts.length; i++) {
2347b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (idsToInclude && !idsToInclude[scripts[i].id]) {
2348b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      continue;
2349b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    }
2350d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if (filterStr || filterNum) {
2351d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      var script = scripts[i];
2352d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      var found = false;
2353d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (filterNum && !found) {
2354d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (script.id && script.id === filterNum) {
2355d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          found = true;
2356d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
2357d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      }
2358d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (filterStr && !found) {
2359d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (script.name && script.name.indexOf(filterStr) >= 0) {
2360d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          found = true;
2361d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
2362d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      }
2363d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (!found) continue;
2364d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
236543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (types & ScriptTypeFlag(scripts[i].type)) {
23669085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org      response.body.push(MakeMirror(scripts[i]));
236743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
236843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
236943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
237043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
237143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2372bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgDebugCommandProcessor.prototype.threadsRequest_ = function(request, response) {
2373bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  // Get the number of threads.
2374bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  var total_threads = this.exec_state_.threadCount();
2375bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
2376bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  // Get information for all threads.
2377bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  var threads = [];
2378bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  for (var i = 0; i < total_threads; i++) {
2379bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    var details = %GetThreadDetails(this.exec_state_.break_id, i);
2380bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    var thread_info = { current: details[0],
2381bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org                        id: details[1]
23821b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                      };
2383bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    threads.push(thread_info);
2384bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  }
2385bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
2386bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  // Create the response body.
2387bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  response.body = {
2388bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    totalThreads: total_threads,
2389bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    threads: threads
23901b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  };
2391bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org};
2392bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
2393bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
23949d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comDebugCommandProcessor.prototype.suspendRequest_ = function(request, response) {
23959d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  response.running = false;
23969d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com};
23979d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
23989d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
23993811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgDebugCommandProcessor.prototype.versionRequest_ = function(request, response) {
24003811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  response.body = {
24013811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org    V8Version: %GetV8Version()
24021b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  };
24033811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org};
24043811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
24053811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
24061b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebugCommandProcessor.prototype.changeLiveRequest_ = function(
24071b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    request, response) {
2408ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  if (!request.arguments) {
2409ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    return response.failed('Missing arguments');
2410ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
2411ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  var script_id = request.arguments.script_id;
241269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  var preview_only = !!request.arguments.preview_only;
241342841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org
2414ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  var scripts = %DebugGetLoadedScripts();
2415ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2416ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  var the_script = null;
2417ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  for (var i = 0; i < scripts.length; i++) {
2418ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    if (scripts[i].id == script_id) {
2419ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org      the_script = scripts[i];
2420ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    }
2421ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
2422ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  if (!the_script) {
2423ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    response.failed('Script not found');
2424ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    return;
2425ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
242625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
2427ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  var change_log = new Array();
2428e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
24294111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  if (!IS_STRING(request.arguments.new_source)) {
24304111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org    throw "new_source argument expected";
243125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  }
243225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
24334111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  var new_source = request.arguments.new_source;
243442841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org
243549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var result_description;
243649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  try {
243749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    result_description = Debug.LiveEdit.SetScriptSource(the_script,
243849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org        new_source, preview_only, change_log);
243949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  } catch (e) {
244049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    if (e instanceof Debug.LiveEdit.Failure && "details" in e) {
244149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      response.failed(e.message, e.details);
244249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      return;
244349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    }
244449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    throw e;
244549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
244669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  response.body = {change_log: change_log, result: result_description};
244742841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org
2448e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  if (!preview_only && !this.running_ && result_description.stack_modified) {
2449e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    response.body.stepin_recommended = true;
2450e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  }
2451ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org};
2452ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2453ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
24545a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgDebugCommandProcessor.prototype.restartFrameRequest_ = function(
24555a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    request, response) {
24565a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (!request.arguments) {
24575a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    return response.failed('Missing arguments');
24585a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  }
24595a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  var frame = request.arguments.frame;
24605a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
24615a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // No frames to evaluate in frame.
24625a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (this.exec_state_.frameCount() == 0) {
24635a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    return response.failed('No frames');
24645a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  }
24655a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
24665a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  var frame_mirror;
24675a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // Check whether a frame was specified.
24685a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (!IS_UNDEFINED(frame)) {
24695a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    var frame_number = %ToNumber(frame);
24705a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    if (frame_number < 0 || frame_number >= this.exec_state_.frameCount()) {
24715a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      return response.failed('Invalid frame "' + frame + '"');
24725a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    }
24735a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    // Restart specified frame.
24745a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    frame_mirror = this.exec_state_.frame(frame_number);
24755a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  } else {
24765a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    // Restart selected frame.
24775a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    frame_mirror = this.exec_state_.frame();
24785a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  }
24795a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
24805a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  var result_description = Debug.LiveEdit.RestartFrame(frame_mirror);
24815a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  response.body = {result: result_description};
24825a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org};
24835a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
24845a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
2485e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.orgDebugCommandProcessor.prototype.debuggerFlagsRequest_ = function(request,
2486e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org                                                                 response) {
2487e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  // Check for legal request.
2488e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  if (!request.arguments) {
2489e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    response.failed('Missing arguments');
2490e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    return;
2491e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  }
2492e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
2493e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  // Pull out arguments.
2494e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  var flags = request.arguments.flags;
2495e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
2496e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  response.body = { flags: [] };
2497e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  if (!IS_UNDEFINED(flags)) {
2498e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    for (var i = 0; i < flags.length; i++) {
2499e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      var name = flags[i].name;
2500e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      var debugger_flag = debugger_flags[name];
2501e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      if (!debugger_flag) {
2502e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org        continue;
2503e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      }
2504e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      if ('value' in flags[i]) {
2505e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org        debugger_flag.setValue(flags[i].value);
2506e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      }
2507e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      response.body.flags.push({ name: name, value: debugger_flag.getValue() });
2508e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    }
2509e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  } else {
2510e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    for (var name in debugger_flags) {
2511e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      var value = debugger_flags[name].getValue();
2512e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      response.body.flags.push({ name: name, value: value });
2513e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    }
2514e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  }
25151b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
2516e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
2517e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
2518d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugCommandProcessor.prototype.v8FlagsRequest_ = function(request, response) {
2519d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var flags = request.arguments.flags;
2520d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (!flags) flags = '';
2521d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  %SetFlags(flags);
2522d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
2523d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2524d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2525d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugCommandProcessor.prototype.gcRequest_ = function(request, response) {
2526d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var type = request.arguments.type;
2527d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (!type) type = 'all';
2528d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2529d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var before = %GetHeapUsage();
2530d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  %CollectGarbage(type);
2531d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var after = %GetHeapUsage();
2532d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2533d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  response.body = { "before": before, "after": after };
2534d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
2535d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2536d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2537245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// Check whether the previously processed command caused the VM to become
2538245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// running.
2539245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebugCommandProcessor.prototype.isRunning = function() {
2540245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return this.running_;
25411b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
254243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
254343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
254443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.systemBreak = function(cmd, args) {
254531e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager  return %SystemBreak();
254643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
254743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
254843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
254943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction NumberToHex8Str(n) {
255043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var r = "";
255143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < 8; ++i) {
255243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var c = hexCharArray[n & 0x0F];  // hexCharArray is defined in uri.js
255343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    r = c + r;
255443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    n = n >>> 4;
255543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
255643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return r;
25571b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
255843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
255943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
256043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2561b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * Convert an Object to its debugger protocol representation. The representation
2562b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * may be serilized to a JSON object using JSON.stringify().
2563b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * This implementation simply runs through all string property names, converts
2564b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * each property value to a protocol value and adds the property to the result
2565b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * object. For type "object" the function will be called recursively. Note that
2566b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * circular structures will cause infinite recursion.
2567b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @param {Object} object The object to format as protocol object.
25683291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @param {MirrorSerializer} mirror_serializer The serializer to use if any
25693291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *     mirror objects are encountered.
2570b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @return {Object} Protocol object value.
257143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2572b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.orgfunction ObjectToProtocolObject_(object, mirror_serializer) {
2573b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var content = {};
257443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var key in object) {
257543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Only consider string keys.
257643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (typeof key == 'string') {
257743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Format the value based on its type.
2578b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      var property_value_json = ValueToProtocolValue_(object[key],
2579b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org                                                      mirror_serializer);
258043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Add the property if relevant.
2581b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      if (!IS_UNDEFINED(property_value_json)) {
2582b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        content[key] = property_value_json;
258343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
258443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
258543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
258625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
2587b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  return content;
258841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
258943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2590b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
259143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2592b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * Convert an array to its debugger protocol representation. It will convert
2593b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * each array element to a protocol value.
2594b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @param {Array} array The array to format as protocol array.
25953291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @param {MirrorSerializer} mirror_serializer The serializer to use if any
25963291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *     mirror objects are encountered.
2597b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @return {Array} Protocol array value.
259843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2599b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.orgfunction ArrayToProtocolArray_(array, mirror_serializer) {
2600b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var json = [];
260143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < array.length; i++) {
2602b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.push(ValueToProtocolValue_(array[i], mirror_serializer));
2603b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  }
2604b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  return json;
2605b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org}
2606b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
2607b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
2608b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org/**
260925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org * Convert a value to its debugger protocol representation.
2610b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @param {*} value The value to format as protocol value.
2611b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @param {MirrorSerializer} mirror_serializer The serializer to use if any
2612b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org *     mirror objects are encountered.
2613b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @return {*} Protocol value.
2614b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org */
2615b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.orgfunction ValueToProtocolValue_(value, mirror_serializer) {
2616b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  // Format the value based on its type.
2617b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var json;
2618b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  switch (typeof value) {
2619b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case 'object':
2620b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      if (value instanceof Mirror) {
2621b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        json = mirror_serializer.serializeValue(value);
2622b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      } else if (IS_ARRAY(value)){
2623b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        json = ArrayToProtocolArray_(value, mirror_serializer);
2624b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      } else {
2625b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        json = ObjectToProtocolObject_(value, mirror_serializer);
2626b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      }
2627b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      break;
2628b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
2629b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case 'boolean':
2630b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case 'string':
2631b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case 'number':
2632b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      json = value;
26331b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      break;
2634b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
2635b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    default:
2636b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      json = null;
263743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
263843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return json;
263941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
264049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
264149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgDebug.TestApi = {
264249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  CommandProcessorResolveValue: DebugCommandProcessor.resolveValue_
264349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org};
2644