| // Copyright 2016 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_INTERFACE_H_ | 
 | #define V8_DEBUG_DEBUG_INTERFACE_H_ | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "include/v8-inspector.h" | 
 | #include "include/v8-util.h" | 
 | #include "include/v8.h" | 
 | #include "src/base/platform/time.h" | 
 | #include "src/common/globals.h" | 
 | #include "src/debug/interface-types.h" | 
 | #include "src/utils/vector.h" | 
 |  | 
 | namespace v8 { | 
 |  | 
 | namespace internal { | 
 | struct CoverageBlock; | 
 | struct CoverageFunction; | 
 | struct CoverageScript; | 
 | struct TypeProfileEntry; | 
 | struct TypeProfileScript; | 
 | class Coverage; | 
 | class DisableBreak; | 
 | class PostponeInterruptsScope; | 
 | class Script; | 
 | class TypeProfile; | 
 | }  // namespace internal | 
 |  | 
 | namespace debug { | 
 |  | 
 | void SetContextId(Local<Context> context, int id); | 
 | int GetContextId(Local<Context> context); | 
 |  | 
 | void SetInspector(Isolate* isolate, v8_inspector::V8Inspector*); | 
 | v8_inspector::V8Inspector* GetInspector(Isolate* isolate); | 
 |  | 
 | // Schedule a debugger break to happen when function is called inside given | 
 | // isolate. | 
 | V8_EXPORT_PRIVATE void SetBreakOnNextFunctionCall(Isolate* isolate); | 
 |  | 
 | // Remove scheduled debugger break in given isolate if it has not | 
 | // happened yet. | 
 | V8_EXPORT_PRIVATE void ClearBreakOnNextFunctionCall(Isolate* isolate); | 
 |  | 
 | /** | 
 |  * Returns array of internal properties specific to the value type. Result has | 
 |  * the following format: [<name>, <value>,...,<name>, <value>]. Result array | 
 |  * will be allocated in the current context. | 
 |  */ | 
 | MaybeLocal<Array> GetInternalProperties(Isolate* isolate, Local<Value> value); | 
 |  | 
 | /** | 
 |  * Returns through the out parameters names_out a vector of names | 
 |  * in v8::String for private members, including fields, methods, | 
 |  * accessors specific to the value type. | 
 |  * The values are returned through the out parameter values_out in the | 
 |  * corresponding indices. Private fields and methods are returned directly | 
 |  * while accessors are returned as v8::debug::AccessorPair. Missing components | 
 |  * in the accessor pairs are null. | 
 |  * If an exception occurs, false is returned. Otherwise true is returned. | 
 |  * Results will be allocated in the current context and handle scope. | 
 |  */ | 
 | V8_EXPORT_PRIVATE bool GetPrivateMembers(Local<Context> context, | 
 |                                          Local<Object> value, | 
 |                                          std::vector<Local<Value>>* names_out, | 
 |                                          std::vector<Local<Value>>* values_out); | 
 |  | 
 | /** | 
 |  * Forwards to v8::Object::CreationContext, but with special handling for | 
 |  * JSGlobalProxy objects. | 
 |  */ | 
 | Local<Context> GetCreationContext(Local<Object> value); | 
 |  | 
 | enum ExceptionBreakState { | 
 |   NoBreakOnException = 0, | 
 |   BreakOnUncaughtException = 1, | 
 |   BreakOnAnyException = 2 | 
 | }; | 
 |  | 
 | /** | 
 |  * Defines if VM will pause on exceptions or not. | 
 |  * If BreakOnAnyExceptions is set then VM will pause on caught and uncaught | 
 |  * exception, if BreakOnUncaughtException is set then VM will pause only on | 
 |  * uncaught exception, otherwise VM won't stop on any exception. | 
 |  */ | 
 | void ChangeBreakOnException(Isolate* isolate, ExceptionBreakState state); | 
 |  | 
 | void RemoveBreakpoint(Isolate* isolate, BreakpointId id); | 
 | void SetBreakPointsActive(Isolate* isolate, bool is_active); | 
 |  | 
 | enum StepAction { | 
 |   StepOut = 0,   // Step out of the current function. | 
 |   StepNext = 1,  // Step to the next statement in the current function. | 
 |   StepIn = 2     // Step into new functions invoked or the next statement | 
 |                  // in the current function. | 
 | }; | 
 |  | 
 | void PrepareStep(Isolate* isolate, StepAction action); | 
 | void ClearStepping(Isolate* isolate); | 
 | V8_EXPORT_PRIVATE void BreakRightNow(Isolate* isolate); | 
 |  | 
 | // Use `SetTerminateOnResume` to indicate that an TerminateExecution interrupt | 
 | // should be set shortly before resuming, i.e. shortly before returning into | 
 | // the JavaScript stack frames on the stack. In contrast to setting the | 
 | // interrupt with `RequestTerminateExecution` directly, this flag allows | 
 | // the isolate to be entered for further JavaScript execution. | 
 | V8_EXPORT_PRIVATE void SetTerminateOnResume(Isolate* isolate); | 
 |  | 
 | bool AllFramesOnStackAreBlackboxed(Isolate* isolate); | 
 |  | 
 | class Script; | 
 |  | 
 | struct LiveEditResult { | 
 |   enum Status { | 
 |     OK, | 
 |     COMPILE_ERROR, | 
 |     BLOCKED_BY_RUNNING_GENERATOR, | 
 |     BLOCKED_BY_FUNCTION_ABOVE_BREAK_FRAME, | 
 |     BLOCKED_BY_FUNCTION_BELOW_NON_DROPPABLE_FRAME, | 
 |     BLOCKED_BY_ACTIVE_FUNCTION, | 
 |     BLOCKED_BY_NEW_TARGET_IN_RESTART_FRAME, | 
 |     FRAME_RESTART_IS_NOT_SUPPORTED | 
 |   }; | 
 |   Status status = OK; | 
 |   bool stack_changed = false; | 
 |   // Available only for OK. | 
 |   v8::Local<v8::debug::Script> script; | 
 |   // Fields below are available only for COMPILE_ERROR. | 
 |   v8::Local<v8::String> message; | 
 |   int line_number = -1; | 
 |   int column_number = -1; | 
 | }; | 
 |  | 
 | /** | 
 |  * Native wrapper around v8::internal::Script object. | 
 |  */ | 
 | class V8_EXPORT_PRIVATE Script { | 
 |  public: | 
 |   v8::Isolate* GetIsolate() const; | 
 |  | 
 |   ScriptOriginOptions OriginOptions() const; | 
 |   bool WasCompiled() const; | 
 |   bool IsEmbedded() const; | 
 |   int Id() const; | 
 |   int LineOffset() const; | 
 |   int ColumnOffset() const; | 
 |   std::vector<int> LineEnds() const; | 
 |   MaybeLocal<String> Name() const; | 
 |   MaybeLocal<String> SourceURL() const; | 
 |   MaybeLocal<String> SourceMappingURL() const; | 
 |   Maybe<int> ContextId() const; | 
 |   MaybeLocal<String> Source() const; | 
 |   bool IsWasm() const; | 
 |   bool IsModule() const; | 
 |   bool GetPossibleBreakpoints( | 
 |       const debug::Location& start, const debug::Location& end, | 
 |       bool restrict_to_function, | 
 |       std::vector<debug::BreakLocation>* locations) const; | 
 |   int GetSourceOffset(const debug::Location& location) const; | 
 |   v8::debug::Location GetSourceLocation(int offset) const; | 
 |   bool SetScriptSource(v8::Local<v8::String> newSource, bool preview, | 
 |                        LiveEditResult* result) const; | 
 |   bool SetBreakpoint(v8::Local<v8::String> condition, debug::Location* location, | 
 |                      BreakpointId* id) const; | 
 |   void RemoveWasmBreakpoint(BreakpointId id); | 
 |   bool SetBreakpointOnScriptEntry(BreakpointId* id) const; | 
 | }; | 
 |  | 
 | // Specialization for wasm Scripts. | 
 | class WasmScript : public Script { | 
 |  public: | 
 |   static WasmScript* Cast(Script* script); | 
 |  | 
 |   enum class DebugSymbolsType { None, SourceMap, EmbeddedDWARF, ExternalDWARF }; | 
 |   DebugSymbolsType GetDebugSymbolType() const; | 
 |   MemorySpan<const char> ExternalSymbolsURL() const; | 
 |   int NumFunctions() const; | 
 |   int NumImportedFunctions() const; | 
 |   MemorySpan<const uint8_t> Bytecode() const; | 
 |  | 
 |   std::pair<int, int> GetFunctionRange(int function_index) const; | 
 |   int GetContainingFunction(int byte_offset) const; | 
 |  | 
 |   uint32_t GetFunctionHash(int function_index); | 
 |  | 
 |   int CodeOffset() const; | 
 |   int CodeLength() const; | 
 | }; | 
 |  | 
 | V8_EXPORT_PRIVATE void GetLoadedScripts( | 
 |     Isolate* isolate, | 
 |     PersistentValueVector<Script>& scripts);  // NOLINT(runtime/references) | 
 |  | 
 | MaybeLocal<UnboundScript> CompileInspectorScript(Isolate* isolate, | 
 |                                                  Local<String> source); | 
 |  | 
 | enum ExceptionType { kException, kPromiseRejection }; | 
 |  | 
 | class DebugDelegate { | 
 |  public: | 
 |   virtual ~DebugDelegate() = default; | 
 |   virtual void ScriptCompiled(v8::Local<Script> script, bool is_live_edited, | 
 |                               bool has_compile_error) {} | 
 |   // |inspector_break_points_hit| contains id of breakpoints installed with | 
 |   // debug::Script::SetBreakpoint API. | 
 |   virtual void BreakProgramRequested( | 
 |       v8::Local<v8::Context> paused_context, | 
 |       const std::vector<debug::BreakpointId>& inspector_break_points_hit) {} | 
 |   virtual void ExceptionThrown(v8::Local<v8::Context> paused_context, | 
 |                                v8::Local<v8::Value> exception, | 
 |                                v8::Local<v8::Value> promise, bool is_uncaught, | 
 |                                ExceptionType exception_type) {} | 
 |   virtual bool IsFunctionBlackboxed(v8::Local<debug::Script> script, | 
 |                                     const debug::Location& start, | 
 |                                     const debug::Location& end) { | 
 |     return false; | 
 |   } | 
 |   virtual bool ShouldBeSkipped(v8::Local<v8::debug::Script> script, int line, | 
 |                                int column) { | 
 |     return false; | 
 |   } | 
 | }; | 
 |  | 
 | V8_EXPORT_PRIVATE void SetDebugDelegate(Isolate* isolate, | 
 |                                         DebugDelegate* listener); | 
 |  | 
 | V8_EXPORT_PRIVATE void TierDownAllModulesPerIsolate(Isolate* isolate); | 
 | V8_EXPORT_PRIVATE void TierUpAllModulesPerIsolate(Isolate* isolate); | 
 |  | 
 | class AsyncEventDelegate { | 
 |  public: | 
 |   virtual ~AsyncEventDelegate() = default; | 
 |   virtual void AsyncEventOccurred(debug::DebugAsyncActionType type, int id, | 
 |                                   bool is_blackboxed) = 0; | 
 | }; | 
 |  | 
 | void SetAsyncEventDelegate(Isolate* isolate, AsyncEventDelegate* delegate); | 
 |  | 
 | void ResetBlackboxedStateCache(Isolate* isolate, | 
 |                                v8::Local<debug::Script> script); | 
 |  | 
 | int EstimatedValueSize(Isolate* isolate, v8::Local<v8::Value> value); | 
 |  | 
 | enum Builtin { kStringToLowerCase }; | 
 |  | 
 | Local<Function> GetBuiltin(Isolate* isolate, Builtin builtin); | 
 |  | 
 | V8_EXPORT_PRIVATE void SetConsoleDelegate(Isolate* isolate, | 
 |                                           ConsoleDelegate* delegate); | 
 |  | 
 | V8_DEPRECATED("See http://crbug.com/v8/10566.") | 
 | int GetStackFrameId(v8::Local<v8::StackFrame> frame); | 
 |  | 
 | v8::Local<v8::StackTrace> GetDetailedStackTrace(Isolate* isolate, | 
 |                                                 v8::Local<v8::Object> error); | 
 |  | 
 | /** | 
 |  * Native wrapper around v8::internal::JSGeneratorObject object. | 
 |  */ | 
 | class GeneratorObject { | 
 |  public: | 
 |   v8::MaybeLocal<debug::Script> Script(); | 
 |   v8::Local<v8::Function> Function(); | 
 |   debug::Location SuspendedLocation(); | 
 |   bool IsSuspended(); | 
 |  | 
 |   static v8::Local<debug::GeneratorObject> Cast(v8::Local<v8::Value> value); | 
 | }; | 
 |  | 
 | /* | 
 |  * Provide API layer between inspector and code coverage. | 
 |  */ | 
 | class V8_EXPORT_PRIVATE Coverage { | 
 |  public: | 
 |   MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(Coverage); | 
 |  | 
 |   // Forward declarations. | 
 |   class ScriptData; | 
 |   class FunctionData; | 
 |  | 
 |   class V8_EXPORT_PRIVATE BlockData { | 
 |    public: | 
 |     MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(BlockData); | 
 |  | 
 |     int StartOffset() const; | 
 |     int EndOffset() const; | 
 |     uint32_t Count() const; | 
 |  | 
 |    private: | 
 |     explicit BlockData(i::CoverageBlock* block, | 
 |                        std::shared_ptr<i::Coverage> coverage) | 
 |         : block_(block), coverage_(std::move(coverage)) {} | 
 |  | 
 |     i::CoverageBlock* block_; | 
 |     std::shared_ptr<i::Coverage> coverage_; | 
 |  | 
 |     friend class v8::debug::Coverage::FunctionData; | 
 |   }; | 
 |  | 
 |   class V8_EXPORT_PRIVATE FunctionData { | 
 |    public: | 
 |     MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(FunctionData); | 
 |  | 
 |     int StartOffset() const; | 
 |     int EndOffset() const; | 
 |     uint32_t Count() const; | 
 |     MaybeLocal<String> Name() const; | 
 |     size_t BlockCount() const; | 
 |     bool HasBlockCoverage() const; | 
 |     BlockData GetBlockData(size_t i) const; | 
 |  | 
 |    private: | 
 |     explicit FunctionData(i::CoverageFunction* function, | 
 |                           std::shared_ptr<i::Coverage> coverage) | 
 |         : function_(function), coverage_(std::move(coverage)) {} | 
 |  | 
 |     i::CoverageFunction* function_; | 
 |     std::shared_ptr<i::Coverage> coverage_; | 
 |  | 
 |     friend class v8::debug::Coverage::ScriptData; | 
 |   }; | 
 |  | 
 |   class V8_EXPORT_PRIVATE ScriptData { | 
 |    public: | 
 |     MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(ScriptData); | 
 |  | 
 |     Local<debug::Script> GetScript() const; | 
 |     size_t FunctionCount() const; | 
 |     FunctionData GetFunctionData(size_t i) const; | 
 |  | 
 |    private: | 
 |     explicit ScriptData(size_t index, std::shared_ptr<i::Coverage> c); | 
 |  | 
 |     i::CoverageScript* script_; | 
 |     std::shared_ptr<i::Coverage> coverage_; | 
 |  | 
 |     friend class v8::debug::Coverage; | 
 |   }; | 
 |  | 
 |   static Coverage CollectPrecise(Isolate* isolate); | 
 |   static Coverage CollectBestEffort(Isolate* isolate); | 
 |  | 
 |   static void SelectMode(Isolate* isolate, CoverageMode mode); | 
 |  | 
 |   size_t ScriptCount() const; | 
 |   ScriptData GetScriptData(size_t i) const; | 
 |   bool IsEmpty() const { return coverage_ == nullptr; } | 
 |  | 
 |  private: | 
 |   explicit Coverage(std::shared_ptr<i::Coverage> coverage) | 
 |       : coverage_(std::move(coverage)) {} | 
 |   std::shared_ptr<i::Coverage> coverage_; | 
 | }; | 
 |  | 
 | /* | 
 |  * Provide API layer between inspector and type profile. | 
 |  */ | 
 | class V8_EXPORT_PRIVATE TypeProfile { | 
 |  public: | 
 |   MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(TypeProfile); | 
 |  | 
 |   class ScriptData;  // Forward declaration. | 
 |  | 
 |   class V8_EXPORT_PRIVATE Entry { | 
 |    public: | 
 |     MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(Entry); | 
 |  | 
 |     int SourcePosition() const; | 
 |     std::vector<MaybeLocal<String>> Types() const; | 
 |  | 
 |    private: | 
 |     explicit Entry(const i::TypeProfileEntry* entry, | 
 |                    std::shared_ptr<i::TypeProfile> type_profile) | 
 |         : entry_(entry), type_profile_(std::move(type_profile)) {} | 
 |  | 
 |     const i::TypeProfileEntry* entry_; | 
 |     std::shared_ptr<i::TypeProfile> type_profile_; | 
 |  | 
 |     friend class v8::debug::TypeProfile::ScriptData; | 
 |   }; | 
 |  | 
 |   class V8_EXPORT_PRIVATE ScriptData { | 
 |    public: | 
 |     MOVE_ONLY_NO_DEFAULT_CONSTRUCTOR(ScriptData); | 
 |  | 
 |     Local<debug::Script> GetScript() const; | 
 |     std::vector<Entry> Entries() const; | 
 |  | 
 |    private: | 
 |     explicit ScriptData(size_t index, | 
 |                         std::shared_ptr<i::TypeProfile> type_profile); | 
 |  | 
 |     i::TypeProfileScript* script_; | 
 |     std::shared_ptr<i::TypeProfile> type_profile_; | 
 |  | 
 |     friend class v8::debug::TypeProfile; | 
 |   }; | 
 |  | 
 |   static TypeProfile Collect(Isolate* isolate); | 
 |  | 
 |   static void SelectMode(Isolate* isolate, TypeProfileMode mode); | 
 |  | 
 |   size_t ScriptCount() const; | 
 |   ScriptData GetScriptData(size_t i) const; | 
 |  | 
 |  private: | 
 |   explicit TypeProfile(std::shared_ptr<i::TypeProfile> type_profile) | 
 |       : type_profile_(std::move(type_profile)) {} | 
 |  | 
 |   std::shared_ptr<i::TypeProfile> type_profile_; | 
 | }; | 
 |  | 
 | class V8_EXPORT_PRIVATE ScopeIterator { | 
 |  public: | 
 |   static std::unique_ptr<ScopeIterator> CreateForFunction( | 
 |       v8::Isolate* isolate, v8::Local<v8::Function> func); | 
 |   static std::unique_ptr<ScopeIterator> CreateForGeneratorObject( | 
 |       v8::Isolate* isolate, v8::Local<v8::Object> generator); | 
 |  | 
 |   ScopeIterator() = default; | 
 |   virtual ~ScopeIterator() = default; | 
 |  | 
 |   enum ScopeType { | 
 |     ScopeTypeGlobal = 0, | 
 |     ScopeTypeLocal, | 
 |     ScopeTypeWith, | 
 |     ScopeTypeClosure, | 
 |     ScopeTypeCatch, | 
 |     ScopeTypeBlock, | 
 |     ScopeTypeScript, | 
 |     ScopeTypeEval, | 
 |     ScopeTypeModule, | 
 |     ScopeTypeWasmExpressionStack | 
 |   }; | 
 |  | 
 |   virtual bool Done() = 0; | 
 |   virtual void Advance() = 0; | 
 |   virtual ScopeType GetType() = 0; | 
 |   virtual v8::Local<v8::Object> GetObject() = 0; | 
 |   virtual v8::Local<v8::Value> GetFunctionDebugName() = 0; | 
 |   virtual int GetScriptId() = 0; | 
 |   virtual bool HasLocationInfo() = 0; | 
 |   virtual debug::Location GetStartLocation() = 0; | 
 |   virtual debug::Location GetEndLocation() = 0; | 
 |  | 
 |   virtual bool SetVariableValue(v8::Local<v8::String> name, | 
 |                                 v8::Local<v8::Value> value) = 0; | 
 |  | 
 |  private: | 
 |   DISALLOW_COPY_AND_ASSIGN(ScopeIterator); | 
 | }; | 
 |  | 
 | class V8_EXPORT_PRIVATE StackTraceIterator { | 
 |  public: | 
 |   static bool SupportsWasmDebugEvaluate(); | 
 |   static std::unique_ptr<StackTraceIterator> Create(Isolate* isolate, | 
 |                                                     int index = 0); | 
 |   StackTraceIterator() = default; | 
 |   virtual ~StackTraceIterator() = default; | 
 |  | 
 |   virtual bool Done() const = 0; | 
 |   virtual void Advance() = 0; | 
 |  | 
 |   virtual int GetContextId() const = 0; | 
 |   virtual v8::MaybeLocal<v8::Value> GetReceiver() const = 0; | 
 |   virtual v8::Local<v8::Value> GetReturnValue() const = 0; | 
 |   virtual v8::Local<v8::String> GetFunctionDebugName() const = 0; | 
 |   virtual v8::Local<v8::debug::Script> GetScript() const = 0; | 
 |   virtual debug::Location GetSourceLocation() const = 0; | 
 |   virtual v8::Local<v8::Function> GetFunction() const = 0; | 
 |   virtual std::unique_ptr<ScopeIterator> GetScopeIterator() const = 0; | 
 |  | 
 |   virtual bool Restart() = 0; | 
 |   virtual v8::MaybeLocal<v8::Value> Evaluate(v8::Local<v8::String> source, | 
 |                                              bool throw_on_side_effect) = 0; | 
 |   virtual v8::MaybeLocal<v8::String> EvaluateWasm( | 
 |       internal::Vector<const internal::byte> source, int frame_index) = 0; | 
 |  | 
 |  private: | 
 |   DISALLOW_COPY_AND_ASSIGN(StackTraceIterator); | 
 | }; | 
 |  | 
 | class QueryObjectPredicate { | 
 |  public: | 
 |   virtual ~QueryObjectPredicate() = default; | 
 |   virtual bool Filter(v8::Local<v8::Object> object) = 0; | 
 | }; | 
 |  | 
 | void QueryObjects(v8::Local<v8::Context> context, | 
 |                   QueryObjectPredicate* predicate, | 
 |                   v8::PersistentValueVector<v8::Object>* objects); | 
 |  | 
 | void GlobalLexicalScopeNames(v8::Local<v8::Context> context, | 
 |                              v8::PersistentValueVector<v8::String>* names); | 
 |  | 
 | void SetReturnValue(v8::Isolate* isolate, v8::Local<v8::Value> value); | 
 |  | 
 | enum class NativeAccessorType { | 
 |   None = 0, | 
 |   HasGetter = 1 << 0, | 
 |   HasSetter = 1 << 1 | 
 | }; | 
 |  | 
 | int64_t GetNextRandomInt64(v8::Isolate* isolate); | 
 |  | 
 | using RuntimeCallCounterCallback = | 
 |     std::function<void(const char* name, int64_t count, base::TimeDelta time)>; | 
 | void EnumerateRuntimeCallCounters(v8::Isolate* isolate, | 
 |                                   RuntimeCallCounterCallback callback); | 
 |  | 
 | enum class EvaluateGlobalMode { | 
 |   kDefault, | 
 |   kDisableBreaks, | 
 |   kDisableBreaksAndThrowOnSideEffect | 
 | }; | 
 |  | 
 | V8_EXPORT_PRIVATE v8::MaybeLocal<v8::Value> EvaluateGlobal( | 
 |     v8::Isolate* isolate, v8::Local<v8::String> source, EvaluateGlobalMode mode, | 
 |     bool repl_mode = false); | 
 |  | 
 | int GetDebuggingId(v8::Local<v8::Function> function); | 
 |  | 
 | bool SetFunctionBreakpoint(v8::Local<v8::Function> function, | 
 |                            v8::Local<v8::String> condition, BreakpointId* id); | 
 |  | 
 | v8::Platform* GetCurrentPlatform(); | 
 |  | 
 | void ForceGarbageCollection( | 
 |     v8::Isolate* isolate, | 
 |     v8::EmbedderHeapTracer::EmbedderStackState embedder_stack_state); | 
 |  | 
 | class PostponeInterruptsScope { | 
 |  public: | 
 |   explicit PostponeInterruptsScope(v8::Isolate* isolate); | 
 |   ~PostponeInterruptsScope(); | 
 |  | 
 |  private: | 
 |   std::unique_ptr<i::PostponeInterruptsScope> scope_; | 
 | }; | 
 |  | 
 | class DisableBreakScope { | 
 |  public: | 
 |   explicit DisableBreakScope(v8::Isolate* isolate); | 
 |   ~DisableBreakScope(); | 
 |  | 
 |  private: | 
 |   std::unique_ptr<i::DisableBreak> scope_; | 
 | }; | 
 |  | 
 | class WeakMap : public v8::Object { | 
 |  public: | 
 |   WeakMap() = delete; | 
 |   V8_EXPORT_PRIVATE V8_WARN_UNUSED_RESULT v8::MaybeLocal<v8::Value> Get( | 
 |       v8::Local<v8::Context> context, v8::Local<v8::Value> key); | 
 |   V8_EXPORT_PRIVATE V8_WARN_UNUSED_RESULT v8::MaybeLocal<WeakMap> Set( | 
 |       v8::Local<v8::Context> context, v8::Local<v8::Value> key, | 
 |       v8::Local<v8::Value> value); | 
 |  | 
 |   V8_EXPORT_PRIVATE static Local<WeakMap> New(v8::Isolate* isolate); | 
 |   V8_INLINE static WeakMap* Cast(Value* obj); | 
 | }; | 
 |  | 
 | /** | 
 |  * Pairs of accessors. | 
 |  * | 
 |  * In the case of private accessors, getters and setters are either null or | 
 |  * Functions. | 
 |  */ | 
 | class V8_EXPORT_PRIVATE AccessorPair : public v8::Value { | 
 |  public: | 
 |   AccessorPair() = delete; | 
 |   v8::Local<v8::Value> getter(); | 
 |   v8::Local<v8::Value> setter(); | 
 |  | 
 |   static bool IsAccessorPair(v8::Local<v8::Value> obj); | 
 |   V8_INLINE static AccessorPair* Cast(v8::Value* obj); | 
 |  | 
 |  private: | 
 |   static void CheckCast(v8::Value* obj); | 
 | }; | 
 |  | 
 | struct PropertyDescriptor { | 
 |   bool enumerable : 1; | 
 |   bool has_enumerable : 1; | 
 |   bool configurable : 1; | 
 |   bool has_configurable : 1; | 
 |   bool writable : 1; | 
 |   bool has_writable : 1; | 
 |   v8::Local<v8::Value> value; | 
 |   v8::Local<v8::Value> get; | 
 |   v8::Local<v8::Value> set; | 
 | }; | 
 |  | 
 | class PropertyIterator { | 
 |  public: | 
 |   static std::unique_ptr<PropertyIterator> Create(v8::Local<v8::Object> object); | 
 |  | 
 |   virtual ~PropertyIterator() = default; | 
 |  | 
 |   virtual bool Done() const = 0; | 
 |   virtual void Advance() = 0; | 
 |  | 
 |   virtual v8::Local<v8::Name> name() const = 0; | 
 |  | 
 |   virtual bool is_native_accessor() = 0; | 
 |   virtual bool has_native_getter() = 0; | 
 |   virtual bool has_native_setter() = 0; | 
 |   virtual Maybe<PropertyAttribute> attributes() = 0; | 
 |   virtual Maybe<PropertyDescriptor> descriptor() = 0; | 
 |  | 
 |   virtual bool is_own() = 0; | 
 |   virtual bool is_array_index() = 0; | 
 | }; | 
 |  | 
 | // Wrapper around v8::internal::WasmValue. | 
 | class V8_EXPORT_PRIVATE WasmValue : public v8::Value { | 
 |  public: | 
 |   WasmValue() = delete; | 
 |   static bool IsWasmValue(v8::Local<v8::Value> obj); | 
 |   V8_INLINE static WasmValue* Cast(v8::Value* obj); | 
 |   int value_type(); | 
 |   // Get the underlying values as a byte array, this is only valid if value_type | 
 |   // is i32, i64, f32, f64, or s128. | 
 |   v8::Local<v8::Array> bytes(); | 
 |   // Get the underlying externref, only valid if value_type is externref. | 
 |   v8::Local<v8::Value> ref(); | 
 |  | 
 |  private: | 
 |   static void CheckCast(v8::Value* obj); | 
 | }; | 
 |  | 
 | AccessorPair* AccessorPair::Cast(v8::Value* value) { | 
 | #ifdef V8_ENABLE_CHECKS | 
 |   CheckCast(value); | 
 | #endif | 
 |   return static_cast<AccessorPair*>(value); | 
 | } | 
 |  | 
 | WasmValue* WasmValue::Cast(v8::Value* value) { | 
 | #ifdef V8_ENABLE_CHECKS | 
 |   CheckCast(value); | 
 | #endif | 
 |   return static_cast<WasmValue*>(value); | 
 | } | 
 |  | 
 | MaybeLocal<Message> GetMessageFromPromise(Local<Promise> promise); | 
 |  | 
 | }  // namespace debug | 
 | }  // namespace v8 | 
 |  | 
 | #endif  // V8_DEBUG_DEBUG_INTERFACE_H_ |