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_DEOPTIMIZER_DEOPTIMIZED_FRAME_INFO_H_
6#define V8_DEOPTIMIZER_DEOPTIMIZED_FRAME_INFO_H_
7
8#include <vector>
9
10#include "src/deoptimizer/translated-state.h"
11
12namespace v8 {
13namespace internal {
14
15// Class used to represent an unoptimized frame when the debugger
16// needs to inspect a frame that is part of an optimized frame. The
17// internally used FrameDescription objects are not GC safe so for use
18// by the debugger frame information is copied to an object of this type.
19// Represents parameters in unadapted form so their number might mismatch
20// formal parameter count.
21class DeoptimizedFrameInfo : public Malloced {
22 public:
23  DeoptimizedFrameInfo(TranslatedState* state,
24                       TranslatedState::iterator frame_it, Isolate* isolate);
25
26  // Get the frame context.
27  Handle<Object> GetContext() { return context_; }
28
29  // Get an incoming argument.
30  Handle<Object> GetParameter(int index) {
31    DCHECK(0 <= index && index < parameters_count());
32    return parameters_[index];
33  }
34
35  // Get an expression from the expression stack.
36  Handle<Object> GetExpression(int index) {
37    DCHECK(0 <= index && index < expression_count());
38    return expression_stack_[index];
39  }
40
41 private:
42  // Return the number of incoming arguments.
43  int parameters_count() { return static_cast<int>(parameters_.size()); }
44
45  // Return the height of the expression stack.
46  int expression_count() { return static_cast<int>(expression_stack_.size()); }
47
48  // Set an incoming argument.
49  void SetParameter(int index, Handle<Object> obj) {
50    DCHECK(0 <= index && index < parameters_count());
51    parameters_[index] = obj;
52  }
53
54  // Set an expression on the expression stack.
55  void SetExpression(int index, Handle<Object> obj) {
56    DCHECK(0 <= index && index < expression_count());
57    expression_stack_[index] = obj;
58  }
59
60  Handle<Object> context_;
61  std::vector<Handle<Object>> parameters_;
62  std::vector<Handle<Object>> expression_stack_;
63
64  friend class Deoptimizer;
65};
66
67}  // namespace internal
68}  // namespace v8
69
70#endif  // V8_DEOPTIMIZER_DEOPTIMIZED_FRAME_INFO_H_
71