| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_DEOPTIMIZER_H_ | 5 #ifndef V8_DEOPTIMIZER_H_ |
| 6 #define V8_DEOPTIMIZER_H_ | 6 #define V8_DEOPTIMIZER_H_ |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/allocation.h" | 10 #include "src/allocation.h" |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 kArgumentsAdaptor, | 119 kArgumentsAdaptor, |
| 120 kConstructStub, | 120 kConstructStub, |
| 121 kCompiledStub, | 121 kCompiledStub, |
| 122 kInvalid | 122 kInvalid |
| 123 }; | 123 }; |
| 124 | 124 |
| 125 int GetValueCount(); | 125 int GetValueCount(); |
| 126 | 126 |
| 127 Kind kind() const { return kind_; } | 127 Kind kind() const { return kind_; } |
| 128 BailoutId node_id() const { return node_id_; } | 128 BailoutId node_id() const { return node_id_; } |
| 129 JSFunction* raw_function() const { return raw_function_; } | 129 Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } |
| 130 Handle<JSFunction> function() const { return function_; } | |
| 131 int height() const { return height_; } | 130 int height() const { return height_; } |
| 132 | 131 |
| 133 class iterator { | 132 class iterator { |
| 134 public: | 133 public: |
| 135 iterator& operator++() { | 134 iterator& operator++() { |
| 136 AdvanceIterator(&position_); | 135 AdvanceIterator(&position_); |
| 137 return *this; | 136 return *this; |
| 138 } | 137 } |
| 139 | 138 |
| 140 iterator operator++(int) { | 139 iterator operator++(int) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 158 : position_(position) {} | 157 : position_(position) {} |
| 159 | 158 |
| 160 std::deque<TranslatedValue>::iterator position_; | 159 std::deque<TranslatedValue>::iterator position_; |
| 161 }; | 160 }; |
| 162 | 161 |
| 163 typedef TranslatedValue& reference; | 162 typedef TranslatedValue& reference; |
| 164 typedef TranslatedValue const& const_reference; | 163 typedef TranslatedValue const& const_reference; |
| 165 | 164 |
| 166 iterator begin() { return iterator(values_.begin()); } | 165 iterator begin() { return iterator(values_.begin()); } |
| 167 iterator end() { return iterator(values_.end()); } | 166 iterator end() { return iterator(values_.end()); } |
| 167 |
| 168 reference front() { return values_.front(); } | 168 reference front() { return values_.front(); } |
| 169 const_reference front() const { return values_.front(); } | 169 const_reference front() const { return values_.front(); } |
| 170 | 170 |
| 171 private: | 171 private: |
| 172 friend class TranslatedState; | 172 friend class TranslatedState; |
| 173 | 173 |
| 174 // Constructor static methods. | 174 // Constructor static methods. |
| 175 static TranslatedFrame JSFrame(BailoutId node_id, JSFunction* function, | 175 static TranslatedFrame JSFrame(BailoutId node_id, |
| 176 int height); | 176 SharedFunctionInfo* shared_info, int height); |
| 177 static TranslatedFrame AccessorFrame(Kind kind, JSFunction* function); | 177 static TranslatedFrame AccessorFrame(Kind kind, |
| 178 static TranslatedFrame ArgumentsAdaptorFrame(JSFunction* function, | 178 SharedFunctionInfo* shared_info); |
| 179 static TranslatedFrame ArgumentsAdaptorFrame(SharedFunctionInfo* shared_info, |
| 179 int height); | 180 int height); |
| 180 static TranslatedFrame ConstructStubFrame(JSFunction* function, int height); | 181 static TranslatedFrame ConstructStubFrame(SharedFunctionInfo* shared_info, |
| 182 int height); |
| 181 static TranslatedFrame CompiledStubFrame(int height, Isolate* isolate) { | 183 static TranslatedFrame CompiledStubFrame(int height, Isolate* isolate) { |
| 182 return TranslatedFrame(kCompiledStub, isolate, nullptr, height); | 184 return TranslatedFrame(kCompiledStub, isolate, nullptr, height); |
| 183 } | 185 } |
| 184 static TranslatedFrame InvalidFrame() { | 186 static TranslatedFrame InvalidFrame() { |
| 185 return TranslatedFrame(kInvalid, nullptr); | 187 return TranslatedFrame(kInvalid, nullptr); |
| 186 } | 188 } |
| 187 | 189 |
| 188 static void AdvanceIterator(std::deque<TranslatedValue>::iterator* iter); | 190 static void AdvanceIterator(std::deque<TranslatedValue>::iterator* iter); |
| 189 | 191 |
| 190 TranslatedFrame(Kind kind, Isolate* isolate, JSFunction* function = nullptr, | 192 TranslatedFrame(Kind kind, Isolate* isolate, |
| 191 int height = 0) | 193 SharedFunctionInfo* shared_info = nullptr, int height = 0) |
| 192 : kind_(kind), | 194 : kind_(kind), |
| 193 node_id_(BailoutId::None()), | 195 node_id_(BailoutId::None()), |
| 194 raw_function_(function), | 196 raw_shared_info_(shared_info), |
| 195 height_(height), | 197 height_(height), |
| 196 isolate_(isolate) {} | 198 isolate_(isolate) {} |
| 197 | 199 |
| 198 | 200 |
| 199 void Add(const TranslatedValue& value) { values_.push_back(value); } | 201 void Add(const TranslatedValue& value) { values_.push_back(value); } |
| 200 void Handlify(Isolate* isolate); | 202 void Handlify(); |
| 201 | 203 |
| 202 Kind kind_; | 204 Kind kind_; |
| 203 BailoutId node_id_; | 205 BailoutId node_id_; |
| 204 JSFunction* raw_function_; | 206 SharedFunctionInfo* raw_shared_info_; |
| 205 Handle<JSFunction> function_; | 207 Handle<SharedFunctionInfo> shared_info_; |
| 206 int height_; | 208 int height_; |
| 207 Isolate* isolate_; | 209 Isolate* isolate_; |
| 208 | 210 |
| 209 typedef std::deque<TranslatedValue> ValuesContainer; | 211 typedef std::deque<TranslatedValue> ValuesContainer; |
| 210 | 212 |
| 211 ValuesContainer values_; | 213 ValuesContainer values_; |
| 212 }; | 214 }; |
| 213 | 215 |
| 214 | 216 |
| 215 // Auxiliary class for translating deoptimization values. | 217 // Auxiliary class for translating deoptimization values. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 230 class TranslatedState { | 232 class TranslatedState { |
| 231 public: | 233 public: |
| 232 TranslatedState(); | 234 TranslatedState(); |
| 233 explicit TranslatedState(JavaScriptFrame* frame); | 235 explicit TranslatedState(JavaScriptFrame* frame); |
| 234 | 236 |
| 235 void Prepare(bool has_adapted_arguments, Address stack_frame_pointer); | 237 void Prepare(bool has_adapted_arguments, Address stack_frame_pointer); |
| 236 | 238 |
| 237 // Store newly materialized values into the isolate. | 239 // Store newly materialized values into the isolate. |
| 238 void StoreMaterializedValuesAndDeopt(); | 240 void StoreMaterializedValuesAndDeopt(); |
| 239 | 241 |
| 242 typedef std::vector<TranslatedFrame>::iterator iterator; |
| 243 iterator begin() { return frames_.begin(); } |
| 244 iterator end() { return frames_.end(); } |
| 245 |
| 240 typedef std::vector<TranslatedFrame>::const_iterator const_iterator; | 246 typedef std::vector<TranslatedFrame>::const_iterator const_iterator; |
| 241 const_iterator begin() const { return frames_.begin(); } | 247 const_iterator begin() const { return frames_.begin(); } |
| 242 const_iterator end() const { return frames_.end(); } | 248 const_iterator end() const { return frames_.end(); } |
| 243 | 249 |
| 244 std::vector<TranslatedFrame>& frames() { return frames_; } | 250 std::vector<TranslatedFrame>& frames() { return frames_; } |
| 245 | 251 |
| 246 TranslatedFrame* GetArgumentsInfoFromJSFrameIndex(int jsframe_index, | 252 TranslatedFrame* GetArgumentsInfoFromJSFrameIndex(int jsframe_index, |
| 247 int* arguments_count); | 253 int* arguments_count); |
| 248 | 254 |
| 249 Isolate* isolate() { return isolate_; } | 255 Isolate* isolate() { return isolate_; } |
| (...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1008 V(REGISTER) \ | 1014 V(REGISTER) \ |
| 1009 V(INT32_REGISTER) \ | 1015 V(INT32_REGISTER) \ |
| 1010 V(UINT32_REGISTER) \ | 1016 V(UINT32_REGISTER) \ |
| 1011 V(BOOL_REGISTER) \ | 1017 V(BOOL_REGISTER) \ |
| 1012 V(DOUBLE_REGISTER) \ | 1018 V(DOUBLE_REGISTER) \ |
| 1013 V(STACK_SLOT) \ | 1019 V(STACK_SLOT) \ |
| 1014 V(INT32_STACK_SLOT) \ | 1020 V(INT32_STACK_SLOT) \ |
| 1015 V(UINT32_STACK_SLOT) \ | 1021 V(UINT32_STACK_SLOT) \ |
| 1016 V(BOOL_STACK_SLOT) \ | 1022 V(BOOL_STACK_SLOT) \ |
| 1017 V(DOUBLE_STACK_SLOT) \ | 1023 V(DOUBLE_STACK_SLOT) \ |
| 1018 V(LITERAL) | 1024 V(LITERAL) \ |
| 1025 V(JS_FRAME_FUNCTION) |
| 1019 | 1026 |
| 1020 | 1027 |
| 1021 class Translation BASE_EMBEDDED { | 1028 class Translation BASE_EMBEDDED { |
| 1022 public: | 1029 public: |
| 1023 #define DECLARE_TRANSLATION_OPCODE_ENUM(item) item, | 1030 #define DECLARE_TRANSLATION_OPCODE_ENUM(item) item, |
| 1024 enum Opcode { | 1031 enum Opcode { |
| 1025 TRANSLATION_OPCODE_LIST(DECLARE_TRANSLATION_OPCODE_ENUM) | 1032 TRANSLATION_OPCODE_LIST(DECLARE_TRANSLATION_OPCODE_ENUM) |
| 1026 LAST = LITERAL | 1033 LAST = LITERAL |
| 1027 }; | 1034 }; |
| 1028 #undef DECLARE_TRANSLATION_OPCODE_ENUM | 1035 #undef DECLARE_TRANSLATION_OPCODE_ENUM |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1054 void StoreUint32Register(Register reg); | 1061 void StoreUint32Register(Register reg); |
| 1055 void StoreBoolRegister(Register reg); | 1062 void StoreBoolRegister(Register reg); |
| 1056 void StoreDoubleRegister(DoubleRegister reg); | 1063 void StoreDoubleRegister(DoubleRegister reg); |
| 1057 void StoreStackSlot(int index); | 1064 void StoreStackSlot(int index); |
| 1058 void StoreInt32StackSlot(int index); | 1065 void StoreInt32StackSlot(int index); |
| 1059 void StoreUint32StackSlot(int index); | 1066 void StoreUint32StackSlot(int index); |
| 1060 void StoreBoolStackSlot(int index); | 1067 void StoreBoolStackSlot(int index); |
| 1061 void StoreDoubleStackSlot(int index); | 1068 void StoreDoubleStackSlot(int index); |
| 1062 void StoreLiteral(int literal_id); | 1069 void StoreLiteral(int literal_id); |
| 1063 void StoreArgumentsObject(bool args_known, int args_index, int args_length); | 1070 void StoreArgumentsObject(bool args_known, int args_index, int args_length); |
| 1071 void StoreJSFrameFunction(); |
| 1064 | 1072 |
| 1065 Zone* zone() const { return zone_; } | 1073 Zone* zone() const { return zone_; } |
| 1066 | 1074 |
| 1067 static int NumberOfOperandsFor(Opcode opcode); | 1075 static int NumberOfOperandsFor(Opcode opcode); |
| 1068 | 1076 |
| 1069 #if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) | 1077 #if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) |
| 1070 static const char* StringFor(Opcode opcode); | 1078 static const char* StringFor(Opcode opcode); |
| 1071 #endif | 1079 #endif |
| 1072 | 1080 |
| 1073 // A literal id which refers to the JSFunction itself. | |
| 1074 static const int kSelfLiteralId = -239; | |
| 1075 | |
| 1076 private: | 1081 private: |
| 1077 TranslationBuffer* buffer_; | 1082 TranslationBuffer* buffer_; |
| 1078 int index_; | 1083 int index_; |
| 1079 Zone* zone_; | 1084 Zone* zone_; |
| 1080 }; | 1085 }; |
| 1081 | 1086 |
| 1082 | 1087 |
| 1083 class MaterializedObjectStore { | 1088 class MaterializedObjectStore { |
| 1084 public: | 1089 public: |
| 1085 explicit MaterializedObjectStore(Isolate* isolate) : isolate_(isolate) { | 1090 explicit MaterializedObjectStore(Isolate* isolate) : isolate_(isolate) { |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1176 Object** expression_stack_; | 1181 Object** expression_stack_; |
| 1177 int source_position_; | 1182 int source_position_; |
| 1178 | 1183 |
| 1179 friend class Deoptimizer; | 1184 friend class Deoptimizer; |
| 1180 }; | 1185 }; |
| 1181 | 1186 |
| 1182 } // namespace internal | 1187 } // namespace internal |
| 1183 } // namespace v8 | 1188 } // namespace v8 |
| 1184 | 1189 |
| 1185 #endif // V8_DEOPTIMIZER_H_ | 1190 #endif // V8_DEOPTIMIZER_H_ |
| OLD | NEW |