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