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 19 class 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 30 struct 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 43 class 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 67 class 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