1967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Default number of frames to include in the response to backtrace request.
6f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kDefaultBacktraceLength = 10;
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar Debug = {};
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Regular expression to skip "crud" at the beginning of a source line which is
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// not really code. Currently the regular expression matches whitespace and
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// comments.
13f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar sourceLineBeginningSkip = /^(?:\s*(?:\/\*.*?\*\/)*)*/;
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Debug events which can occour in the V8 JavaScript engine. These originate
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// from the API include file debug.h.
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.DebugEvent = { Break: 1,
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     Exception: 2,
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     NewFunction: 3,
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     BeforeCompile: 4,
2171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org                     AfterCompile: 5,
225de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                     CompileError: 6,
23d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org                     PromiseEvent: 7,
245fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org                     AsyncTaskEvent: 8,
255fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org                     BreakForCommand: 9 };
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Types of exceptions that can be broken upon.
28c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgDebug.ExceptionBreak = { Caught : 0,
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                         Uncaught: 1 };
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The different types of steps.
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.StepAction = { StepOut: 0,
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     StepNext: 1,
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     StepIn: 2,
3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     StepMin: 3,
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     StepInMin: 4 };
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The different types of scripts matching enum ScriptType in objects.h.
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.ScriptType = { Native: 0,
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     Extension: 1,
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     Normal: 2 };
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org// The different types of script compilations matching enum
44e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org// Script::CompilationType in objects.h.
45e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgDebug.ScriptCompilationType = { Host: 0,
46e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org                                Eval: 1,
47e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org                                JSON: 2 };
48e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
497be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// The different script break point types.
507be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgDebug.ScriptBreakPointType = { ScriptId: 0,
51ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                               ScriptName: 1,
52ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                               ScriptRegExp: 2 };
537be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
5493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// The different types of breakpoint position alignments.
5593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// Must match BreakPositionAlignment in debug.h.
5693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgDebug.BreakPositionAlignment = {
5793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  Statement: 0,
5893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  BreakPosition: 1
5993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org};
6093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ScriptTypeFlag(type) {
6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return (1 << type);
6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Globals.
6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvar next_response_seq = 0;
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvar next_break_point_number = 1;
6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvar break_points = [];
6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvar script_break_points = [];
70e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.orgvar debugger_flags = {
71e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  breakPointsActive: {
72e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    value: true,
73e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    getValue: function() { return this.value; },
74e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    setValue: function(value) {
75e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      this.value = !!value;
76e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      %SetDisableBreak(!this.value);
77e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    }
78c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  },
79c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  breakOnCaughtException: {
80c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    getValue: function() { return Debug.isBreakOnException(); },
81c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    setValue: function(value) {
82c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      if (value) {
83c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org        Debug.setBreakOnException();
84c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      } else {
85c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org        Debug.clearBreakOnException();
86c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      }
87c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    }
88c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  },
89c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  breakOnUncaughtException: {
90c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    getValue: function() { return Debug.isBreakOnUncaughtException(); },
91c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    setValue: function(value) {
92c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      if (value) {
93c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org        Debug.setBreakOnUncaughtException();
94c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      } else {
95c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org        Debug.clearBreakOnUncaughtException();
96c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      }
97c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    }
98c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  },
99e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org};
10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Create a new break point object and add it to the list of break points.
103c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgfunction MakeBreakPoint(source_position, opt_script_break_point) {
104c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  var break_point = new BreakPoint(source_position, opt_script_break_point);
10543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  break_points.push(break_point);
10643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return break_point;
10741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Object representing a break point.
11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// NOTE: This object does not have a reference to the function having break
11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// point as this would cause function not to be garbage collected when it is
11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// not used any more. We do not want break points to keep functions alive.
114c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgfunction BreakPoint(source_position, opt_script_break_point) {
11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.source_position_ = source_position;
11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (opt_script_break_point) {
11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    this.script_break_point_ = opt_script_break_point;
11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    this.number_ = next_break_point_number++;
12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.hit_count_ = 0;
12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.active_ = true;
12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.condition_ = null;
12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.ignoreCount_ = 0;
12541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.number = function() {
12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.number_;
13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
13143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.func = function() {
13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.func_;
13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.source_position = function() {
13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.source_position_;
14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
14143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.hit_count = function() {
14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.hit_count_;
14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.active = function() {
14943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.script_break_point()) {
15043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return this.script_break_point().active();
15143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.active_;
15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.condition = function() {
15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.script_break_point() && this.script_break_point().condition()) {
15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return this.script_break_point().condition();
15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
16043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.condition_;
16143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
16243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.ignoreCount = function() {
16543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.ignoreCount_;
16643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
16743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.script_break_point = function() {
17043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.script_break_point_;
17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.enable = function() {
17543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.active_ = true;
17643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
17743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.disable = function() {
18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.active_ = false;
18143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
18243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.setCondition = function(condition) {
18543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.condition_ = condition;
18643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.setIgnoreCount = function(ignoreCount) {
19043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.ignoreCount_ = ignoreCount;
19143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakPoint.prototype.isTriggered = function(exec_state) {
19543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Break point not active - not triggered.
19643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!this.active()) return false;
19743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for conditional break point.
19943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.condition()) {
20043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // If break point has condition try to evaluate it in the top frame.
20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    try {
2029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      var mirror = exec_state.frame(0).evaluate(this.condition());
20343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // If no sensible mirror or non true value break point not triggered.
20443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (!(mirror instanceof ValueMirror) || !%ToBoolean(mirror.value_)) {
20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        return false;
20643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } catch (e) {
20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Exception evaluating condition counts as not triggered.
20943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return false;
21043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
21143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
21343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Update the hit count.
21443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.hit_count_++;
21543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.script_break_point_) {
21643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    this.script_break_point_.hit_count_++;
21743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
21843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
21943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If the break point has an ignore count it is not triggered.
22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.ignoreCount_ > 0) {
22143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    this.ignoreCount_--;
22243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return false;
22343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
22443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Break point triggered.
22643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return true;
22743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
22843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Function called from the runtime when a break point is hit. Returns true if
23143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// the break point is triggered and supposed to break execution.
23243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction IsBreakPointTriggered(break_id, break_point) {
23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return break_point.isTriggered(MakeExecutionState(break_id));
23441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
23543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Object representing a script break point. The script is referenced by its
2387be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// script name or script id and the break point is represented as line and
2397be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// column.
24068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.orgfunction ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column,
24193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                          opt_groupId, opt_position_alignment) {
2427be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  this.type_ = type;
2437be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  if (type == Debug.ScriptBreakPointType.ScriptId) {
2447be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    this.script_id_ = script_id_or_name;
245ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  } else if (type == Debug.ScriptBreakPointType.ScriptName) {
2467be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    this.script_name_ = script_id_or_name;
247ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  } else if (type == Debug.ScriptBreakPointType.ScriptRegExp) {
248ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    this.script_regexp_object_ = new RegExp(script_id_or_name);
249ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  } else {
250ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    throw new Error("Unexpected breakpoint type " + type);
2517be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  }
25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.line_ = opt_line || 0;
25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.column_ = opt_column;
25468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  this.groupId_ = opt_groupId;
25593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  this.position_alignment_ = IS_UNDEFINED(opt_position_alignment)
25693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      ? Debug.BreakPositionAlignment.Statement : opt_position_alignment;
25743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.hit_count_ = 0;
25843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.active_ = true;
25943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.condition_ = null;
26043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.ignoreCount_ = 0;
26132d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  this.break_points_ = [];
26241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
26443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2654111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org//Creates a clone of script breakpoint that is linked to another script.
2664111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.orgScriptBreakPoint.prototype.cloneForOtherScript = function (other_script) {
2674111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  var copy = new ScriptBreakPoint(Debug.ScriptBreakPointType.ScriptId,
26893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      other_script.id, this.line_, this.column_, this.groupId_,
26993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      this.position_alignment_);
2704111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  copy.number_ = next_break_point_number++;
2714111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  script_break_points.push(copy);
272e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
2734111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  copy.hit_count_ = this.hit_count_;
2744111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  copy.active_ = this.active_;
2754111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  copy.condition_ = this.condition_;
2764111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  copy.ignoreCount_ = this.ignoreCount_;
2774111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  return copy;
2781b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
2794111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
2804111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
28143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.number = function() {
28243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.number_;
28343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
28443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.orgScriptBreakPoint.prototype.groupId = function() {
28768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  return this.groupId_;
28868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org};
28968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
29068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
2917be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgScriptBreakPoint.prototype.type = function() {
2927be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return this.type_;
2937be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org};
2947be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
2957be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
2967be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgScriptBreakPoint.prototype.script_id = function() {
2977be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return this.script_id_;
2987be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org};
2997be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
3007be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
30143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.script_name = function() {
30243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.script_name_;
30343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
30443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
306ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.orgScriptBreakPoint.prototype.script_regexp_object = function() {
307ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  return this.script_regexp_object_;
308ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org};
309ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org
310ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org
31143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.line = function() {
31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.line_;
31343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
31443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.column = function() {
31743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.column_;
31843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
31943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32132d961d4454609ab4251a760fc46b19f661da90clrn@chromium.orgScriptBreakPoint.prototype.actual_locations = function() {
32232d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  var locations = [];
32332d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  for (var i = 0; i < this.break_points_.length; i++) {
32432d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    locations.push(this.break_points_[i].actual_location);
32532d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  }
32632d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  return locations;
3271b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
32832d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org
32932d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org
3304111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.orgScriptBreakPoint.prototype.update_positions = function(line, column) {
3314111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  this.line_ = line;
3324111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  this.column_ = column;
3331b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
3344111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
3354111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
33643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.hit_count = function() {
33743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.hit_count_;
33843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.active = function() {
34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.active_;
34343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
34443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.condition = function() {
34743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.condition_;
34843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
34943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.ignoreCount = function() {
35243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.ignoreCount_;
35343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
35443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.enable = function() {
35743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.active_ = true;
35843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
35943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.disable = function() {
36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.active_ = false;
36343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
36443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.setCondition = function(condition) {
36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.condition_ = condition;
36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
36943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.setIgnoreCount = function(ignoreCount) {
37243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.ignoreCount_ = ignoreCount;
37343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Set ignore count on all break points created from this script break point.
37532d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  for (var i = 0; i < this.break_points_.length; i++) {
37632d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    this.break_points_[i].setIgnoreCount(ignoreCount);
37743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
37843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
37943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
38043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
38143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Check whether a script matches this script break point. Currently this is
38243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// only based on script name.
38343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.matchesScript = function(script) {
3847be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  if (this.type_ == Debug.ScriptBreakPointType.ScriptId) {
3857be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    return this.script_id_ == script.id;
386ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  } else {
387ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    // We might want to account columns here as well.
388ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    if (!(script.line_offset <= this.line_  &&
389ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org          this.line_ < script.line_offset + script.lineCount())) {
390ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      return false;
391ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    }
392ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    if (this.type_ == Debug.ScriptBreakPointType.ScriptName) {
393ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      return this.script_name_ == script.nameOrSourceURL();
394ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    } else if (this.type_ == Debug.ScriptBreakPointType.ScriptRegExp) {
395ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      return this.script_regexp_object_.test(script.nameOrSourceURL());
39628a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org    } else {
397ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      throw new Error("Unexpected breakpoint type " + this.type_);
398ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    }
3997be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  }
40043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
40143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Set the script break point in a script.
40443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.set = function (script) {
40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var column = this.column();
40643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var line = this.line();
40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If the column is undefined the break is on the line. To help locate the
40843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // first piece of breakable code on the line try to find the column on the
40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // line which contains some source.
41043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (IS_UNDEFINED(column)) {
41143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var source_line = script.sourceLine(this.line());
41243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Allocate array for caching the columns where the actual source starts.
41443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (!script.sourceColumnStart_) {
41543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      script.sourceColumnStart_ = new Array(script.lineCount());
41643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
417c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
41843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Fill cache if needed and get column where the actual source starts.
41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (IS_UNDEFINED(script.sourceColumnStart_[line])) {
42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      script.sourceColumnStart_[line] =
42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          source_line.match(sourceLineBeginningSkip)[0].length;
42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    column = script.sourceColumnStart_[line];
42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
42543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Convert the line and column into an absolute position within the script.
42732d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  var position = Debug.findScriptSourcePosition(script, this.line(), column);
428c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
4298bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  // If the position is not found in the script (the script might be shorter
4308bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  // than it used to be) just ignore it.
431690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org  if (IS_NULL(position)) return;
432c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
43343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Create a break point object and set the break point.
434c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  break_point = MakeBreakPoint(position, this);
43543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  break_point.setIgnoreCount(this.ignoreCount());
43693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  var actual_position = %SetScriptBreakPoint(script, position,
43793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                             this.position_alignment_,
43893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                             break_point);
43932d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  if (IS_UNDEFINED(actual_position)) {
44032d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    actual_position = position;
4415ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org  }
44232d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  var actual_location = script.locationFromPosition(actual_position, true);
44332d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  break_point.actual_location = { line: actual_location.line,
444ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                  column: actual_location.column,
445ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                  script_id: script.id };
44632d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  this.break_points_.push(break_point);
44743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return break_point;
44843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
44943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
45043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
45143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Clear all the break points created from this script break point
45243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenScriptBreakPoint.prototype.clear = function () {
45343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var remaining_break_points = [];
45443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < break_points.length; i++) {
45543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (break_points[i].script_break_point() &&
45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        break_points[i].script_break_point() === this) {
45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      %ClearBreakPoint(break_points[i]);
45843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      remaining_break_points.push(break_points[i]);
46043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
46143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  break_points = remaining_break_points;
46332d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  this.break_points_ = [];
46443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
46543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
46743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Function called from runtime when a new script is compiled to set any script
46843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// break points set in this script.
46943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction UpdateScriptBreakPoints(script) {
47043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < script_break_points.length; i++) {
4711b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    var break_point = script_break_points[i];
472967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org    if ((break_point.type() == Debug.ScriptBreakPointType.ScriptName ||
473967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org         break_point.type() == Debug.ScriptBreakPointType.ScriptRegExp) &&
4741b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        break_point.matchesScript(script)) {
4751b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      break_point.set(script);
47643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
47743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
47841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
47943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4814111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.orgfunction GetScriptBreakPoints(script) {
4824111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  var result = [];
4834111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  for (var i = 0; i < script_break_points.length; i++) {
4844111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org    if (script_break_points[i].matchesScript(script)) {
4854111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org      result.push(script_break_points[i]);
4864111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org    }
4874111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  }
4884111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  return result;
4894111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org}
4904111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
4914111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
492245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebug.setListener = function(listener, opt_data) {
493245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (!IS_FUNCTION(listener) && !IS_UNDEFINED(listener) && !IS_NULL(listener)) {
494245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    throw new Error('Parameters have wrong types.');
495245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
496245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  %SetDebugEventListener(listener, opt_data);
49743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
49843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comDebug.breakExecution = function(f) {
50131e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager  %Break();
50243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
50343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
50493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgDebug.breakLocations = function(f, opt_position_aligment) {
50543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.');
50693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  var position_aligment = IS_UNDEFINED(opt_position_aligment)
50793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      ? Debug.BreakPositionAlignment.Statement : opt_position_aligment;
50893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  return %GetBreakLocations(f, position_aligment);
50943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
51043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns a Script object. If the parameter is a function the return value
51243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// is the script in which the function is defined. If the parameter is a string
51343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// the return value is the script for which the script name has that string
514cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// value.  If it is a regexp and there is a unique script whose name matches
515cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager// we return that, otherwise undefined.
51643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.findScript = function(func_or_script_name) {
51743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (IS_FUNCTION(func_or_script_name)) {
51843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return %FunctionGetScript(func_or_script_name);
519cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager  } else if (IS_REGEXP(func_or_script_name)) {
520cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    var scripts = Debug.scripts();
521cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    var last_result = null;
522cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    var result_count = 0;
523cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    for (var i in scripts) {
524cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager      var script = scripts[i];
525cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager      if (func_or_script_name.test(script.name)) {
526cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager        last_result = script;
527cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager        result_count++;
528cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager      }
529cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    }
530cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    // Return the unique script matching the regexp.  If there are more
531cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    // than one we don't return a value since there is no good way to
532cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    // decide which one to return.  Returning a "random" one, say the
533cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    // first, would introduce nondeterminism (or something close to it)
534cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    // because the order is the heap iteration order.
535cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    if (result_count == 1) {
536cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager      return last_result;
537cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    } else {
538cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager      return undefined;
539cbaa060d2827a6c7aab497845a1fe6ae6f2dfab4mads.s.ager    }
54043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return %GetScript(func_or_script_name);
54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
54443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns the script source. If the parameter is a function the return value
54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// is the script source for the script in which the function is defined. If the
54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// parameter is a string the return value is the script for which the script
54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// name has that string value.
54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.scriptSource = function(func_or_script_name) {
55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.findScript(func_or_script_name).source;
55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
55243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.source = function(f) {
55443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.');
55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return %FunctionGetSourceCode(f);
55643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
55743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgDebug.disassemble = function(f) {
55943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.');
56018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return %DebugDisassembleFunction(f);
56118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org};
56218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
56318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgDebug.disassembleConstructor = function(f) {
56418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.');
56518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return %DebugDisassembleConstructor(f);
56643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
56743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
568357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgDebug.ExecuteInDebugContext = function(f, without_debugger) {
569357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.');
570357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  return %ExecuteInDebugContext(f, !!without_debugger);
571357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org};
572357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
57343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.sourcePosition = function(f) {
57443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.');
57543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return %FunctionGetScriptSourcePosition(f);
57643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
57743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5787be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
5797be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgDebug.findFunctionSourceLocation = function(func, opt_line, opt_column) {
58043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script = %FunctionGetScript(func);
58143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script_offset = %FunctionGetScriptSourcePosition(func);
5827be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return script.locationFromLine(opt_line, opt_column, script_offset);
5831b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
58443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns the character position in a script based on a line number and an
58743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// optional position within that line.
58843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.findScriptSourcePosition = function(script, opt_line, opt_column) {
589c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  var location = script.locationFromLine(opt_line, opt_column);
5908bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  return location ? location.position : null;
5911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
59243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
59343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
59443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.findBreakPoint = function(break_point_number, remove) {
59543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point;
59643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < break_points.length; i++) {
59743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (break_points[i].number() == break_point_number) {
59843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      break_point = break_points[i];
59943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Remove the break point from the list if requested.
60043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (remove) {
60143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        break_points.splice(i, 1);
60243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
60343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      break;
60443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
60543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
60643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (break_point) {
60743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return break_point;
60843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
60943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return this.findScriptBreakPoint(break_point_number, remove);
61043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
61143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
61243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61332d961d4454609ab4251a760fc46b19f661da90clrn@chromium.orgDebug.findBreakPointActualLocations = function(break_point_number) {
61432d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  for (var i = 0; i < script_break_points.length; i++) {
61532d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    if (script_break_points[i].number() == break_point_number) {
61632d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org      return script_break_points[i].actual_locations();
61732d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    }
61832d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  }
61932d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  for (var i = 0; i < break_points.length; i++) {
62032d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    if (break_points[i].number() == break_point_number) {
62132d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org      return [break_points[i].actual_location];
62232d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    }
62332d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  }
62432d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org  return [];
6251b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
62643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.setBreakPoint = function(func, opt_line, opt_column, opt_condition) {
62843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_FUNCTION(func)) throw new Error('Parameters have wrong types.');
62937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Break points in API functions are not supported.
63037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (%FunctionIsAPIFunction(func)) {
63137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    throw new Error('Cannot set break point in native code.');
63237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
6337be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  // Find source position relative to start of the function
6347be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  var break_position =
6357be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      this.findFunctionSourceLocation(func, opt_line, opt_column).position;
6367be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  var source_position = break_position - this.sourcePosition(func);
63743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Find the script for the function.
63843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script = %FunctionGetScript(func);
63937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Break in builtin JavaScript code is not supported.
64037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (script.type == Debug.ScriptType.Native) {
64137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    throw new Error('Cannot set break point in native code.');
64237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
64343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If the script for the function has a name convert this to a script break
64443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // point.
6457be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  if (script && script.id) {
64643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Adjust the source position to be script relative.
64743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    source_position += %FunctionGetScriptSourcePosition(func);
64843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Find line and column for the position in the script and set a script
64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // break point from that.
6503a6061e672323303da424aa33256d0ae621aa3bdager@chromium.org    var location = script.locationFromPosition(source_position, false);
6517be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    return this.setScriptBreakPointById(script.id,
6527be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org                                        location.line, location.column,
6537be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org                                        opt_condition);
65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
65543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Set a break point directly on the function.
656c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    var break_point = MakeBreakPoint(source_position);
65732d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    var actual_position =
65832d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org        %SetFunctionBreakPoint(func, source_position, break_point);
65932d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    actual_position += this.sourcePosition(func);
66032d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    var actual_location = script.locationFromPosition(actual_position, true);
66132d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    break_point.actual_location = { line: actual_location.line,
662ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                    column: actual_location.column,
663ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                    script_id: script.id };
66443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    break_point.setCondition(opt_condition);
66543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return break_point.number();
66643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
66743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
66843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
66943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
670c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgDebug.setBreakPointByScriptIdAndPosition = function(script_id, position,
67193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                                    condition, enabled,
67293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                                    opt_position_alignment)
673c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org{
674c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  break_point = MakeBreakPoint(position);
675c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  break_point.setCondition(condition);
6761b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (!enabled) {
677c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    break_point.disable();
6781b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  }
679c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  var scripts = this.scripts();
68093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  var position_alignment = IS_UNDEFINED(opt_position_alignment)
68193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      ? Debug.BreakPositionAlignment.Statement : opt_position_alignment;
682c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  for (var i = 0; i < scripts.length; i++) {
683c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    if (script_id == scripts[i].id) {
684c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org      break_point.actual_position = %SetScriptBreakPoint(scripts[i], position,
68593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org          position_alignment, break_point);
686c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org      break;
687c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    }
688c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
689c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  return break_point;
690c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
691c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
692c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
69343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.enableBreakPoint = function(break_point_number) {
69443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = this.findBreakPoint(break_point_number, false);
695d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Only enable if the breakpoint hasn't been deleted:
696d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (break_point) {
697d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    break_point.enable();
698d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
69943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
70043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
70143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
70243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.disableBreakPoint = function(break_point_number) {
70343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = this.findBreakPoint(break_point_number, false);
704d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Only enable if the breakpoint hasn't been deleted:
705d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (break_point) {
706d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    break_point.disable();
707d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
70843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
70943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.changeBreakPointCondition = function(break_point_number, condition) {
71243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = this.findBreakPoint(break_point_number, false);
71343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  break_point.setCondition(condition);
71443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
71543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.changeBreakPointIgnoreCount = function(break_point_number, ignoreCount) {
71843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (ignoreCount < 0) {
71943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    throw new Error('Invalid argument');
72043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
72143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = this.findBreakPoint(break_point_number, false);
72243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  break_point.setIgnoreCount(ignoreCount);
72343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
72443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
72543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
72643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.clearBreakPoint = function(break_point_number) {
72743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = this.findBreakPoint(break_point_number, true);
72843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (break_point) {
72943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return %ClearBreakPoint(break_point);
73043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
73143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    break_point = this.findScriptBreakPoint(break_point_number, true);
73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (!break_point) {
73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      throw new Error('Invalid breakpoint');
73443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
73543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
73643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
73743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.clearAllBreakPoints = function() {
74043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < break_points.length; i++) {
74143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    break_point = break_points[i];
74243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    %ClearBreakPoint(break_point);
74343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
74443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  break_points = [];
74543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
74643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
748d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebug.disableAllBreakPoints = function() {
749d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Disable all user defined breakpoints:
750d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  for (var i = 1; i < next_break_point_number; i++) {
751d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    Debug.disableBreakPoint(i);
752d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
753d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Disable all exception breakpoints:
754d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  %ChangeBreakOnException(Debug.ExceptionBreak.Caught, false);
755d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, false);
756d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
757d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
758d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
75943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.findScriptBreakPoint = function(break_point_number, remove) {
76043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script_break_point;
76143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < script_break_points.length; i++) {
76243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (script_break_points[i].number() == break_point_number) {
76343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      script_break_point = script_break_points[i];
76443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Remove the break point from the list if requested.
76543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (remove) {
76643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        script_break_point.clear();
76743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        script_break_points.splice(i,1);
76843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
76943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      break;
77043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
77143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
77243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return script_break_point;
7731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
77443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
77543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7767be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// Sets a breakpoint in a script identified through id or name at the
77743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// specified source line and column within that line.
7787be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgDebug.setScriptBreakPoint = function(type, script_id_or_name,
77968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org                                     opt_line, opt_column, opt_condition,
78093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                     opt_groupId, opt_position_alignment) {
78143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Create script break point object.
7827be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  var script_break_point =
78368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org      new ScriptBreakPoint(type, script_id_or_name, opt_line, opt_column,
78493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                           opt_groupId, opt_position_alignment);
78543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
78643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Assign number to the new script break point and add it.
78743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  script_break_point.number_ = next_break_point_number++;
78843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  script_break_point.setCondition(opt_condition);
78943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  script_break_points.push(script_break_point);
79043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7917be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  // Run through all scripts to see if this script break point matches any
79243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // loaded scripts.
79343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var scripts = this.scripts();
79443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < scripts.length; i++) {
79543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (script_break_point.matchesScript(scripts[i])) {
79643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      script_break_point.set(scripts[i]);
79743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
79843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
79943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
80043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return script_break_point.number();
8011b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
80243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
80343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8047be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgDebug.setScriptBreakPointById = function(script_id,
8057be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org                                         opt_line, opt_column,
80693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                         opt_condition, opt_groupId,
80793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                         opt_position_alignment) {
8087be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptId,
8097be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org                                  script_id, opt_line, opt_column,
81093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                  opt_condition, opt_groupId,
81193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                  opt_position_alignment);
8121b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
8137be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
8147be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
8157be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgDebug.setScriptBreakPointByName = function(script_name,
8167be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org                                           opt_line, opt_column,
81768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org                                           opt_condition, opt_groupId) {
8187be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptName,
8197be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org                                  script_name, opt_line, opt_column,
82068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org                                  opt_condition, opt_groupId);
8211b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
8227be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
8237be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
824ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.orgDebug.setScriptBreakPointByRegExp = function(script_regexp,
825ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                             opt_line, opt_column,
826ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                             opt_condition, opt_groupId) {
827ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  return this.setScriptBreakPoint(Debug.ScriptBreakPointType.ScriptRegExp,
828ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                  script_regexp, opt_line, opt_column,
829ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                  opt_condition, opt_groupId);
8301b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
831ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org
832ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org
83343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.enableScriptBreakPoint = function(break_point_number) {
83443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script_break_point = this.findScriptBreakPoint(break_point_number, false);
83543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  script_break_point.enable();
83643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
83743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
83843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
83943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.disableScriptBreakPoint = function(break_point_number) {
84043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script_break_point = this.findScriptBreakPoint(break_point_number, false);
84143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  script_break_point.disable();
84243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
84343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
84443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8451b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebug.changeScriptBreakPointCondition = function(
8461b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    break_point_number, condition) {
84743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script_break_point = this.findScriptBreakPoint(break_point_number, false);
84843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  script_break_point.setCondition(condition);
84943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
85043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
85143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8521b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebug.changeScriptBreakPointIgnoreCount = function(
8531b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    break_point_number, ignoreCount) {
85443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (ignoreCount < 0) {
85543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    throw new Error('Invalid argument');
85643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
85743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script_break_point = this.findScriptBreakPoint(break_point_number, false);
85843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  script_break_point.setIgnoreCount(ignoreCount);
85943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
86043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
86143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
86243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.scriptBreakPoints = function() {
86343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return script_break_points;
8641b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
86543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
86643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
86743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.clearStepping = function() {
86831e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager  %ClearStepping();
8691b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
87043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.setBreakOnException = function() {
872c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  return %ChangeBreakOnException(Debug.ExceptionBreak.Caught, true);
87343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
87443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.clearBreakOnException = function() {
876c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  return %ChangeBreakOnException(Debug.ExceptionBreak.Caught, false);
877c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org};
878c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
879c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgDebug.isBreakOnException = function() {
880c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  return !!%IsBreakOnException(Debug.ExceptionBreak.Caught);
88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.setBreakOnUncaughtException = function() {
88443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, true);
88543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
88643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.clearBreakOnUncaughtException = function() {
88843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, false);
88943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
89043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
891c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgDebug.isBreakOnUncaughtException = function() {
892c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  return !!%IsBreakOnException(Debug.ExceptionBreak.Uncaught);
893c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org};
894c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
89593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgDebug.showBreakPoints = function(f, full, opt_position_alignment) {
89643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_FUNCTION(f)) throw new Error('Parameters have wrong types.');
89743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var source = full ? this.scriptSource(f) : this.source(f);
89843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var offset = full ? this.sourcePosition(f) : 0;
89993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  var locations = this.breakLocations(f, opt_position_alignment);
90043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!locations) return source;
90143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  locations.sort(function(x, y) { return x - y; });
90243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var result = "";
90343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var prev_pos = 0;
90443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var pos;
90543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < locations.length; i++) {
90643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    pos = locations[i] - offset;
90743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += source.slice(prev_pos, pos);
90843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    result += "[B" + i + "]";
90943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    prev_pos = pos;
91043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
91143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  pos = source.length;
91243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  result += source.substring(prev_pos, pos);
91343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
91443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
91543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
91643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
91743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Get all the scripts currently loaded. Locating all the scripts is based on
91843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// scanning the heap.
91943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebug.scripts = function() {
92043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Collect all scripts in the heap.
921e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  return %DebugGetLoadedScripts();
922e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org};
923e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
924e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
925e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.orgDebug.debuggerFlags = function() {
926e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  return debugger_flags;
927e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org};
928e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
9295f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgDebug.MakeMirror = MakeMirror;
93043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeExecutionState(break_id) {
93243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return new ExecutionState(break_id);
93341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
93443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ExecutionState(break_id) {
93643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.break_id = break_id;
93743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.selected_frame = 0;
93841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
93943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
940639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgExecutionState.prototype.prepareStep = function(opt_action, opt_count,
941639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    opt_callframe) {
94243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var action = Debug.StepAction.StepIn;
94343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(opt_action)) action = %ToNumber(opt_action);
94443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var count = opt_count ? %ToNumber(opt_count) : 1;
945639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  var callFrameId = 0;
946639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  if (!IS_UNDEFINED(opt_callframe)) {
947639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    callFrameId = opt_callframe.details_.frameId();
948639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  }
94943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
950639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  return %PrepareStep(this.break_id, action, count, callFrameId);
9511b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
95243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9535f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgExecutionState.prototype.evaluateGlobal = function(source, disable_break,
9545f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    opt_additional_context) {
9555f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  return MakeMirror(%DebugEvaluateGlobal(this.break_id, source,
9565f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org                                         Boolean(disable_break),
9575f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org                                         opt_additional_context));
95843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
95943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comExecutionState.prototype.frameCount = function() {
96143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return %GetFrameCount(this.break_id);
96243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
96343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
964bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgExecutionState.prototype.threadCount = function() {
965bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  return %GetThreadCount(this.break_id);
966bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org};
967bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
9689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comExecutionState.prototype.frame = function(opt_index) {
96943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If no index supplied return the selected frame.
97043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (opt_index == null) opt_index = this.selected_frame;
9711b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (opt_index < 0 || opt_index >= this.frameCount()) {
972df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org    throw new Error('Illegal frame index.');
9731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  }
97443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return new FrameMirror(this.break_id, opt_index);
97543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
97643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExecutionState.prototype.setSelectedFrame = function(index) {
97843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var i = %ToNumber(index);
9799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  if (i < 0 || i >= this.frameCount()) throw new Error('Illegal frame index.');
98043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.selected_frame = i;
98143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
98243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comExecutionState.prototype.selectedFrame = function() {
98443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.selected_frame;
98543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
98643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9879d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comExecutionState.prototype.debugCommandProcessor = function(opt_is_running) {
9889d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  return new DebugCommandProcessor(this, opt_is_running);
98943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
99043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
99143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
992c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.orgfunction MakeBreakEvent(break_id, break_points_hit) {
993c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org  return new BreakEvent(break_id, break_points_hit);
99441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
99543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
99643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
997c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.orgfunction BreakEvent(break_id, break_points_hit) {
998c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org  this.frame_ = new FrameMirror(break_id, 0);
99943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.break_points_hit_ = break_points_hit;
100041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
100143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
100243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10038bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgBreakEvent.prototype.eventType = function() {
10048bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  return Debug.DebugEvent.Break;
10058bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org};
10068bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
10078bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
100843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakEvent.prototype.func = function() {
1009c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org  return this.frame_.func();
101043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
101143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
101243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
101343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakEvent.prototype.sourceLine = function() {
1014c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org  return this.frame_.sourceLine();
101543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
101643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
101743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
101843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakEvent.prototype.sourceColumn = function() {
1019c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org  return this.frame_.sourceColumn();
102043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
102143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
102243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
102343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakEvent.prototype.sourceLineText = function() {
1024c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org  return this.frame_.sourceLineText();
102543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
102643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
102743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
102843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakEvent.prototype.breakPointsHit = function() {
102943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.break_points_hit_;
103043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
103143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
103243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
103343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBreakEvent.prototype.toJSONProtocol = function() {
103443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var o = { seq: next_response_seq++,
103543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            type: "event",
103643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen            event: "break",
1037c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org            body: { invocationText: this.frame_.invocationText() }
1038b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org          };
103943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Add script related information to the event if available.
104143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script = this.func().script();
104243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (script) {
104343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    o.body.sourceLine = this.sourceLine(),
104443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    o.body.sourceColumn = this.sourceColumn(),
104543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    o.body.sourceLineText = this.sourceLineText(),
10467be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    o.body.script = MakeScriptObject_(script, false);
104743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
104843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Add an Array of break points hit if any.
105043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.breakPointsHit()) {
105143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    o.body.breakpoints = [];
105243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (var i = 0; i < this.breakPointsHit().length; i++) {
105343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Find the break point number. For break points originating from a
105443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // script break point supply the script break point number.
105543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      var breakpoint = this.breakPointsHit()[i];
105643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      var script_break_point = breakpoint.script_break_point();
105743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      var number;
105843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (script_break_point) {
105943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        number = script_break_point.number();
106043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else {
106143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        number = breakpoint.number();
106243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
106343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      o.body.breakpoints.push(number);
106443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
106543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
1066b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  return JSON.stringify(ObjectToProtocolObject_(o));
106743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
106843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
106943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1070c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.orgfunction MakeExceptionEvent(break_id, exception, uncaught, promise) {
1071c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org  return new ExceptionEvent(break_id, exception, uncaught, promise);
107241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
107343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10748bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
1075c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.orgfunction ExceptionEvent(break_id, exception, uncaught, promise) {
1076c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org  this.exec_state_ = new ExecutionState(break_id);
107743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.exception_ = exception;
107843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.uncaught_ = uncaught;
1079865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  this.promise_ = promise;
108041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
108143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10828bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
10838bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgExceptionEvent.prototype.eventType = function() {
10848bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  return Debug.DebugEvent.Exception;
10858bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org};
10868bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
10878bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
10888bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgExceptionEvent.prototype.exception = function() {
10898bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  return this.exception_;
10901b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
10918bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
10928bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
109343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExceptionEvent.prototype.uncaught = function() {
109443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return this.uncaught_;
10951b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
109643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10978bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
1098865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgExceptionEvent.prototype.promise = function() {
1099865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return this.promise_;
1100865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org};
1101865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
1102865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
110343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExceptionEvent.prototype.func = function() {
11049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return this.exec_state_.frame(0).func();
110543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
110643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
110743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
110843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExceptionEvent.prototype.sourceLine = function() {
11099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return this.exec_state_.frame(0).sourceLine();
111043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
111143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
111243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
111343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExceptionEvent.prototype.sourceColumn = function() {
11149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return this.exec_state_.frame(0).sourceColumn();
111543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
111643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
111743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
111843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExceptionEvent.prototype.sourceLineText = function() {
11199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return this.exec_state_.frame(0).sourceLineText();
112043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
112143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
112243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
112343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenExceptionEvent.prototype.toJSONProtocol = function() {
1124061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  var o = new ProtocolMessage();
1125061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  o.event = "exception";
1126061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  o.body = { uncaught: this.uncaught_,
1127061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org             exception: MakeMirror(this.exception_)
1128b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org           };
1129c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
1130061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  // Exceptions might happen whithout any JavaScript frames.
1131061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  if (this.exec_state_.frameCount() > 0) {
1132061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    o.body.sourceLine = this.sourceLine();
1133061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    o.body.sourceColumn = this.sourceColumn();
1134061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    o.body.sourceLineText = this.sourceLineText();
1135061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
1136061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    // Add script information to the event if available.
1137061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    var script = this.func().script();
1138061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    if (script) {
11397be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      o.body.script = MakeScriptObject_(script, false);
1140061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    }
1141061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  } else {
1142061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    o.body.sourceLine = -1;
114343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
114443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1145061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  return o.toJSONProtocol();
114643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
114743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1148a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
1149248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgfunction MakeCompileEvent(script, type) {
1150248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  return new CompileEvent(script, type);
115141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
115243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1153a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
1154248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgfunction CompileEvent(script, type) {
1155245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  this.script_ = MakeMirror(script);
1156248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  this.type_ = type;
115741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
115843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
115943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11608bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgCompileEvent.prototype.eventType = function() {
1161248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  return this.type_;
11628bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org};
11638bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
11648bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
1165245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgCompileEvent.prototype.script = function() {
1166245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return this.script_;
1167245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org};
1168245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
1169245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
1170061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.orgCompileEvent.prototype.toJSONProtocol = function() {
1171061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  var o = new ProtocolMessage();
11725ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org  o.running = true;
1173248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  switch (this.type_) {
1174248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org    case Debug.DebugEvent.BeforeCompile:
1175248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org      o.event = "beforeCompile";
11765fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org      break;
1177248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org    case Debug.DebugEvent.AfterCompile:
1178248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org      o.event = "afterCompile";
11795fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org      break;
1180248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org    case Debug.DebugEvent.CompileError:
1181248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org      o.event = "compileError";
11825fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org      break;
1183061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  }
1184061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  o.body = {};
1185b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  o.body.script = this.script_;
1186061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
1187061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  return o.toJSONProtocol();
11881b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1189061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
1190061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org
11917be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgfunction MakeScriptObject_(script, include_source) {
11927be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  var o = { id: script.id(),
11937be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            name: script.name(),
11947be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            lineOffset: script.lineOffset(),
11957be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            columnOffset: script.columnOffset(),
11967be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org            lineCount: script.lineCount(),
11977be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org          };
119865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  if (!IS_UNDEFINED(script.data())) {
119965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    o.data = script.data();
120065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  }
12017be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  if (include_source) {
12027be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    o.source = script.source();
12037be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  }
12047be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  return o;
12051b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
12067be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
12077be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
12085de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgfunction MakePromiseEvent(event_data) {
12093e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  return new PromiseEvent(event_data);
12105de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org}
12115de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org
12125de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org
12133e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgfunction PromiseEvent(event_data) {
1214f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  this.promise_ = event_data.promise;
12153e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  this.parentPromise_ = event_data.parentPromise;
1216f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  this.status_ = event_data.status;
1217f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  this.value_ = event_data.value;
1218f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org}
1219f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
1220f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
12213e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgPromiseEvent.prototype.promise = function() {
12223e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  return MakeMirror(this.promise_);
1223f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org}
1224f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
1225f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
12263e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgPromiseEvent.prototype.parentPromise = function() {
12273e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  return MakeMirror(this.parentPromise_);
1228f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org}
1229f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
1230f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
12313e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgPromiseEvent.prototype.status = function() {
12323e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  return this.status_;
1233f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org}
1234f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
1235f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
12363e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgPromiseEvent.prototype.value = function() {
12373e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  return MakeMirror(this.value_);
1238f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org}
1239f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
1240f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org
1241d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgfunction MakeAsyncTaskEvent(event_data) {
1242d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  return new AsyncTaskEvent(event_data);
1243d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org}
1244d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
1245d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
1246d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgfunction AsyncTaskEvent(event_data) {
1247d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  this.type_ = event_data.type;
1248d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  this.name_ = event_data.name;
1249d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  this.id_ = event_data.id;
1250d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org}
1251d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
1252d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
1253d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgAsyncTaskEvent.prototype.type = function() {
1254d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  return this.type_;
1255d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org}
1256d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
1257d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
1258d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgAsyncTaskEvent.prototype.name = function() {
1259d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  return this.name_;
1260d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org}
1261d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
1262d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
1263d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgAsyncTaskEvent.prototype.id = function() {
1264d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  return this.id_;
1265d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org}
1266d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
1267d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
12689d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comfunction DebugCommandProcessor(exec_state, opt_is_running) {
126943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.exec_state_ = exec_state;
12709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  this.running_ = opt_is_running || false;
12711b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
127243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
127343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1274a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgDebugCommandProcessor.prototype.processDebugRequest = function (request) {
1275a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return this.processDebugJSONRequest(request);
12761b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
127743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
127843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1279061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.orgfunction ProtocolMessage(request) {
1280061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  // Update sequence number.
128143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.seq = next_response_seq++;
1282c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
1283061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  if (request) {
1284061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    // If message is based on a request this is a response. Fill the initial
1285061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    // response from the request.
1286061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    this.type = 'response';
1287061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    this.request_seq = request.seq;
1288061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    this.command = request.command;
1289061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  } else {
1290061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    // If message is not based on a request it is a dabugger generated event.
1291061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org    this.type = 'event';
1292061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  }
129343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.success = true;
12949d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  // Handler may set this field to control debugger state.
12959d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  this.running = undefined;
129641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
129743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
129843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12999085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgProtocolMessage.prototype.setOption = function(name, value) {
13009085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  if (!this.options_) {
13019085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org    this.options_ = {};
13029085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  }
13039085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  this.options_[name] = value;
13041b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
13059085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
13069085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
130749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgProtocolMessage.prototype.failed = function(message, opt_details) {
130843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.success = false;
130943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.message = message;
131049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (IS_OBJECT(opt_details)) {
131149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    this.error_details = opt_details;
131249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
13131b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
131443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
131543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1316061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.orgProtocolMessage.prototype.toJSONProtocol = function() {
131743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Encode the protocol header.
1318b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var json = {};
1319b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  json.seq= this.seq;
132043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.request_seq) {
1321b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.request_seq = this.request_seq;
132243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
1323b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  json.type = this.type;
1324061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  if (this.event) {
1325b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.event = this.event;
1326061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  }
132743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.command) {
1328b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.command = this.command;
132943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
133043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.success) {
1331b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.success = this.success;
133243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
1333b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.success = false;
133443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
133543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.body) {
133643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Encode the body part.
1337b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    var bodyJson;
13389085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org    var serializer = MakeMirrorSerializer(true, this.options_);
13393291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    if (this.body instanceof Mirror) {
1340b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      bodyJson = serializer.serializeValue(this.body);
134143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else if (this.body instanceof Array) {
1342b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      bodyJson = [];
134343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      for (var i = 0; i < this.body.length; i++) {
13443291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org        if (this.body[i] instanceof Mirror) {
1345b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org          bodyJson.push(serializer.serializeValue(this.body[i]));
134643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        } else {
1347b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org          bodyJson.push(ObjectToProtocolObject_(this.body[i], serializer));
134843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        }
134943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
135043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
1351b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      bodyJson = ObjectToProtocolObject_(this.body, serializer);
135243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
1353b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.body = bodyJson;
1354b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.refs = serializer.serializeReferencedObjects();
135543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
135643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.message) {
1357b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.message = this.message;
135843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
135949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (this.error_details) {
136049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    json.error_details = this.error_details;
136149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
13629d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  json.running = this.running;
1363b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  return JSON.stringify(json);
13641b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
136543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
136643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
136743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.createResponse = function(request) {
1368061ef74c9b8acd038edf4b4355c50d097c8a9683kasperl@chromium.org  return new ProtocolMessage(request);
136943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
137043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
137143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13721b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebugCommandProcessor.prototype.processDebugJSONRequest = function(
13731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    json_request) {
137443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var request;  // Current request.
137543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var response;  // Generated response.
137643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  try {
137743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    try {
137843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Convert the JSON string to an object.
1379fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org      request = JSON.parse(json_request);
138043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
138143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Create an initial response.
138243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      response = this.createResponse(request);
138343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
138443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (!request.type) {
138543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        throw new Error('Type not specified');
138643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
138743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
138843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (request.type != 'request') {
138943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        throw new Error("Illegal type '" + request.type + "' in request");
139043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
139143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
139243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (!request.command) {
139343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        throw new Error('Command not specified');
139443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
139543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1396b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org      if (request.arguments) {
1397b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        var args = request.arguments;
1398b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        // TODO(yurys): remove request.arguments.compactFormat check once
1399b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        // ChromeDevTools are switched to 'inlineRefs'
1400b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        if (args.inlineRefs || args.compactFormat) {
1401b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org          response.setOption('inlineRefs', true);
1402b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        }
1403b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        if (!IS_UNDEFINED(args.maxStringLength)) {
1404b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org          response.setOption('maxStringLength', args.maxStringLength);
1405b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org        }
14063e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org      }
14073e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org
1408285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      var key = request.command.toLowerCase();
1409285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      var handler = DebugCommandProcessor.prototype.dispatch_[key];
1410285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org      if (IS_FUNCTION(handler)) {
1411285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org        %_CallFunction(this, request, response, handler);
141243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else {
141343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        throw new Error('Unknown command "' + request.command + '" in request');
141443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
141543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } catch (e) {
141643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // If there is no response object created one (without command).
141743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (!response) {
141843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        response = this.createResponse();
141943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
142043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      response.success = false;
142143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      response.message = %ToString(e);
142243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
142343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
142443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Return the response as a JSON encoded string.
142543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    try {
14269d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      if (!IS_UNDEFINED(response.running)) {
14279d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com        // Response controls running state.
14289d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com        this.running_ = response.running;
14299d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com      }
143025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org      response.running = this.running_;
143143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return response.toJSONProtocol();
143243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } catch (e) {
143343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Failed to generate response - return generic error.
143443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return '{"seq":' + response.seq + ',' +
143543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen              '"request_seq":' + request.seq + ',' +
143643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen              '"type":"response",' +
143743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen              '"success":false,' +
143843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen              '"message":"Internal error: ' + %ToString(e) + '"}';
143943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
144043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } catch (e) {
144143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Failed in one of the catch blocks above - most generic error.
144243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return '{"seq":0,"type":"response","success":false,"message":"Internal error"}';
144343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
144443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
144543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
144643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
144743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.continueRequest_ = function(request, response) {
144843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for arguments for continue.
144943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (request.arguments) {
145043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var count = 1;
145143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var action = Debug.StepAction.StepIn;
145243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
145343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Pull out arguments.
145443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var stepaction = request.arguments.stepaction;
145543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var stepcount = request.arguments.stepcount;
145643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
145743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Get the stepcount argument if any.
145843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (stepcount) {
145943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      count = %ToNumber(stepcount);
146043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (count < 0) {
146143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        throw new Error('Invalid stepcount argument "' + stepcount + '".');
146243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
146343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
146443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
146543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Get the stepaction argument.
146643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (stepaction) {
146743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (stepaction == 'in') {
146843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        action = Debug.StepAction.StepIn;
146943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (stepaction == 'min') {
147043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        action = Debug.StepAction.StepMin;
147143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (stepaction == 'next') {
147243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        action = Debug.StepAction.StepNext;
147343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else if (stepaction == 'out') {
147443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        action = Debug.StepAction.StepOut;
147543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      } else {
147643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        throw new Error('Invalid stepaction argument "' + stepaction + '".');
147743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
147843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
147943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1480f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    // Set up the VM for stepping.
148143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    this.exec_state_.prepareStep(action, count);
148243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
148343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
148443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // VM should be running after executing this request.
148543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.running = true;
148643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
148743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
148843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
148943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.breakRequest_ = function(request, response) {
149043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Ignore as break command does not do anything when broken.
149143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
149243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
149343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
149443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.setBreakPointRequest_ =
149543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    function(request, response) {
149643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for legal request.
149743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!request.arguments) {
149843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.failed('Missing arguments');
149943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
150043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
150143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
150243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Pull out arguments.
150343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var type = request.arguments.type;
150443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var target = request.arguments.target;
150543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var line = request.arguments.line;
150643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var column = request.arguments.column;
150743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var enabled = IS_UNDEFINED(request.arguments.enabled) ?
150843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      true : request.arguments.enabled;
150943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var condition = request.arguments.condition;
151043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var ignoreCount = request.arguments.ignoreCount;
151168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  var groupId = request.arguments.groupId;
151243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
151343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for legal arguments.
151465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  if (!type || IS_UNDEFINED(target)) {
151543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.failed('Missing argument "type" or "target"');
151643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
151743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
151828a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org
151943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Either function or script break point.
152043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point_number;
152143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (type == 'function') {
152243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Handle function break point.
152343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (!IS_STRING(target)) {
152443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      response.failed('Argument "target" is not a string value');
152543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return;
152643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
152743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var f;
152843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    try {
152943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Find the function through a global evaluate.
15309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      f = this.exec_state_.evaluateGlobal(target).value();
153143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } catch (e) {
153243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      response.failed('Error: "' + %ToString(e) +
153343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                      '" evaluating "' + target + '"');
153443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return;
153543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
153643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (!IS_FUNCTION(f)) {
153743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      response.failed('"' + target + '" does not evaluate to a function');
153843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return;
153943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
154043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
154143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Set function break point.
154243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    break_point_number = Debug.setBreakPoint(f, line, column, condition);
154365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  } else if (type == 'handle') {
154465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    // Find the object pointed by the specified handle.
154565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var handle = parseInt(target, 10);
154665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var mirror = LookupMirror(handle);
154765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    if (!mirror) {
154865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      return response.failed('Object #' + handle + '# not found');
154965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    }
155065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    if (!mirror.isFunction()) {
155165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      return response.failed('Object #' + handle + '# is not a function');
155265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    }
155365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
155465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    // Set function break point.
155565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    break_point_number = Debug.setBreakPoint(mirror.value(),
155665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org                                             line, column, condition);
15577be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  } else if (type == 'script') {
155843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // set script break point.
15597be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    break_point_number =
156068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org        Debug.setScriptBreakPointByName(target, line, column, condition,
156168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org                                        groupId);
156228a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  } else if (type == 'scriptId') {
15637be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    break_point_number =
156468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org        Debug.setScriptBreakPointById(target, line, column, condition, groupId);
156528a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  } else if (type == 'scriptRegExp') {
1566ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    break_point_number =
1567ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org        Debug.setScriptBreakPointByRegExp(target, line, column, condition,
1568ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org                                          groupId);
1569ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  } else {
1570ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    response.failed('Illegal type "' + type + '"');
1571ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    return;
157243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
157343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
157443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Set additional break point properties.
157543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = Debug.findBreakPoint(break_point_number);
157643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (ignoreCount) {
157743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Debug.changeBreakPointIgnoreCount(break_point_number, ignoreCount);
157843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
157943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!enabled) {
158043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Debug.disableBreakPoint(break_point_number);
158143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
158243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
158343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Add the break point number to the response.
158443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body = { type: type,
15851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                    breakpoint: break_point_number };
158643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
158743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Add break point information to the response.
158843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (break_point instanceof ScriptBreakPoint) {
15897be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    if (break_point.type() == Debug.ScriptBreakPointType.ScriptId) {
15907be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      response.body.type = 'scriptId';
15917be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      response.body.script_id = break_point.script_id();
1592ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptName) {
15937be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      response.body.type = 'scriptName';
15947be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      response.body.script_name = break_point.script_name();
1595ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptRegExp) {
1596ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      response.body.type = 'scriptRegExp';
1597ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      response.body.script_regexp = break_point.script_regexp_object().source;
1598ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    } else {
15991b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      throw new Error("Internal error: Unexpected breakpoint type: " +
16001b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                      break_point.type());
16017be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    }
160243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.body.line = break_point.line();
160343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.body.column = break_point.column();
160432d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    response.body.actual_locations = break_point.actual_locations();
160543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
160643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.body.type = 'function';
160732d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org    response.body.actual_locations = [break_point.actual_location];
160843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
160943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
161043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
161143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16121b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebugCommandProcessor.prototype.changeBreakPointRequest_ = function(
16131b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    request, response) {
161443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for legal request.
161543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!request.arguments) {
161643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.failed('Missing arguments');
161743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
161843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
161943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
162043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Pull out arguments.
162143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = %ToNumber(request.arguments.breakpoint);
162243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var enabled = request.arguments.enabled;
162343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var condition = request.arguments.condition;
162443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var ignoreCount = request.arguments.ignoreCount;
162543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
162643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for legal arguments.
162743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!break_point) {
162843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.failed('Missing argument "breakpoint"');
162943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
163043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
163143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
163243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Change enabled state if supplied.
163343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(enabled)) {
163443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (enabled) {
163543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Debug.enableBreakPoint(break_point);
163643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
163743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Debug.disableBreakPoint(break_point);
163843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
163943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
164043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
164143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Change condition if supplied
164243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(condition)) {
164343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Debug.changeBreakPointCondition(break_point, condition);
164443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
164543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
164643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Change ignore count if supplied
164743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(ignoreCount)) {
164843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Debug.changeBreakPointIgnoreCount(break_point, ignoreCount);
164943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
16501b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
165143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
165243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16531b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebugCommandProcessor.prototype.clearBreakPointGroupRequest_ = function(
16541b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    request, response) {
165568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  // Check for legal request.
165668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  if (!request.arguments) {
165768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    response.failed('Missing arguments');
165868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    return;
165968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  }
166068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
166168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  // Pull out arguments.
166268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  var group_id = request.arguments.groupId;
166368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
166468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  // Check for legal arguments.
166568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  if (!group_id) {
166668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    response.failed('Missing argument "groupId"');
166768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    return;
166868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  }
1669c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
167068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  var cleared_break_points = [];
167168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  var new_script_break_points = [];
167268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  for (var i = 0; i < script_break_points.length; i++) {
167368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    var next_break_point = script_break_points[i];
167468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    if (next_break_point.groupId() == group_id) {
167568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org      cleared_break_points.push(next_break_point.number());
167668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org      next_break_point.clear();
167768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    } else {
167868ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org      new_script_break_points.push(next_break_point);
167968ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org    }
168068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  }
168168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  script_break_points = new_script_break_points;
168268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
168368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  // Add the cleared break point numbers to the response.
168468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org  response.body = { breakpoints: cleared_break_points };
16851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
168668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
168768ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
16881b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebugCommandProcessor.prototype.clearBreakPointRequest_ = function(
16891b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    request, response) {
169043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for legal request.
169143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!request.arguments) {
169243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.failed('Missing arguments');
169343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
169443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
169543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
169643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Pull out arguments.
169743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var break_point = %ToNumber(request.arguments.breakpoint);
169843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
169943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for legal arguments.
170043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!break_point) {
170143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    response.failed('Missing argument "breakpoint"');
170243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
170343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
170443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
170543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Clear break point.
170643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Debug.clearBreakPoint(break_point);
170737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
170837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Add the cleared break point number to the response.
17091b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  response.body = { breakpoint: break_point };
17101b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
171143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1712e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
17131b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebugCommandProcessor.prototype.listBreakpointsRequest_ = function(
17141b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    request, response) {
1715dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  var array = [];
1716dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  for (var i = 0; i < script_break_points.length; i++) {
1717dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    var break_point = script_break_points[i];
1718dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
1719dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    var description = {
1720dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      number: break_point.number(),
1721dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      line: break_point.line(),
1722dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      column: break_point.column(),
1723dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      groupId: break_point.groupId(),
1724dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      hit_count: break_point.hit_count(),
1725dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      active: break_point.active(),
1726dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      condition: break_point.condition(),
172732d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org      ignoreCount: break_point.ignoreCount(),
172832d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org      actual_locations: break_point.actual_locations()
17291b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    };
1730e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
1731dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    if (break_point.type() == Debug.ScriptBreakPointType.ScriptId) {
1732dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      description.type = 'scriptId';
1733dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      description.script_id = break_point.script_id();
1734ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptName) {
1735dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      description.type = 'scriptName';
1736dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org      description.script_name = break_point.script_name();
1737ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    } else if (break_point.type() == Debug.ScriptBreakPointType.ScriptRegExp) {
1738ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      description.type = 'scriptRegExp';
1739ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org      description.script_regexp = break_point.script_regexp_object().source;
1740ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org    } else {
17411b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      throw new Error("Internal error: Unexpected breakpoint type: " +
17421b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                      break_point.type());
1743dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    }
1744dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org    array.push(description);
1745dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org  }
1746e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
1747d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  response.body = {
1748d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    breakpoints: array,
1749d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    breakOnExceptions: Debug.isBreakOnException(),
1750d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    breakOnUncaughtExceptions: Debug.isBreakOnUncaughtException()
17511b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  };
17521b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1753d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1754d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1755d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugCommandProcessor.prototype.disconnectRequest_ =
1756d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    function(request, response) {
1757d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  Debug.disableAllBreakPoints();
1758d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  this.continueRequest_(request, response);
17591b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1760d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1761d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1762d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugCommandProcessor.prototype.setExceptionBreakRequest_ =
1763d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    function(request, response) {
1764d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Check for legal request.
1765d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (!request.arguments) {
1766d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    response.failed('Missing arguments');
1767d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    return;
1768d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1769d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1770d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Pull out and check the 'type' argument:
1771d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var type = request.arguments.type;
1772d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (!type) {
1773d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    response.failed('Missing argument "type"');
1774d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    return;
1775d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1776d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1777d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Initialize the default value of enable:
1778d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var enabled;
1779d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (type == 'all') {
1780d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    enabled = !Debug.isBreakOnException();
1781d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if (type == 'uncaught') {
1782d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    enabled = !Debug.isBreakOnUncaughtException();
178328a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
1784d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1785d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Pull out and check the 'enabled' argument if present:
1786d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (!IS_UNDEFINED(request.arguments.enabled)) {
1787d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    enabled = request.arguments.enabled;
1788d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if ((enabled != true) && (enabled != false)) {
1789d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      response.failed('Illegal value for "enabled":"' + enabled + '"');
1790d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
1791d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1792d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1793d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Now set the exception break state:
1794d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (type == 'all') {
1795d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    %ChangeBreakOnException(Debug.ExceptionBreak.Caught, enabled);
1796d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else if (type == 'uncaught') {
1797d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    %ChangeBreakOnException(Debug.ExceptionBreak.Uncaught, enabled);
1798d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  } else {
1799d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    response.failed('Unknown "type":"' + type + '"');
1800d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  }
1801d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1802d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  // Add the cleared break point number to the response.
1803d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  response.body = { 'type': type, 'enabled': enabled };
18041b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1805dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
180643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18071b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebugCommandProcessor.prototype.backtraceRequest_ = function(
18081b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    request, response) {
180943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Get the number of frames.
18109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  var total_frames = this.exec_state_.frameCount();
181143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18128bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  // Create simple response if there are no frames.
18138bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  if (total_frames == 0) {
18148bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org    response.body = {
18158bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org      totalFrames: total_frames
18161b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    };
18178bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org    return;
18188bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  }
18198bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
182043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Default frame range to include in backtrace.
18211b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  var from_index = 0;
182243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var to_index = kDefaultBacktraceLength;
182343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
182443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Get the range from the arguments.
182543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (request.arguments) {
1826b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (request.arguments.fromFrame) {
1827b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      from_index = request.arguments.fromFrame;
1828b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    }
1829b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (request.arguments.toFrame) {
1830b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      to_index = request.arguments.toFrame;
183143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
1832b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (request.arguments.bottom) {
1833b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      var tmp_index = total_frames - from_index;
18341b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      from_index = total_frames - to_index;
1835b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      to_index = tmp_index;
1836b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    }
1837b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (from_index < 0 || to_index < 0) {
183843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return response.failed('Invalid frame number');
183943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
184043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
184143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
184243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Adjust the index.
184343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  to_index = Math.min(total_frames, to_index);
184443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
184543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (to_index <= from_index) {
184643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var error = 'Invalid frame range';
184743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return response.failed(error);
184843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
184943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
185043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Create the response body.
185143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var frames = [];
185243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = from_index; i < to_index; i++) {
18539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    frames.push(this.exec_state_.frame(i));
185443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
185543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body = {
185643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    fromFrame: from_index,
185743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    toFrame: to_index,
185843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    totalFrames: total_frames,
185943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    frames: frames
18601b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  };
186143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
186243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
186343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
186443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.frameRequest_ = function(request, response) {
186537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // No frames no source.
186637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (this.exec_state_.frameCount() == 0) {
186737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    return response.failed('No frames');
186837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
186937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
187043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // With no arguments just keep the selected frame.
1871ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  if (request.arguments) {
1872eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    var index = request.arguments.number;
1873ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    if (index < 0 || this.exec_state_.frameCount() <= index) {
1874ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      return response.failed('Invalid frame number');
1875ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    }
1876c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
187743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    this.exec_state_.setSelectedFrame(request.arguments.number);
187843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
18799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  response.body = this.exec_state_.frame();
188043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
188143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
188243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
188349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgDebugCommandProcessor.prototype.resolveFrameFromScopeDescription_ =
188449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    function(scope_description) {
18851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  // Get the frame for which the scope or scopes are requested.
18861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  // With no frameNumber argument use the currently selected frame.
188749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (scope_description && !IS_UNDEFINED(scope_description.frameNumber)) {
188849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    frame_index = scope_description.frameNumber;
1889eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    if (frame_index < 0 || this.exec_state_.frameCount() <= frame_index) {
18901044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org      throw new Error('Invalid frame number');
1891eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    }
1892eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return this.exec_state_.frame(frame_index);
1893eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  } else {
1894eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return this.exec_state_.frame();
1895eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
18961b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
1897eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1898eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
18991044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// Gets scope host object from request. It is either a function
19001044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// ('functionHandle' argument must be specified) or a stack frame
19011044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// ('frameNumber' may be specified and the current frame is taken by default).
190249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgDebugCommandProcessor.prototype.resolveScopeHolder_ =
190349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    function(scope_description) {
190449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (scope_description && "functionHandle" in scope_description) {
190549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    if (!IS_NUMBER(scope_description.functionHandle)) {
19061044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org      throw new Error('Function handle must be a number');
19071044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    }
190849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    var function_mirror = LookupMirror(scope_description.functionHandle);
19091044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    if (!function_mirror) {
19101044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org      throw new Error('Failed to find function object by handle');
19111044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    }
19121044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    if (!function_mirror.isFunction()) {
19131044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org      throw new Error('Value of non-function type is found by handle');
19141044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    }
19151044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    return function_mirror;
19161044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  } else {
19171044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // No frames no scopes.
19181044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    if (this.exec_state_.frameCount() == 0) {
19191044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org      throw new Error('No scopes');
19201044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    }
19211044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
19221044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    // Get the frame for which the scopes are requested.
192349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    var frame = this.resolveFrameFromScopeDescription_(scope_description);
19241044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    return frame;
1925eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
19261044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org}
1927eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1928c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
19291044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgDebugCommandProcessor.prototype.scopesRequest_ = function(request, response) {
193049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var scope_holder = this.resolveScopeHolder_(request.arguments);
19311044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
19321044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  // Fill all scopes for this frame or function.
19331044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  var total_scopes = scope_holder.scopeCount();
1934eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var scopes = [];
1935eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  for (var i = 0; i < total_scopes; i++) {
19361044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    scopes.push(scope_holder.scope(i));
1937eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
1938eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  response.body = {
1939eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    fromScope: 0,
1940eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    toScope: total_scopes,
1941eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    totalScopes: total_scopes,
1942eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    scopes: scopes
19431b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  };
1944eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org};
1945eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1946eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1947eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgDebugCommandProcessor.prototype.scopeRequest_ = function(request, response) {
19481044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  // Get the frame or function for which the scope is requested.
194949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var scope_holder = this.resolveScopeHolder_(request.arguments);
1950eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1951eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // With no scope argument just return top scope.
1952eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var scope_index = 0;
1953eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  if (request.arguments && !IS_UNDEFINED(request.arguments.number)) {
1954eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    scope_index = %ToNumber(request.arguments.number);
19551044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    if (scope_index < 0 || scope_holder.scopeCount() <= scope_index) {
1956eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      return response.failed('Invalid scope number');
1957eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    }
1958eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
1959eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
19601044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  response.body = scope_holder.scope(scope_index);
1961eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org};
1962eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
1963eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
196449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org// Reads value from protocol description. Description may be in form of type
196549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org// (for singletons), raw value (primitive types supported in JSON),
196649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org// string value description plus type (for primitive values) or handle id.
196749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org// Returns raw value or throws exception.
196849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgDebugCommandProcessor.resolveValue_ = function(value_description) {
196949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if ("handle" in value_description) {
197049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    var value_mirror = LookupMirror(value_description.handle);
197149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    if (!value_mirror) {
197249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      throw new Error("Failed to resolve value by handle, ' #" +
197349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org          mapping.handle + "# not found");
197449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    }
197549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    return value_mirror.value();
197649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  } else if ("stringDescription" in value_description) {
197749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    if (value_description.type == BOOLEAN_TYPE) {
197849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      return Boolean(value_description.stringDescription);
197949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    } else if (value_description.type == NUMBER_TYPE) {
198049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      return Number(value_description.stringDescription);
198149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    } if (value_description.type == STRING_TYPE) {
198249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      return String(value_description.stringDescription);
198349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    } else {
198449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      throw new Error("Unknown type");
198549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    }
198649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  } else if ("value" in value_description) {
198749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    return value_description.value;
198849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  } else if (value_description.type == UNDEFINED_TYPE) {
1989690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org    return UNDEFINED;
199049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  } else if (value_description.type == NULL_TYPE) {
199149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    return null;
199249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  } else {
199349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    throw new Error("Failed to parse value description");
199449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
199549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org};
199649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
199749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
199849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgDebugCommandProcessor.prototype.setVariableValueRequest_ =
199949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    function(request, response) {
200049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (!request.arguments) {
200149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    response.failed('Missing arguments');
200249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    return;
200349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
200449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
200549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (IS_UNDEFINED(request.arguments.name)) {
200649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    response.failed('Missing variable name');
200749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
200849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var variable_name = request.arguments.name;
200949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
201049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var scope_description = request.arguments.scope;
201149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
201249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  // Get the frame or function for which the scope is requested.
201349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var scope_holder = this.resolveScopeHolder_(scope_description);
201449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
201549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  if (IS_UNDEFINED(scope_description.number)) {
201649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    response.failed('Missing scope number');
201749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
201849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var scope_index = %ToNumber(scope_description.number);
201949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
202049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var scope = scope_holder.scope(scope_index);
202149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
202249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var new_value =
202349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      DebugCommandProcessor.resolveValue_(request.arguments.newValue);
202449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
202549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  scope.setVariableValue(variable_name, new_value);
202649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
202749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var new_value_mirror = MakeMirror(new_value);
202849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
202949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  response.body = {
203049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    newValue: new_value_mirror
203149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  };
203249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org};
203349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
203449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
203543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.evaluateRequest_ = function(request, response) {
203643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!request.arguments) {
203743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return response.failed('Missing arguments');
203843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
203943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
204043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Pull out arguments.
204143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var expression = request.arguments.expression;
204243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var frame = request.arguments.frame;
204343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var global = request.arguments.global;
2044bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  var disable_break = request.arguments.disable_break;
20455f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  var additional_context = request.arguments.additional_context;
2046bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund
2047bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  // The expression argument could be an integer so we convert it to a
2048bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  // string.
2049bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  try {
2050bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund    expression = String(expression);
2051bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  } catch(e) {
2052bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund    return response.failed('Failed to convert expression argument to string');
2053bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  }
205443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
205543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check for legal arguments.
205643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(frame) && global) {
205743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return response.failed('Arguments "frame" and "global" are exclusive');
205843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
205928a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org
20605f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  var additional_context_object;
20615f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  if (additional_context) {
20625f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    additional_context_object = {};
20635f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    for (var i = 0; i < additional_context.length; i++) {
20645f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      var mapping = additional_context[i];
2065a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
2066a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      if (!IS_STRING(mapping.name)) {
206728a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org        return response.failed("Context element #" + i +
2068a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org            " doesn't contain name:string property");
20695f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      }
2070a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
2071a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      var raw_value = DebugCommandProcessor.resolveValue_(mapping);
2072a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      additional_context_object[mapping.name] = raw_value;
20735f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    }
20745f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  }
207543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
207643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Global evaluate.
207743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (global) {
207846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    // Evaluate in the native context.
20795f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    response.body = this.exec_state_.evaluateGlobal(
20805f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org        expression, Boolean(disable_break), additional_context_object);
208143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
208243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
208343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2084bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  // Default value for disable_break is true.
2085bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  if (IS_UNDEFINED(disable_break)) {
2086bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund    disable_break = true;
2087bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  }
2088bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund
2089381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org  // No frames no evaluate in frame.
2090381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org  if (this.exec_state_.frameCount() == 0) {
2091381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org    return response.failed('No frames');
2092381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org  }
2093381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org
209443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check whether a frame was specified.
209543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(frame)) {
209643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var frame_number = %ToNumber(frame);
20979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    if (frame_number < 0 || frame_number >= this.exec_state_.frameCount()) {
209843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return response.failed('Invalid frame "' + frame + '"');
209943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
210043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Evaluate in the specified frame.
21019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    response.body = this.exec_state_.frame(frame_number).evaluate(
21025f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org        expression, Boolean(disable_break), additional_context_object);
210343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
210443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
210543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Evaluate in the selected frame.
21069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    response.body = this.exec_state_.frame().evaluate(
21075f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org        expression, Boolean(disable_break), additional_context_object);
210843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return;
210943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
211043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
211143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
211243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2113ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgDebugCommandProcessor.prototype.lookupRequest_ = function(request, response) {
2114ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  if (!request.arguments) {
2115ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    return response.failed('Missing arguments');
2116ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
2117ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
2118ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Pull out arguments.
211965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  var handles = request.arguments.handles;
2120ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
2121ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Check for legal arguments.
212265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  if (IS_UNDEFINED(handles)) {
212365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    return response.failed('Argument "handles" missing');
2124ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
2125ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
2126b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  // Set 'includeSource' option for script lookup.
2127b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  if (!IS_UNDEFINED(request.arguments.includeSource)) {
2128b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    includeSource = %ToBoolean(request.arguments.includeSource);
2129b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    response.setOption('includeSource', includeSource);
2130b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  }
2131c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
213265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  // Lookup handles.
213365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  var mirrors = {};
213465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  for (var i = 0; i < handles.length; i++) {
213565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var handle = handles[i];
213665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    var mirror = LookupMirror(handle);
213765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    if (!mirror) {
213865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org      return response.failed('Object #' + handle + '# not found');
213965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    }
214065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org    mirrors[handle] = mirror;
2141ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
214265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  response.body = mirrors;
2143ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org};
2144ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
2145ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
2146245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebugCommandProcessor.prototype.referencesRequest_ =
2147245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    function(request, response) {
2148245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (!request.arguments) {
2149245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return response.failed('Missing arguments');
2150245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
2151245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
2152245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Pull out arguments.
2153245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var type = request.arguments.type;
2154245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var handle = request.arguments.handle;
2155245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
2156245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Check for legal arguments.
2157245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (IS_UNDEFINED(type)) {
2158245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return response.failed('Argument "type" missing');
2159245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
2160245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (IS_UNDEFINED(handle)) {
2161245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return response.failed('Argument "handle" missing');
2162245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
2163245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (type != 'referencedBy' && type != 'constructedBy') {
2164245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return response.failed('Invalid type "' + type + '"');
2165245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
2166245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
2167245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Lookup handle and return objects with references the object.
2168245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  var mirror = LookupMirror(handle);
2169245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  if (mirror) {
2170245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    if (type == 'referencedBy') {
2171245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      response.body = mirror.referencedBy();
2172245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    } else {
2173245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org      response.body = mirror.constructedBy();
2174245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    }
2175245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  } else {
2176245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    return response.failed('Object #' + handle + '# not found');
2177245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
2178245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org};
2179245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
2180245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
218143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.sourceRequest_ = function(request, response) {
218237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // No frames no source.
218337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (this.exec_state_.frameCount() == 0) {
218437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    return response.failed('No source');
218537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
218637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
218743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var from_line;
218843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var to_line;
21899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  var frame = this.exec_state_.frame();
219043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (request.arguments) {
219143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Pull out arguments.
219243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    from_line = request.arguments.fromLine;
219343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    to_line = request.arguments.toLine;
219443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
219543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (!IS_UNDEFINED(request.arguments.frame)) {
219643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      var frame_number = %ToNumber(request.arguments.frame);
21979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      if (frame_number < 0 || frame_number >= this.exec_state_.frameCount()) {
219843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        return response.failed('Invalid frame "' + frame + '"');
219943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
22009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com      frame = this.exec_state_.frame(frame_number);
220143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
220243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
220343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
220443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Get the script selected.
220543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var script = frame.func().script();
220643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!script) {
220743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return response.failed('No source');
220843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
220943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
221043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Get the source slice and fill it into the response.
221143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var slice = script.sourceSlice(from_line, to_line);
221243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!slice) {
221343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return response.failed('Invalid line interval');
221443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
221543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body = {};
221643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body.source = slice.sourceText();
221743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body.fromLine = slice.from_line;
221843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body.toLine = slice.to_line;
221943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body.fromPosition = slice.from_position;
222043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body.toPosition = slice.to_position;
222143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body.totalLines = script.lineCount();
222243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
222343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
222443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
222543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.scriptsRequest_ = function(request, response) {
222643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var types = ScriptTypeFlag(Debug.ScriptType.Normal);
222741826e77311db718135ef6517b846933dfd275f3ager@chromium.org  var includeSource = false;
2228b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var idsToInclude = null;
222943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (request.arguments) {
223043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Pull out arguments.
223143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (!IS_UNDEFINED(request.arguments.types)) {
223243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      types = %ToNumber(request.arguments.types);
223343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (isNaN(types) || types < 0) {
22341b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        return response.failed('Invalid types "' +
22351b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                               request.arguments.types + '"');
223643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
223743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
223825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
223941826e77311db718135ef6517b846933dfd275f3ager@chromium.org    if (!IS_UNDEFINED(request.arguments.includeSource)) {
224041826e77311db718135ef6517b846933dfd275f3ager@chromium.org      includeSource = %ToBoolean(request.arguments.includeSource);
22419085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org      response.setOption('includeSource', includeSource);
224241826e77311db718135ef6517b846933dfd275f3ager@chromium.org    }
224325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
2244b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (IS_ARRAY(request.arguments.ids)) {
2245b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      idsToInclude = {};
2246b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      var ids = request.arguments.ids;
2247b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      for (var i = 0; i < ids.length; i++) {
2248b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        idsToInclude[ids[i]] = true;
2249b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      }
2250b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    }
2251d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2252d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var filterStr = null;
2253d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    var filterNum = null;
2254d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if (!IS_UNDEFINED(request.arguments.filter)) {
2255d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      var num = %ToNumber(request.arguments.filter);
2256d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (!isNaN(num)) {
2257d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        filterNum = num;
2258d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      }
2259d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      filterStr = request.arguments.filter;
2260d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
226143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
226243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
226343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Collect all scripts in the heap.
2264e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  var scripts = %DebugGetLoadedScripts();
226543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
226643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  response.body = [];
226743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
226843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < scripts.length; i++) {
2269b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    if (idsToInclude && !idsToInclude[scripts[i].id]) {
2270b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      continue;
2271b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    }
2272d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    if (filterStr || filterNum) {
2273d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      var script = scripts[i];
2274d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      var found = false;
2275d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (filterNum && !found) {
2276d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (script.id && script.id === filterNum) {
2277d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          found = true;
2278d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
2279d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      }
2280d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (filterStr && !found) {
2281d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        if (script.name && script.name.indexOf(filterStr) >= 0) {
2282d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          found = true;
2283d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        }
2284d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      }
2285d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org      if (!found) continue;
2286d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    }
228743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (types & ScriptTypeFlag(scripts[i].type)) {
22889085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org      response.body.push(MakeMirror(scripts[i]));
228943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
229043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
229143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
229243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
229343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2294bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgDebugCommandProcessor.prototype.threadsRequest_ = function(request, response) {
2295bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  // Get the number of threads.
2296bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  var total_threads = this.exec_state_.threadCount();
2297bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
2298bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  // Get information for all threads.
2299bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  var threads = [];
2300bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  for (var i = 0; i < total_threads; i++) {
2301bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    var details = %GetThreadDetails(this.exec_state_.break_id, i);
2302bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    var thread_info = { current: details[0],
2303bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org                        id: details[1]
23041b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                      };
2305bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    threads.push(thread_info);
2306bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  }
2307bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
2308bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  // Create the response body.
2309bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  response.body = {
2310bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    totalThreads: total_threads,
2311bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    threads: threads
23121b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  };
2313bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org};
2314bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
2315bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
23169d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comDebugCommandProcessor.prototype.suspendRequest_ = function(request, response) {
23179d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  response.running = false;
23189d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com};
23199d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
23209d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
23213811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgDebugCommandProcessor.prototype.versionRequest_ = function(request, response) {
23223811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  response.body = {
23233811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org    V8Version: %GetV8Version()
23241b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  };
23253811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org};
23263811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
23273811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
23281b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgDebugCommandProcessor.prototype.changeLiveRequest_ = function(
23291b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    request, response) {
2330ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  if (!request.arguments) {
2331ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    return response.failed('Missing arguments');
2332ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
2333ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  var script_id = request.arguments.script_id;
233469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  var preview_only = !!request.arguments.preview_only;
233542841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org
2336e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  var scripts = %DebugGetLoadedScripts();
2337ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2338ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  var the_script = null;
2339ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  for (var i = 0; i < scripts.length; i++) {
2340ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    if (scripts[i].id == script_id) {
2341ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org      the_script = scripts[i];
2342ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    }
2343ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
2344ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  if (!the_script) {
2345ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    response.failed('Script not found');
2346ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org    return;
2347ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  }
234825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
2349ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  var change_log = new Array();
2350e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
23514111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  if (!IS_STRING(request.arguments.new_source)) {
23524111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org    throw "new_source argument expected";
235325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  }
235425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
23554111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  var new_source = request.arguments.new_source;
235642841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org
235749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  var result_description;
235849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  try {
235949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    result_description = Debug.LiveEdit.SetScriptSource(the_script,
236049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org        new_source, preview_only, change_log);
236149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  } catch (e) {
236249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    if (e instanceof Debug.LiveEdit.Failure && "details" in e) {
236349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      response.failed(e.message, e.details);
236449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      return;
236549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    }
236649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    throw e;
236749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  }
236869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  response.body = {change_log: change_log, result: result_description};
236942841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org
2370e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  if (!preview_only && !this.running_ && result_description.stack_modified) {
2371e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    response.body.stepin_recommended = true;
2372e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  }
2373ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org};
2374ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2375ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
23765a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgDebugCommandProcessor.prototype.restartFrameRequest_ = function(
23775a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    request, response) {
23785a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (!request.arguments) {
23795a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    return response.failed('Missing arguments');
23805a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  }
23815a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  var frame = request.arguments.frame;
23825a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
23835a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // No frames to evaluate in frame.
23845a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (this.exec_state_.frameCount() == 0) {
23855a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    return response.failed('No frames');
23865a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  }
23875a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
23885a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  var frame_mirror;
23895a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // Check whether a frame was specified.
23905a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (!IS_UNDEFINED(frame)) {
23915a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    var frame_number = %ToNumber(frame);
23925a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    if (frame_number < 0 || frame_number >= this.exec_state_.frameCount()) {
23935a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      return response.failed('Invalid frame "' + frame + '"');
23945a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    }
23955a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    // Restart specified frame.
23965a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    frame_mirror = this.exec_state_.frame(frame_number);
23975a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  } else {
23985a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    // Restart selected frame.
23995a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    frame_mirror = this.exec_state_.frame();
24005a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  }
24015a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
24025a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  var result_description = Debug.LiveEdit.RestartFrame(frame_mirror);
24035a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  response.body = {result: result_description};
24045a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org};
24055a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
24065a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
2407e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.orgDebugCommandProcessor.prototype.debuggerFlagsRequest_ = function(request,
2408e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org                                                                 response) {
2409e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  // Check for legal request.
2410e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  if (!request.arguments) {
2411e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    response.failed('Missing arguments');
2412e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    return;
2413e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  }
2414e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
2415e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  // Pull out arguments.
2416e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  var flags = request.arguments.flags;
2417e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
2418e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  response.body = { flags: [] };
2419e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  if (!IS_UNDEFINED(flags)) {
2420e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    for (var i = 0; i < flags.length; i++) {
2421e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      var name = flags[i].name;
2422e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      var debugger_flag = debugger_flags[name];
2423e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      if (!debugger_flag) {
2424e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org        continue;
2425e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      }
2426e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      if ('value' in flags[i]) {
2427e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org        debugger_flag.setValue(flags[i].value);
2428e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      }
2429e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      response.body.flags.push({ name: name, value: debugger_flag.getValue() });
2430e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    }
2431e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  } else {
2432e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    for (var name in debugger_flags) {
2433e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      var value = debugger_flags[name].getValue();
2434e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org      response.body.flags.push({ name: name, value: value });
2435e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    }
2436e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org  }
24371b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
2438e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
2439e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
2440d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugCommandProcessor.prototype.v8FlagsRequest_ = function(request, response) {
2441d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var flags = request.arguments.flags;
2442d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (!flags) flags = '';
2443d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  %SetFlags(flags);
2444d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
2445d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2446d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2447d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgDebugCommandProcessor.prototype.gcRequest_ = function(request, response) {
2448d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var type = request.arguments.type;
2449d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  if (!type) type = 'all';
2450d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2451d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var before = %GetHeapUsage();
2452d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  %CollectGarbage(type);
2453d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  var after = %GetHeapUsage();
2454d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2455d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  response.body = { "before": before, "after": after };
2456d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
2457d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2458d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2459285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.orgDebugCommandProcessor.prototype.dispatch_ = (function() {
2460285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  var proto = DebugCommandProcessor.prototype;
2461285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  return {
2462285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "continue":             proto.continueRequest_,
2463285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "break"   :             proto.breakRequest_,
2464285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "setbreakpoint" :       proto.setBreakPointRequest_,
2465285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "changebreakpoint":     proto.changeBreakPointRequest_,
2466285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "clearbreakpoint":      proto.clearBreakPointRequest_,
2467285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "clearbreakpointgroup": proto.clearBreakPointGroupRequest_,
2468285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "disconnect":           proto.disconnectRequest_,
2469285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "setexceptionbreak":    proto.setExceptionBreakRequest_,
2470285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "listbreakpoints":      proto.listBreakpointsRequest_,
2471285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "backtrace":            proto.backtraceRequest_,
2472285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "frame":                proto.frameRequest_,
2473285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "scopes":               proto.scopesRequest_,
2474285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "scope":                proto.scopeRequest_,
2475285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "setvariablevalue":     proto.setVariableValueRequest_,
2476285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "evaluate":             proto.evaluateRequest_,
2477285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "lookup":               proto.lookupRequest_,
2478285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "references":           proto.referencesRequest_,
2479285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "source":               proto.sourceRequest_,
2480285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "scripts":              proto.scriptsRequest_,
2481285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "threads":              proto.threadsRequest_,
2482285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "suspend":              proto.suspendRequest_,
2483285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "version":              proto.versionRequest_,
2484285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "changelive":           proto.changeLiveRequest_,
2485285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "restartframe":         proto.restartFrameRequest_,
2486285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "flags":                proto.debuggerFlagsRequest_,
2487285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "v8flag":               proto.v8FlagsRequest_,
2488285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org    "gc":                   proto.gcRequest_,
2489285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org  };
2490285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org})();
2491285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org
2492285f85a5a149f36516a20200a76899651dd95fb6machenbach@chromium.org
2493245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// Check whether the previously processed command caused the VM to become
2494245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// running.
2495245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDebugCommandProcessor.prototype.isRunning = function() {
2496245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return this.running_;
24971b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org};
249843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
249943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
250043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDebugCommandProcessor.prototype.systemBreak = function(cmd, args) {
250131e7138e1a05e29ceefa8919ae12cb621a48ca7fmads.s.ager  return %SystemBreak();
250243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
250343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
250443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
250543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2506b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * Convert an Object to its debugger protocol representation. The representation
2507b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * may be serilized to a JSON object using JSON.stringify().
2508b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * This implementation simply runs through all string property names, converts
2509b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * each property value to a protocol value and adds the property to the result
2510b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * object. For type "object" the function will be called recursively. Note that
2511b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * circular structures will cause infinite recursion.
2512b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @param {Object} object The object to format as protocol object.
25133291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @param {MirrorSerializer} mirror_serializer The serializer to use if any
25143291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *     mirror objects are encountered.
2515b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @return {Object} Protocol object value.
251643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2517b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.orgfunction ObjectToProtocolObject_(object, mirror_serializer) {
2518b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var content = {};
251943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var key in object) {
252043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Only consider string keys.
252143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (typeof key == 'string') {
252243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Format the value based on its type.
2523b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      var property_value_json = ValueToProtocolValue_(object[key],
2524b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org                                                      mirror_serializer);
252543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // Add the property if relevant.
2526b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      if (!IS_UNDEFINED(property_value_json)) {
2527b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        content[key] = property_value_json;
252843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      }
252943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
253043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
253125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
2532b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  return content;
253341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
253443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2535b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
253643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2537b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * Convert an array to its debugger protocol representation. It will convert
2538b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * each array element to a protocol value.
2539b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @param {Array} array The array to format as protocol array.
25403291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org * @param {MirrorSerializer} mirror_serializer The serializer to use if any
25413291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org *     mirror objects are encountered.
2542b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @return {Array} Protocol array value.
254343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
2544b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.orgfunction ArrayToProtocolArray_(array, mirror_serializer) {
2545b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var json = [];
254643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (var i = 0; i < array.length; i++) {
2547b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    json.push(ValueToProtocolValue_(array[i], mirror_serializer));
2548b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  }
2549b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  return json;
2550b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org}
2551b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
2552b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
2553b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org/**
255425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org * Convert a value to its debugger protocol representation.
2555b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @param {*} value The value to format as protocol value.
2556b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @param {MirrorSerializer} mirror_serializer The serializer to use if any
2557b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org *     mirror objects are encountered.
2558b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org * @return {*} Protocol value.
2559b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org */
2560b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.orgfunction ValueToProtocolValue_(value, mirror_serializer) {
2561b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  // Format the value based on its type.
2562b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  var json;
2563b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org  switch (typeof value) {
2564b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case 'object':
2565b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      if (value instanceof Mirror) {
2566b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        json = mirror_serializer.serializeValue(value);
2567b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      } else if (IS_ARRAY(value)){
2568b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        json = ArrayToProtocolArray_(value, mirror_serializer);
2569b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      } else {
2570b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org        json = ObjectToProtocolObject_(value, mirror_serializer);
2571b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      }
2572b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      break;
2573b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
2574b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case 'boolean':
2575b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case 'string':
2576b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    case 'number':
2577b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      json = value;
25781b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      break;
2579b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org
2580b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org    default:
2581b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org      json = null;
258243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
258343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return json;
258441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
258549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org
258649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgDebug.TestApi = {
258749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org  CommandProcessorResolveValue: DebugCommandProcessor.resolveValue_
258849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org};
2589