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