1// Copyright 2021 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef V8_TOOLS_V8WINDBG_SRC_JS_STACK_H_ 6#define V8_TOOLS_V8WINDBG_SRC_JS_STACK_H_ 7 8#include <crtdbg.h> 9#include <wrl/implements.h> 10 11#include <string> 12#include <vector> 13 14#include "src/base/optional.h" 15#include "tools/v8windbg/base/utilities.h" 16#include "tools/v8windbg/src/v8-debug-helper-interop.h" 17#include "tools/v8windbg/src/v8windbg-extension.h" 18 19class JSStackAlias 20 : public WRL::RuntimeClass< 21 WRL::RuntimeClassFlags<WRL::RuntimeClassType::ClassicCom>, 22 IModelMethod> { 23 public: 24 IFACEMETHOD(Call) 25 (IModelObject* p_context_object, ULONG64 arg_count, 26 _In_reads_(arg_count) IModelObject** pp_arguments, IModelObject** pp_result, 27 IKeyStore** pp_metadata); 28}; 29 30struct FrameData { 31 FrameData(); 32 ~FrameData(); 33 FrameData(const FrameData&); 34 FrameData(FrameData&&); 35 FrameData& operator=(const FrameData&); 36 FrameData& operator=(FrameData&&); 37 WRL::ComPtr<IModelObject> script_name; 38 WRL::ComPtr<IModelObject> script_source; 39 WRL::ComPtr<IModelObject> function_name; 40 WRL::ComPtr<IModelObject> function_character_offset; 41}; 42 43class StackFrameIterator 44 : public WRL::RuntimeClass< 45 WRL::RuntimeClassFlags<WRL::RuntimeClassType::ClassicCom>, 46 IModelIterator> { 47 public: 48 StackFrameIterator(WRL::ComPtr<IDebugHostContext>& host_context); 49 ~StackFrameIterator() override; 50 51 HRESULT PopulateFrameData(); 52 53 IFACEMETHOD(Reset)(); 54 55 IFACEMETHOD(GetNext) 56 (IModelObject** object, ULONG64 dimensions, IModelObject** indexers, 57 IKeyStore** metadata); 58 59 HRESULT GetAt(uint64_t index, IModelObject** result) const; 60 61 private: 62 ULONG position_ = 0; 63 std::vector<FrameData> frames_; 64 WRL::ComPtr<IDebugHostContext> sp_ctx_; 65}; 66 67class StackFrames 68 : public WRL::RuntimeClass< 69 WRL::RuntimeClassFlags<WRL::RuntimeClassType::ClassicCom>, 70 IIndexableConcept, IIterableConcept> { 71 public: 72 StackFrames(); 73 ~StackFrames() override; 74 75 // IIndexableConcept members 76 IFACEMETHOD(GetDimensionality) 77 (IModelObject* context_object, ULONG64* dimensionality); 78 79 IFACEMETHOD(GetAt) 80 (IModelObject* context_object, ULONG64 indexer_count, IModelObject** indexers, 81 IModelObject** object, IKeyStore** metadata); 82 83 IFACEMETHOD(SetAt) 84 (IModelObject* context_object, ULONG64 indexer_count, IModelObject** indexers, 85 IModelObject* value); 86 87 // IIterableConcept 88 IFACEMETHOD(GetDefaultIndexDimensionality) 89 (IModelObject* context_object, ULONG64* dimensionality); 90 91 IFACEMETHOD(GetIterator) 92 (IModelObject* context_object, IModelIterator** iterator); 93 94 private: 95 WRL::ComPtr<StackFrameIterator> opt_frames_; 96}; 97 98#endif // V8_TOOLS_V8WINDBG_SRC_JS_STACK_H_ 99