text: // Copyright 2017 the V8 project authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef V8_DEBUG_DEBUG_SCOPE_ITERATOR_H_
  #define V8_DEBUG_DEBUG_SCOPE_ITERATOR_H_
  
  #include "src/debug/debug-frames.h"
  #include "src/debug/debug-interface.h"
  #include "src/debug/debug-scopes.h"
  
  namespace v8 {
  namespace internal {
  
  class DebugScopeIterator final : public debug::ScopeIterator {
   public:
    DebugScopeIterator(Isolate* isolate, FrameInspector* frame_inspector);
    DebugScopeIterator(Isolate* isolate, Handle<JSFunction> function);
    DebugScopeIterator(Isolate* isolate, Handle<JSGeneratorObject> generator);
  
    bool Done() override;
    void Advance() override;
    ScopeType GetType() override;
    v8::Local<v8::Object> GetObject() override;
    v8::Local<v8::Value> GetFunctionDebugName() override;
    int GetScriptId() override;
    bool HasLocationInfo() override;
    debug::Location GetStartLocation() override;
    debug::Location GetEndLocation() override;
  
    bool SetVariableValue(v8::Local<v8::String> name,
                          v8::Local<v8::Value> value) override;
  
   private:
    bool ShouldIgnore();
  
    v8::internal::ScopeIterator iterator_;
  };
  
  class DebugWasmScopeIterator final : public debug::ScopeIterator {
   public:
    DebugWasmScopeIterator(Isolate* isolate, StandardFrame* frame,
                           int inlined_frame_index);
  
    bool Done() override;
    void Advance() override;
    ScopeType GetType() override;
    v8::Local<v8::Object> GetObject() override;
    v8::Local<v8::Value> GetFunctionDebugName() override;
    int GetScriptId() override;
    bool HasLocationInfo() override;
    debug::Location GetStartLocation() override;
    debug::Location GetEndLocation() override;
  
    bool SetVariableValue(v8::Local<v8::String> name,
                          v8::Local<v8::Value> value) override;
   private:
    Isolate* isolate_;
    StandardFrame* frame_;
    int inlined_frame_index_;
    ScopeType type_;
  };
  }  // namespace internal
  }  // namespace v8
  
  #endif  // V8_DEBUG_DEBUG_SCOPE_ITERATOR_H_
  