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 12 namespace v8 { 13 namespace 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. 21 class DeoptimizedFrameInfo : public Malloced { 22 public: 23 DeoptimizedFrameInfo(TranslatedState* state, 24 TranslatedState::iterator frame_it, Isolate* isolate); 25 26 // Get the frame context. GetContext()27 Handle<Object> GetContext() { return context_; } 28 29 // Get an incoming argument. GetParameter(int index)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. GetExpression(int index)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. parameters_count()43 int parameters_count() { return static_cast<int>(parameters_.size()); } 44 45 // Return the height of the expression stack. expression_count()46 int expression_count() { return static_cast<int>(expression_stack_.size()); } 47 48 // Set an incoming argument. SetParameter(int index,Handle<Object> obj)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. SetExpression(int index,Handle<Object> obj)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