| Index: src/inspector/v8-debugger.h
 | 
| diff --git a/src/inspector/v8-debugger.h b/src/inspector/v8-debugger.h
 | 
| index 1e2746040f4f835ea13aba6b759df701de02a051..784f4ba4fabce97592673db8c725993369383f72 100644
 | 
| --- a/src/inspector/v8-debugger.h
 | 
| +++ b/src/inspector/v8-debugger.h
 | 
| @@ -5,6 +5,7 @@
 | 
|  #ifndef V8_INSPECTOR_V8DEBUGGER_H_
 | 
|  #define V8_INSPECTOR_V8DEBUGGER_H_
 | 
|  
 | 
| +#include <list>
 | 
|  #include <vector>
 | 
|  
 | 
|  #include "src/base/macros.h"
 | 
| @@ -20,7 +21,9 @@
 | 
|  
 | 
|  namespace v8_inspector {
 | 
|  
 | 
| +class AsyncStackTrace;
 | 
|  struct ScriptBreakpoint;
 | 
| +class V8Debugger;
 | 
|  class V8DebuggerAgentImpl;
 | 
|  class V8InspectorImpl;
 | 
|  class V8StackTraceImpl;
 | 
| @@ -35,6 +38,7 @@ class V8Debugger : public v8::debug::DebugDelegate {
 | 
|    ~V8Debugger();
 | 
|  
 | 
|    bool enabled() const;
 | 
| +  v8::Isolate* isolate() const { return m_isolate; }
 | 
|  
 | 
|    String16 setBreakpoint(const ScriptBreakpoint&, int* actualLineNumber,
 | 
|                           int* actualColumnNumber);
 | 
| @@ -76,9 +80,11 @@ class V8Debugger : public v8::debug::DebugDelegate {
 | 
|    v8::Local<v8::Context> pausedContext() { return m_pausedContext; }
 | 
|  
 | 
|    int maxAsyncCallChainDepth() { return m_maxAsyncCallStackDepth; }
 | 
| -  V8StackTraceImpl* currentAsyncCallChain();
 | 
| -  V8StackTraceImpl* currentAsyncTaskCreationStack();
 | 
|    void setAsyncCallStackDepth(V8DebuggerAgentImpl*, int);
 | 
| +
 | 
| +  std::shared_ptr<AsyncStackTrace> currentAsyncParent();
 | 
| +  std::shared_ptr<AsyncStackTrace> currentAsyncCreation();
 | 
| +
 | 
|    std::unique_ptr<V8StackTraceImpl> createStackTrace(v8::Local<v8::StackTrace>);
 | 
|    std::unique_ptr<V8StackTraceImpl> captureStackTrace(bool fullStack);
 | 
|  
 | 
| @@ -99,7 +105,7 @@ class V8Debugger : public v8::debug::DebugDelegate {
 | 
|  
 | 
|    WasmTranslation* wasmTranslation() { return &m_wasmTranslation; }
 | 
|  
 | 
| -  void setMaxAsyncTaskStacksForTest(int limit) { m_maxAsyncCallStacks = limit; }
 | 
| +  void setMaxAsyncTaskStacksForTest(int limit);
 | 
|  
 | 
|   private:
 | 
|    void compileDebuggerScript();
 | 
| @@ -144,8 +150,6 @@ class V8Debugger : public v8::debug::DebugDelegate {
 | 
|    void asyncTaskFinishedForStepping(void* task);
 | 
|    void asyncTaskCanceledForStepping(void* task);
 | 
|  
 | 
| -  void registerAsyncTaskIfNeeded(void* task);
 | 
| -
 | 
|    // v8::debug::DebugEventListener implementation.
 | 
|    void PromiseEventOccurred(v8::debug::PromiseDebugActionType type, int id,
 | 
|                              int parentId, bool createdByUser) override;
 | 
| @@ -178,18 +182,24 @@ class V8Debugger : public v8::debug::DebugDelegate {
 | 
|    int m_targetContextGroupId = 0;
 | 
|  
 | 
|    using AsyncTaskToStackTrace =
 | 
| -      protocol::HashMap<void*, std::unique_ptr<V8StackTraceImpl>>;
 | 
| +      protocol::HashMap<void*, std::weak_ptr<AsyncStackTrace>>;
 | 
|    AsyncTaskToStackTrace m_asyncTaskStacks;
 | 
|    AsyncTaskToStackTrace m_asyncTaskCreationStacks;
 | 
|    int m_maxAsyncCallStacks;
 | 
| -  std::map<int, void*> m_idToTask;
 | 
| -  std::unordered_map<void*, int> m_taskToId;
 | 
| -  int m_lastTaskId;
 | 
|    protocol::HashSet<void*> m_recurringTasks;
 | 
|    int m_maxAsyncCallStackDepth;
 | 
| +
 | 
|    std::vector<void*> m_currentTasks;
 | 
| -  std::vector<std::unique_ptr<V8StackTraceImpl>> m_currentStacks;
 | 
| -  std::vector<std::unique_ptr<V8StackTraceImpl>> m_currentCreationStacks;
 | 
| +  std::vector<std::shared_ptr<AsyncStackTrace>> m_currentAsyncParent;
 | 
| +  std::vector<std::shared_ptr<AsyncStackTrace>> m_currentAsyncCreation;
 | 
| +
 | 
| +  void collectOldAsyncStacksIfNeeded();
 | 
| +  void removeOldAsyncTasks(AsyncTaskToStackTrace& map);
 | 
| +  int m_asyncStacksCount = 0;
 | 
| +  // V8Debugger owns all the async stacks, while most of the other references
 | 
| +  // are weak, which allows to collect some stacks when there are too many.
 | 
| +  std::list<std::shared_ptr<AsyncStackTrace>> m_allAsyncStacks;
 | 
| +
 | 
|    protocol::HashMap<V8DebuggerAgentImpl*, int> m_maxAsyncCallStackDepthMap;
 | 
|    protocol::HashMap<void*, void*> m_parentTask;
 | 
|    protocol::HashMap<void*, void*> m_firstNextTask;
 | 
| 
 |