188d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@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
55ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#ifndef V8_DEBUG_H_
65ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#define V8_DEBUG_H_
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/allocation.h"
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/arguments.h"
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/assembler.h"
115de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h"
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/execution.h"
13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/factory.h"
14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/flags.h"
15196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/frames-inl.h"
16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hashmap.h"
17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/liveedit.h"
18196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/string-stream.h"
19196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8threads.h"
20196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
21196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "include/v8-debug.h"
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
2471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
267be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
277be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// Forward declarations.
28196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgclass DebugScope;
297be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
307be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Step actions. NOTE: These values are in macros.py as well.
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum StepAction {
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  StepNone = -1,  // Stepping not prepared.
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  StepOut = 0,   // Step out of the current function.
3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  StepNext = 1,  // Step to the next statement in the current function.
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  StepIn = 2,    // Step into new functions invoked or the next statement
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                 // in the current function.
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  StepMin = 3,   // Perform a minimum step in the current function.
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  StepInMin = 4  // Step into new functions invoked or perform a minimum step
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                 // in the current function.
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Type of exception break. NOTE: These values are in macros.py as well.
4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum ExceptionBreakType {
4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  BreakException = 0,
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  BreakUncaughtException = 1
4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Type of exception break. NOTE: These values are in macros.py as well.
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum BreakLocatorType {
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ALL_BREAK_LOCATIONS = 0,
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  SOURCE_BREAK_LOCATIONS = 1
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// The different types of breakpoint position alignments.
5993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org// Must match Debug.BreakPositionAlignment in debug-debugger.js
6093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgenum BreakPositionAlignment {
6193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  STATEMENT_ALIGNED = 0,
6293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  BREAK_POSITION_ALIGNED = 1
6393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org};
6493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
6593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Class for iterating through the break points in a function and changing
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// them.
6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass BreakLocationIterator {
6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  explicit BreakLocationIterator(Handle<DebugInfo> debug_info,
7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                 BreakLocatorType type);
7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual ~BreakLocationIterator();
7343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Next();
7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Next(int count);
7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void FindBreakLocationFromAddress(Address pc);
7793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  void FindBreakLocationFromPosition(int position,
7893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      BreakPositionAlignment alignment);
7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void Reset();
8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool Done() const;
8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void SetBreakPoint(Handle<Object> break_point_object);
8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void ClearBreakPoint(Handle<Object> break_point_object);
8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void SetOneShot();
8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void ClearOneShot();
851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  bool IsStepInLocation(Isolate* isolate);
86c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  void PrepareStepIn(Isolate* isolate);
8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool IsExit() const;
8843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool HasBreakPoint();
8943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool IsDebugBreak();
9043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Object* BreakPointObjects();
91381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org  void ClearAllDebugBreak();
9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  inline int code_position() {
95c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    return static_cast<int>(pc() - debug_info_->code()->entry());
96c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  }
9743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  inline int break_point() { return break_point_; }
9843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  inline int position() { return position_; }
9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  inline int statement_position() { return statement_position_; }
10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  inline Address pc() { return reloc_iterator_->rinfo()->pc(); }
10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  inline Code* code() { return debug_info_->code(); }
10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  inline RelocInfo* rinfo() { return reloc_iterator_->rinfo(); }
103236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  inline RelocInfo::Mode rmode() const {
104236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org    return reloc_iterator_->rinfo()->rmode();
105236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  }
10643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  inline RelocInfo* original_rinfo() {
10743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return reloc_iterator_original_->rinfo();
10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
109236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  inline RelocInfo::Mode original_rmode() const {
11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return reloc_iterator_original_->rinfo()->rmode();
11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org  bool IsDebuggerStatement();
114a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org
11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen protected:
11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool RinfoDone() const;
11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void RinfoNext();
11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  BreakLocatorType type_;
12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int break_point_;
12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int position_;
12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int statement_position_;
12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<DebugInfo> debug_info_;
12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  RelocIterator* reloc_iterator_;
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  RelocIterator* reloc_iterator_original_;
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void SetDebugBreak();
12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void ClearDebugBreak();
13065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
13165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  void SetDebugBreakAtIC();
13265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org  void ClearDebugBreakAtIC();
13365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org
134245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  bool IsDebugBreakAtReturn();
135245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  void SetDebugBreakAtReturn();
136245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  void ClearDebugBreakAtReturn();
13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1382356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  bool IsDebugBreakSlot();
1392356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  bool IsDebugBreakAtSlot();
1402356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  void SetDebugBreakAtSlot();
1412356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  void ClearDebugBreakAtSlot();
1422356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
1439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  DISALLOW_COPY_AND_ASSIGN(BreakLocationIterator);
14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Cache of all script objects in the heap. When a script is added a weak handle
14871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// to it is created and that weak handle is stored in the cache. The weak handle
14971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// callback takes care of removing the script from the cache. The key used in
15071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// the cache is the script id.
15171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgclass ScriptCache : private HashMap {
15271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org public:
1538d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  explicit ScriptCache(Isolate* isolate);
15471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  virtual ~ScriptCache() { Clear(); }
15571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
15671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  // Add script to the cache.
15771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  void Add(Handle<Script> script);
15871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
15971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  // Return the scripts in the cache.
16071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  Handle<FixedArray> GetScripts();
16171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
16271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org private:
16371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  // Calculate the hash value from the key (script id).
164f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  static uint32_t Hash(int key) {
165f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    return ComputeIntegerHash(key, v8::internal::kZeroHashSeed);
166f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
16771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
16871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  // Clear the cache releasing all the weak handles.
16971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  void Clear();
17071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
17171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  // Weak handle callback for scripts in the cache.
1724f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  static void HandleWeakScript(
1734f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org      const v8::WeakCallbackData<v8::Value, void>& data);
17471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
175e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org  Isolate* isolate_;
17671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org};
17771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
17871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org
17943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Linked list holding debug info objects. The debug info objects are kept as
18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// weak handles to avoid a debug info object to keep a function alive.
18143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass DebugInfoListNode {
18243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  explicit DebugInfoListNode(DebugInfo* debug_info);
18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual ~DebugInfoListNode();
18543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  DebugInfoListNode* next() { return next_; }
18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void set_next(DebugInfoListNode* next) { next_ = next; }
18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<DebugInfo> debug_info() { return debug_info_; }
18943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
19143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Global (weak) handle to the debug info object.
19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<DebugInfo> debug_info_;
19343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Next pointer for linked list.
19543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  DebugInfoListNode* next_;
19643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
19743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
198d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
199d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
200d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// Message delivered to the message handler callback. This is either a debugger
201d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// event or the response to a command.
202d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgclass MessageImpl: public v8::Debug::Message {
203d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org public:
204d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  // Create a message object for a debug event.
205d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static MessageImpl NewEvent(DebugEvent event,
206d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                              bool running,
207d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                              Handle<JSObject> exec_state,
208d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                              Handle<JSObject> event_data);
209d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
210d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  // Create a message object for the response to a debug command.
211d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static MessageImpl NewResponse(DebugEvent event,
212d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                                 bool running,
213d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                                 Handle<JSObject> exec_state,
214d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                                 Handle<JSObject> event_data,
215d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                                 Handle<String> response_json,
216d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                                 v8::Debug::ClientData* client_data);
217d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
218d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  // Implementation of interface v8::Debug::Message.
219d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual bool IsEvent() const;
220d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual bool IsResponse() const;
221d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual DebugEvent GetEvent() const;
222d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual bool WillStartRunning() const;
223d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual v8::Handle<v8::Object> GetExecutionState() const;
224d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual v8::Handle<v8::Object> GetEventData() const;
225d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual v8::Handle<v8::String> GetJSON() const;
226d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual v8::Handle<v8::Context> GetEventContext() const;
227d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual v8::Debug::ClientData* GetClientData() const;
228d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual v8::Isolate* GetIsolate() const;
229d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
230d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org private:
231d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  MessageImpl(bool is_event,
232d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org              DebugEvent event,
233d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org              bool running,
234d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org              Handle<JSObject> exec_state,
235d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org              Handle<JSObject> event_data,
236d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org              Handle<String> response_json,
237d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org              v8::Debug::ClientData* client_data);
238d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
239d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  bool is_event_;  // Does this message represent a debug event?
240d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  DebugEvent event_;  // Debug event causing the break.
241d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  bool running_;  // Will the VM start running after this event?
242d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Handle<JSObject> exec_state_;  // Current execution state.
243d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Handle<JSObject> event_data_;  // Data associated with the event.
244d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Handle<String> response_json_;  // Response JSON if message holds a response.
245d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Debug::ClientData* client_data_;  // Client data passed with the request.
246d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org};
247d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
248d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
249d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// Details of the debug event delivered to the debug event listener.
250d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgclass EventDetailsImpl : public v8::Debug::EventDetails {
251d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org public:
252d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  EventDetailsImpl(DebugEvent event,
253d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                   Handle<JSObject> exec_state,
254d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                   Handle<JSObject> event_data,
255d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                   Handle<Object> callback_data,
256d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                   v8::Debug::ClientData* client_data);
257d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual DebugEvent GetEvent() const;
258d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual v8::Handle<v8::Object> GetExecutionState() const;
259d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual v8::Handle<v8::Object> GetEventData() const;
260d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual v8::Handle<v8::Context> GetEventContext() const;
261d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual v8::Handle<v8::Value> GetCallbackData() const;
262d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  virtual v8::Debug::ClientData* GetClientData() const;
263d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org private:
264d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  DebugEvent event_;  // Debug event causing the break.
265d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Handle<JSObject> exec_state_;         // Current execution state.
266d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Handle<JSObject> event_data_;         // Data associated with the event.
267d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Handle<Object> callback_data_;        // User data passed with the callback
268d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                                        // when it was registered.
269d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Debug::ClientData* client_data_;  // Data passed to DebugBreakForCommand.
270d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org};
271d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
272d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
273d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// Message send by user to v8 debugger or debugger output message.
274d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// In addition to command text it may contain a pointer to some user data
275d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// which are expected to be passed along with the command reponse to message
276d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// handler.
277d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgclass CommandMessage {
278d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org public:
279d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static CommandMessage New(const Vector<uint16_t>& command,
280d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                            v8::Debug::ClientData* data);
281d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CommandMessage();
282d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
283d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  // Deletes user data and disposes of the text.
284d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void Dispose();
285d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Vector<uint16_t> text() const { return text_; }
286d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Debug::ClientData* client_data() const { return client_data_; }
287d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org private:
288d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CommandMessage(const Vector<uint16_t>& text,
289d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                 v8::Debug::ClientData* data);
290d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
291d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Vector<uint16_t> text_;
292d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Debug::ClientData* client_data_;
293d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org};
294d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
295d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
296d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// A Queue of CommandMessage objects.  A thread-safe version is
297d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// LockingCommandMessageQueue, based on this class.
298d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgclass CommandMessageQueue BASE_EMBEDDED {
299d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org public:
300d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  explicit CommandMessageQueue(int size);
301d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  ~CommandMessageQueue();
302d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  bool IsEmpty() const { return start_ == end_; }
303d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CommandMessage Get();
304d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void Put(const CommandMessage& message);
305d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void Clear() { start_ = end_ = 0; }  // Queue is empty after Clear().
306d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org private:
307d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  // Doubles the size of the message queue, and copies the messages.
308d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void Expand();
309d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
310d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CommandMessage* messages_;
311d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  int start_;
312d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  int end_;
313d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  int size_;  // The size of the queue buffer.  Queue can hold size-1 messages.
314d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org};
315d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
316d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
317d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// LockingCommandMessageQueue is a thread-safe circular buffer of CommandMessage
318d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// messages.  The message data is not managed by LockingCommandMessageQueue.
319d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// Pointers to the data are passed in and out. Implemented by adding a
320d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// Mutex to CommandMessageQueue.  Includes logging of all puts and gets.
321d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgclass LockingCommandMessageQueue BASE_EMBEDDED {
322d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org public:
323d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  LockingCommandMessageQueue(Logger* logger, int size);
324d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  bool IsEmpty() const;
325d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CommandMessage Get();
326d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void Put(const CommandMessage& message);
327d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void Clear();
328d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org private:
329d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Logger* logger_;
330d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CommandMessageQueue queue_;
3315de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  mutable base::Mutex mutex_;
332d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  DISALLOW_COPY_AND_ASSIGN(LockingCommandMessageQueue);
333d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org};
334d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
335d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
33643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// This class contains the debugger support. The main purpose is to handle
33743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// setting break points in the code.
33843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// This class controls the debug info for all functions which currently have
34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// active breakpoints in them. This debug info is held in the heap root object
34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// debug_info which is a FixedArray. Each entry in this list is of class
34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DebugInfo.
34343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Debug {
34443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
3458d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  // Debug event triggers.
3468d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  void OnDebugBreak(Handle<Object> break_points_hit, bool auto_continue);
3479d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org
3489d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  void OnThrow(Handle<Object> exception, bool uncaught);
3499d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  void OnPromiseReject(Handle<JSObject> promise, Handle<Object> value);
350248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  void OnCompileError(Handle<Script> script);
3518d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  void OnBeforeCompile(Handle<Script> script);
352248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  void OnAfterCompile(Handle<Script> script);
3535de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  void OnPromiseEvent(Handle<JSObject> data);
354d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  void OnAsyncTaskEvent(Handle<JSObject> data);
355d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
3568d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  // API facing.
357d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void SetEventListener(Handle<Object> callback, Handle<Object> data);
358d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void SetMessageHandler(v8::Debug::MessageHandler handler);
359d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void EnqueueCommandMessage(Vector<const uint16_t> command,
360d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                             v8::Debug::ClientData* client_data = NULL);
361d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  // Enqueue a debugger command to the command queue for event listeners.
362d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void EnqueueDebugCommand(v8::Debug::ClientData* client_data = NULL);
363d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  MUST_USE_RESULT MaybeHandle<Object> Call(Handle<JSFunction> fun,
364d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                                           Handle<Object> data);
365d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Handle<Context> GetDebugContext();
3668d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  void HandleDebugBreak();
3678d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  void ProcessDebugMessages(bool debug_command_only);
368d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
3698d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  // Internal logic
370ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool Load();
371e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  void Break(Arguments args, JavaScriptFrame*);
372e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  void SetAfterBreakTarget(JavaScriptFrame* frame);
3738d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
3748d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  // Scripts handling.
3758d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  Handle<FixedArray> GetLoadedScripts();
3768d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
3778d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  // Break point handling.
378a7cc028b1ce5d5b762b630529fa1956d89f76541machenbach@chromium.org  bool SetBreakPoint(Handle<JSFunction> function,
379ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                     Handle<Object> break_point_object,
380ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                     int* source_position);
3815a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  bool SetBreakPointForScript(Handle<Script> script,
3825a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org                              Handle<Object> break_point_object,
38393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                              int* source_position,
38493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                              BreakPositionAlignment alignment);
385ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ClearBreakPoint(Handle<Object> break_point_object);
386ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ClearAllBreakPoints();
3875a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  void FloodWithOneShot(Handle<JSFunction> function);
3882c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  void FloodBoundFunctionWithOneShot(Handle<JSFunction> function);
389ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void FloodHandlerWithOneShot();
390ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ChangeBreakOnException(ExceptionBreakType type, bool enable);
391ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool IsBreakOnException(ExceptionBreakType type);
392a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
3938d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  // Stepping handling.
394639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  void PrepareStep(StepAction step_action,
395639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org                   int step_count,
396639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org                   StackFrame::Id frame_id);
397ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ClearStepping();
39888d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org  void ClearStepOut();
39988d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org  bool IsStepping() { return thread_local_.step_count_ > 0; }
400ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool StepNextContinue(BreakLocationIterator* break_location_iterator,
401ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                        JavaScriptFrame* frame);
4028d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  bool StepInActive() { return thread_local_.step_into_fp_ != 0; }
4038d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  void HandleStepIn(Handle<JSFunction> function,
4048d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org                    Handle<Object> holder,
4058d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org                    Address fp,
4068d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org                    bool is_constructor);
4078d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  bool StepOutActive() { return thread_local_.step_out_fp_ != 0; }
408bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund
4098d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  // Purge all code objects that have no debug break slots.
41034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  void PrepareForBreakPoints();
41134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
4125a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // Returns whether the operation succeeded. Compilation can only be triggered
4135a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // if a valid closure is passed as the second argument, otherwise the shared
4145a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  // function needs to be compiled already.
4155a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  bool EnsureDebugInfo(Handle<SharedFunctionInfo> shared,
4165a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org                       Handle<JSFunction> function);
4178d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  static Handle<DebugInfo> GetDebugInfo(Handle<SharedFunctionInfo> shared);
4188d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  static bool HasDebugInfo(Handle<SharedFunctionInfo> shared);
4198d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
4208d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  // This function is used in FunctionNameUsing* tests.
4218d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  Object* FindSharedFunctionInfoInScript(Handle<Script> script, int position);
422bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund
423911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  // Returns true if the current stub call is patched to call the debugger.
42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static bool IsDebugBreak(Address addr);
425911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  // Returns true if the current return statement has been patched to be
426911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  // a debugger breakpoint.
427381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org  static bool IsDebugBreakAtReturn(RelocInfo* rinfo);
42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Handle<Object> GetSourceBreakLocations(
43093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      Handle<SharedFunctionInfo> shared,
43193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      BreakPositionAlignment position_aligment);
43243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Check whether a global object is the debug global object.
434ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool IsDebugGlobal(GlobalObject* global);
43543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4362cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org  // Check whether this frame is just about to return.
437ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool IsBreakAtReturn(JavaScriptFrame* frame);
4382cc82ae439960d1adaf4374e093730dc23945d59ager@chromium.org
4398d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  // Support for LiveEdit
440e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  void FramesHaveBeenDropped(StackFrame::Id new_break_frame_id,
441e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org                             LiveEdit::FrameDropMode mode,
442e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org                             Object** restarter_frame_function_pointer);
44343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
444ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Passed to MakeWeak.
4454f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  static void HandleWeakDebugInfo(
4464f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org      const v8::WeakCallbackData<v8::Value, void>& data);
44743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Threading support.
449ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  char* ArchiveDebug(char* to);
450ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  char* RestoreDebug(char* from);
45143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static int ArchiveSpacePerThread();
452ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void FreeThreadResources() { }
45343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4544954674151afa960af66efb4831df06bde727333yangguo@chromium.org  // Record function from which eval was called.
4554954674151afa960af66efb4831df06bde727333yangguo@chromium.org  static void RecordEvalCaller(Handle<Script> script);
4564954674151afa960af66efb4831df06bde727333yangguo@chromium.org
4578d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  // Flags and states.
458196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  DebugScope* debugger_entry() { return thread_local_.current_debug_scope_; }
4598d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  inline Handle<Context> debug_context() { return debug_context_; }
4608d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  void set_live_edit_enabled(bool v) { live_edit_enabled_ = v; }
4618d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  bool live_edit_enabled() const {
4628d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    return FLAG_enable_liveedit && live_edit_enabled_ ;
4638d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  }
4648d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
4658d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  inline bool is_active() const { return is_active_; }
4668d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  inline bool is_loaded() const { return !debug_context_.is_null(); }
4678d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  inline bool has_break_points() const { return has_break_points_; }
468196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  inline bool in_debug_scope() const {
469196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    return thread_local_.current_debug_scope_ != NULL;
4708d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  }
4718d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  void set_disable_break(bool v) { break_disabled_ = v; }
4728d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
4738d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  StackFrame::Id break_frame_id() { return thread_local_.break_frame_id_; }
4748d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  int break_id() { return thread_local_.break_id_; }
4758d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
4768d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  // Support for embedding into generated code.
477975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  Address is_active_address() {
478975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org    return reinterpret_cast<Address>(&is_active_);
479975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  }
480975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
4818d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  Address after_break_target_address() {
4828d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    return reinterpret_cast<Address>(&after_break_target_);
4838d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  }
4848d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
4858d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  Address restarter_frame_function_pointer_address() {
4868d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    Object*** address = &thread_local_.restarter_frame_function_pointer_;
4878d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    return reinterpret_cast<Address>(address);
4888d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  }
4898d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
4908d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  Address step_in_fp_addr() {
4918d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    return reinterpret_cast<Address>(&thread_local_.step_into_fp_);
4928d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  }
4938d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
49443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
495ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  explicit Debug(Isolate* isolate);
496ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4978d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  void UpdateState();
4988d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  void Unload();
4998d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  void SetNextBreakId() {
5008d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    thread_local_.break_id_ = ++thread_local_.break_count_;
5018d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  }
5028d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
5038d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  // Check whether there are commands in the command queue.
5048d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  inline bool has_commands() const { return !command_queue_.IsEmpty(); }
5058d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  inline bool ignore_events() const { return is_suppressed_ || !is_active_; }
5068d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
5079d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  void OnException(Handle<Object> exception, bool uncaught,
5089d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org                   Handle<Object> promise);
5099d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org
5108d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  // Constructors for debug event objects.
511d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  MUST_USE_RESULT MaybeHandle<Object> MakeJSObject(
5128d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org      const char* constructor_name,
513d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      int argc,
514d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      Handle<Object> argv[]);
515d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  MUST_USE_RESULT MaybeHandle<Object> MakeExecutionState();
516d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  MUST_USE_RESULT MaybeHandle<Object> MakeBreakEvent(
517d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      Handle<Object> break_points_hit);
518d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  MUST_USE_RESULT MaybeHandle<Object> MakeExceptionEvent(
519d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      Handle<Object> exception,
520d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      bool uncaught,
521d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      Handle<Object> promise);
522d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  MUST_USE_RESULT MaybeHandle<Object> MakeCompileEvent(
523248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org      Handle<Script> script, v8::DebugEvent type);
5245de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  MUST_USE_RESULT MaybeHandle<Object> MakePromiseEvent(
5255de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      Handle<JSObject> promise_event);
526d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  MUST_USE_RESULT MaybeHandle<Object> MakeAsyncTaskEvent(
527d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org      Handle<JSObject> task_event);
528d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
5298d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  // Mirror cache handling.
5308d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  void ClearMirrorCache();
5318d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
5329d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  // Returns a promise if the pushed try-catch handler matches the current one.
5339d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  bool PromiseHasRejectHandler(Handle<JSObject> promise);
5348d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
535d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void CallEventCallback(v8::DebugEvent event,
536d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                         Handle<Object> exec_state,
537d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                         Handle<Object> event_data,
538d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                         v8::Debug::ClientData* client_data);
539d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void ProcessDebugEvent(v8::DebugEvent event,
540d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                         Handle<JSObject> event_data,
541d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                         bool auto_continue);
542d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void NotifyMessageHandler(v8::DebugEvent event,
543d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                            Handle<JSObject> exec_state,
544d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                            Handle<JSObject> event_data,
545d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                            bool auto_continue);
546d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void InvokeMessageHandler(MessageImpl message);
547d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
548e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org  static bool CompileDebuggerScript(Isolate* isolate, int index);
549ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ClearOneShot();
550ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ActivateStepIn(StackFrame* frame);
551ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ClearStepIn();
552ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ActivateStepOut(StackFrame* frame);
553ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void ClearStepNext();
5543291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // Returns whether the compile succeeded.
555ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void RemoveDebugInfo(Handle<DebugInfo> debug_info);
556ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Handle<Object> CheckBreakPoints(Handle<Object> break_point);
557ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool CheckBreakPoint(Handle<Object> break_point_object);
55843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
559196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  inline void AssertDebugContext() {
560e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(isolate_->context() == *debug_context());
561e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(in_debug_scope());
562196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
563196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
564d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void ThreadInit();
56543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
566d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  // Global handles.
567d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Handle<Context> debug_context_;
568d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Handle<Object> event_listener_;
569d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Handle<Object> event_listener_data_;
570d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
571d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  v8::Debug::MessageHandler message_handler_;
572d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
573d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static const int kQueueInitialSize = 4;
5745de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  base::Semaphore command_received_;  // Signaled for each command received.
575d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  LockingCommandMessageQueue command_queue_;
576d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  LockingCommandMessageQueue event_command_queue_;
577d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
578d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  bool is_active_;
5798d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  bool is_suppressed_;
580d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  bool live_edit_enabled_;
581d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  bool has_break_points_;
5828d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  bool break_disabled_;
583d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  bool break_on_exception_;
584d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  bool break_on_uncaught_exception_;
585d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
586d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  ScriptCache* script_cache_;  // Cache of all scripts in the heap.
587d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  DebugInfoListNode* debug_info_list_;  // List of active debug info objects.
588d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
589e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  // Storage location for jump when exiting debug break calls.
590e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  // Note that this address is not GC safe.  It should be computed immediately
591e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  // before returning to the DebugBreakCallHelper.
592e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  Address after_break_target_;
593e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org
5947be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  // Per-thread data.
59543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  class ThreadLocal {
59643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen   public:
597e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org    // Top debugger entry.
598196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    DebugScope* current_debug_scope_;
599e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org
6007be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    // Counter for generating next break id.
6017be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    int break_count_;
6027be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
6037be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    // Current break id.
6047be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    int break_id_;
6057be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
6067be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    // Frame id for the frame of the current break.
6077be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    StackFrame::Id break_frame_id_;
6087be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
60943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Step action for last step performed.
61043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    StepAction last_step_action_;
61143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Source statement position from last step next action.
61343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    int last_statement_position_;
61443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Number of steps left to perform before debug event.
61643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    int step_count_;
61743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Frame pointer from last step next action.
61943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Address last_fp_;
62043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    // Number of queued steps left to perform before debug event.
62234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    int queued_step_count_;
62334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Frame pointer for frame from which step in was performed.
62543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Address step_into_fp_;
62643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
627a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    // Frame pointer for the frame where debugger should be called when current
628a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    // step out action is completed.
629a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org    Address step_out_fp_;
630a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org
63169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org    // Stores the way how LiveEdit has patched the stack. It is used when
63269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org    // debugger returns control back to user script.
633e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org    LiveEdit::FrameDropMode frame_drop_mode_;
634e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org
635e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    // When restarter frame is on stack, stores the address
636e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    // of the pointer to function being restarted. Otherwise (most of the time)
637e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    // stores NULL. This pointer is used with 'step in' implementation.
638e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org    Object** restarter_frame_function_pointer_;
63943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  };
64043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Storage location for registers when handling debug break calls
642ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ThreadLocal thread_local_;
64343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
644ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate* isolate_;
645ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
646ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  friend class Isolate;
647196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  friend class DebugScope;
6488d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  friend class DisableBreak;
6498ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org  friend class LiveEdit;
6508d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  friend class SuppressDebug;
6518d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
6528d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  friend Handle<FixedArray> GetDebuggedFunctions();  // In test-debug.cc
6538d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  friend void CheckDebuggerUnloaded(bool check_functions);  // In test-debug.cc
6542356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org
6559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  DISALLOW_COPY_AND_ASSIGN(Debug);
65643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
65743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
659a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgDECLARE_RUNTIME_FUNCTION(Debug_Break);
660c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
661c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
662196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// This scope is used to load and enter the debug context and create a new
663196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// break state.  Leaving the scope will restore the previous state.
664196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org// On failure to load, FailedToEnter returns true.
665196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgclass DebugScope BASE_EMBEDDED {
66643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
667196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  explicit DebugScope(Debug* debug);
668196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ~DebugScope();
66943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
670196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Check whether loading was successful.
671196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  inline bool failed() { return failed_; }
67241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
6739085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  // Get the active context from before entering the debugger.
6749085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  inline Handle<Context> GetContext() { return save_.context(); }
6759085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
67643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
677196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  Isolate* isolate() { return debug_->isolate_; }
678196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
679196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  Debug* debug_;
680196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  DebugScope* prev_;               // Previous scope if entered recursively.
68143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  StackFrame::Id break_frame_id_;  // Previous break frame id.
682196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  int break_id_;                   // Previous break id.
683196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  bool failed_;                    // Did the debug context fail to load?
684196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  SaveContext save_;               // Saves previous context.
685f78524cb19cf078611235da0d6e361207f7eacdcmachenbach@chromium.org  PostponeInterruptsScope no_termination_exceptons_;
68643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
68743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
68843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
689bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund// Stack allocated class for disabling break.
690bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lundclass DisableBreak BASE_EMBEDDED {
691bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund public:
6928d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  explicit DisableBreak(Debug* debug, bool disable_break)
6938d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    : debug_(debug), old_state_(debug->break_disabled_) {
6948d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    debug_->break_disabled_ = disable_break;
695bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  }
6968d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  ~DisableBreak() { debug_->break_disabled_ = old_state_; }
6978d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
6988d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org private:
6998d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  Debug* debug_;
7008d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  bool old_state_;
7018d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  DISALLOW_COPY_AND_ASSIGN(DisableBreak);
7028d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org};
7038d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
7048d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
7058d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.orgclass SuppressDebug BASE_EMBEDDED {
7068d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org public:
7078d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  explicit SuppressDebug(Debug* debug)
7088d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org      : debug_(debug), old_state_(debug->is_suppressed_) {
7098d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    debug_->is_suppressed_ = true;
710bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund  }
7118d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  ~SuppressDebug() { debug_->is_suppressed_ = old_state_; }
712bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund
713bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund private:
7148d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  Debug* debug_;
7158d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  bool old_state_;
7168d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  DISALLOW_COPY_AND_ASSIGN(SuppressDebug);
717bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund};
718bd3ec4e5037180e591d597bc7a8c92200798c3dbkasper.lund
719d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
720d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// Code generator routines.
721d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgclass DebugCodegen : public AllStatic {
722d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org public:
723d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static void GenerateSlot(MacroAssembler* masm);
724d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static void GenerateCallICStubDebugBreak(MacroAssembler* masm);
725d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static void GenerateLoadICDebugBreak(MacroAssembler* masm);
726d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static void GenerateStoreICDebugBreak(MacroAssembler* masm);
727d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static void GenerateKeyedLoadICDebugBreak(MacroAssembler* masm);
728d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static void GenerateKeyedStoreICDebugBreak(MacroAssembler* masm);
729d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static void GenerateCompareNilICDebugBreak(MacroAssembler* masm);
730d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static void GenerateReturnDebugBreak(MacroAssembler* masm);
731d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static void GenerateCallFunctionStubDebugBreak(MacroAssembler* masm);
732d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static void GenerateCallConstructStubDebugBreak(MacroAssembler* masm);
733d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static void GenerateCallConstructStubRecordDebugBreak(MacroAssembler* masm);
734d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static void GenerateSlotDebugBreak(MacroAssembler* masm);
735d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static void GeneratePlainReturnLiveEdit(MacroAssembler* masm);
736d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
737d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  // FrameDropper is a code replacement for a JavaScript frame with possibly
738d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  // several frames above.
739d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  // There is no calling conventions here, because it never actually gets
740d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  // called, it only gets returned to.
741d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static void GenerateFrameDropperLiveEdit(MacroAssembler* masm);
742d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org};
743d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
744e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org
74543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
74643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7475ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#endif  // V8_DEBUG_H_
748