Chromium Code Reviews| 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_FRAMES_H_ | 5 #ifndef V8_FRAMES_H_ |
| 6 #define V8_FRAMES_H_ | 6 #define V8_FRAMES_H_ |
| 7 | 7 |
| 8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
| 9 #include "src/handles.h" | 9 #include "src/handles.h" |
| 10 #include "src/safepoint-table.h" | 10 #include "src/safepoint-table.h" |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 104 V(JAVA_SCRIPT, JavaScriptFrame) \ | 104 V(JAVA_SCRIPT, JavaScriptFrame) \ |
| 105 V(OPTIMIZED, OptimizedFrame) \ | 105 V(OPTIMIZED, OptimizedFrame) \ |
| 106 V(WASM, WasmFrame) \ | 106 V(WASM, WasmFrame) \ |
| 107 V(WASM_TO_JS, WasmToJsFrame) \ | 107 V(WASM_TO_JS, WasmToJsFrame) \ |
| 108 V(JS_TO_WASM, JsToWasmFrame) \ | 108 V(JS_TO_WASM, JsToWasmFrame) \ |
| 109 V(INTERPRETED, InterpretedFrame) \ | 109 V(INTERPRETED, InterpretedFrame) \ |
| 110 V(STUB, StubFrame) \ | 110 V(STUB, StubFrame) \ |
| 111 V(STUB_FAILURE_TRAMPOLINE, StubFailureTrampolineFrame) \ | 111 V(STUB_FAILURE_TRAMPOLINE, StubFailureTrampolineFrame) \ |
| 112 V(INTERNAL, InternalFrame) \ | 112 V(INTERNAL, InternalFrame) \ |
| 113 V(CONSTRUCT, ConstructFrame) \ | 113 V(CONSTRUCT, ConstructFrame) \ |
| 114 V(ARGUMENTS_ADAPTOR, ArgumentsAdaptorFrame) | 114 V(ARGUMENTS_ADAPTOR, ArgumentsAdaptorFrame) \ |
| 115 V(BUILTIN, BuiltinFrame) | |
| 115 | 116 |
| 116 // Every pointer in a frame has a slot id. On 32-bit platforms, doubles consume | 117 // Every pointer in a frame has a slot id. On 32-bit platforms, doubles consume |
| 117 // two slots. | 118 // two slots. |
| 118 // | 119 // |
| 119 // Stack slot indices >= 0 access the callee stack with slot 0 corresponding to | 120 // Stack slot indices >= 0 access the callee stack with slot 0 corresponding to |
| 120 // the callee's saved return address and 1 corresponding to the saved frame | 121 // the callee's saved return address and 1 corresponding to the saved frame |
| 121 // pointer. Some frames have additional information stored in the fixed header, | 122 // pointer. Some frames have additional information stored in the fixed header, |
| 122 // for example JSFunctions store the function context and marker in the fixed | 123 // for example JSFunctions store the function context and marker in the fixed |
| 123 // header, with slot index 2 corresponding to the current function context and 3 | 124 // header, with slot index 2 corresponding to the current function context and 3 |
| 124 // corresponding to the frame marker/JSFunction. | 125 // corresponding to the frame marker/JSFunction. |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 273 static const int kFixedSlotCountFromFp = kFixedFrameSizeFromFp / kPointerSize | 274 static const int kFixedSlotCountFromFp = kFixedFrameSizeFromFp / kPointerSize |
| 274 | 275 |
| 275 class ArgumentsAdaptorFrameConstants : public TypedFrameConstants { | 276 class ArgumentsAdaptorFrameConstants : public TypedFrameConstants { |
| 276 public: | 277 public: |
| 277 // FP-relative. | 278 // FP-relative. |
| 278 static const int kFunctionOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0); | 279 static const int kFunctionOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0); |
| 279 static const int kLengthOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(1); | 280 static const int kLengthOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(1); |
| 280 DEFINE_TYPED_FRAME_SIZES(2); | 281 DEFINE_TYPED_FRAME_SIZES(2); |
| 281 }; | 282 }; |
| 282 | 283 |
| 284 class BuiltinFrameConstants : public TypedFrameConstants { | |
| 285 public: | |
| 286 // FP-relative. | |
| 287 static const int kFunctionOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0); | |
| 288 static const int kLengthOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(1); | |
| 289 DEFINE_TYPED_FRAME_SIZES(2); | |
| 290 }; | |
| 291 | |
| 283 class InternalFrameConstants : public TypedFrameConstants { | 292 class InternalFrameConstants : public TypedFrameConstants { |
| 284 public: | 293 public: |
| 285 // FP-relative. | 294 // FP-relative. |
| 286 static const int kCodeOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0); | 295 static const int kCodeOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0); |
| 287 DEFINE_TYPED_FRAME_SIZES(1); | 296 DEFINE_TYPED_FRAME_SIZES(1); |
| 288 }; | 297 }; |
| 289 | 298 |
| 290 class FrameDropperFrameConstants : public InternalFrameConstants { | 299 class FrameDropperFrameConstants : public InternalFrameConstants { |
| 291 public: | 300 public: |
| 292 // FP-relative. | 301 // FP-relative. |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 402 // Type testers. | 411 // Type testers. |
| 403 bool is_entry() const { return type() == ENTRY; } | 412 bool is_entry() const { return type() == ENTRY; } |
| 404 bool is_entry_construct() const { return type() == ENTRY_CONSTRUCT; } | 413 bool is_entry_construct() const { return type() == ENTRY_CONSTRUCT; } |
| 405 bool is_exit() const { return type() == EXIT; } | 414 bool is_exit() const { return type() == EXIT; } |
| 406 bool is_optimized() const { return type() == OPTIMIZED; } | 415 bool is_optimized() const { return type() == OPTIMIZED; } |
| 407 bool is_interpreted() const { return type() == INTERPRETED; } | 416 bool is_interpreted() const { return type() == INTERPRETED; } |
| 408 bool is_wasm() const { return type() == WASM; } | 417 bool is_wasm() const { return type() == WASM; } |
| 409 bool is_wasm_to_js() const { return type() == WASM_TO_JS; } | 418 bool is_wasm_to_js() const { return type() == WASM_TO_JS; } |
| 410 bool is_js_to_wasm() const { return type() == JS_TO_WASM; } | 419 bool is_js_to_wasm() const { return type() == JS_TO_WASM; } |
| 411 bool is_arguments_adaptor() const { return type() == ARGUMENTS_ADAPTOR; } | 420 bool is_arguments_adaptor() const { return type() == ARGUMENTS_ADAPTOR; } |
| 421 bool is_builtin() const { return type() == BUILTIN; } | |
| 412 bool is_internal() const { return type() == INTERNAL; } | 422 bool is_internal() const { return type() == INTERNAL; } |
| 413 bool is_stub_failure_trampoline() const { | 423 bool is_stub_failure_trampoline() const { |
| 414 return type() == STUB_FAILURE_TRAMPOLINE; | 424 return type() == STUB_FAILURE_TRAMPOLINE; |
| 415 } | 425 } |
| 416 bool is_construct() const { return type() == CONSTRUCT; } | 426 bool is_construct() const { return type() == CONSTRUCT; } |
| 417 virtual bool is_standard() const { return false; } | 427 virtual bool is_standard() const { return false; } |
| 418 | 428 |
| 419 bool is_java_script() const { | 429 bool is_java_script() const { |
| 420 Type type = this->type(); | 430 Type type = this->type(); |
| 421 return (type == JAVA_SCRIPT) || (type == OPTIMIZED) || | 431 return (type == JAVA_SCRIPT) || (type == OPTIMIZED) || |
| 422 (type == INTERPRETED); | 432 (type == INTERPRETED) || (type == BUILTIN); |
| 423 } | 433 } |
| 424 | 434 |
| 425 // Accessors. | 435 // Accessors. |
| 426 Address sp() const { return state_.sp; } | 436 Address sp() const { return state_.sp; } |
| 427 Address fp() const { return state_.fp; } | 437 Address fp() const { return state_.fp; } |
| 428 Address caller_sp() const { return GetCallerStackPointer(); } | 438 Address caller_sp() const { return GetCallerStackPointer(); } |
| 429 | 439 |
| 430 // If this frame is optimized and was dynamically aligned return its old | 440 // If this frame is optimized and was dynamically aligned return its old |
| 431 // unaligned frame pointer. When the frame is deoptimized its FP will shift | 441 // unaligned frame pointer. When the frame is deoptimized its FP will shift |
| 432 // up one word and become unaligned. | 442 // up one word and become unaligned. |
| (...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 933 void Print(StringStream* accumulator, PrintMode mode, | 943 void Print(StringStream* accumulator, PrintMode mode, |
| 934 int index) const override; | 944 int index) const override; |
| 935 | 945 |
| 936 static int GetLength(Address fp); | 946 static int GetLength(Address fp); |
| 937 | 947 |
| 938 protected: | 948 protected: |
| 939 inline explicit ArgumentsAdaptorFrame(StackFrameIteratorBase* iterator); | 949 inline explicit ArgumentsAdaptorFrame(StackFrameIteratorBase* iterator); |
| 940 | 950 |
| 941 int GetNumberOfIncomingArguments() const override; | 951 int GetNumberOfIncomingArguments() const override; |
| 942 | 952 |
| 943 Address GetCallerStackPointer() const override; | 953 private: |
| 954 friend class StackFrameIteratorBase; | |
| 955 }; | |
| 956 | |
| 957 // Builtin frames are built for builtins with JavaScript linkage, like | |
|
Jarin
2016/04/20 11:47:57
Nit: like -> such as
| |
| 958 // various standard library functions (i.e. Math.asin, Math.floor, etc.). | |
| 959 class BuiltinFrame final : public JavaScriptFrame { | |
| 960 public: | |
| 961 Type type() const final { return BUILTIN; } | |
| 962 | |
| 963 static BuiltinFrame* cast(StackFrame* frame) { | |
| 964 DCHECK(frame->is_builtin()); | |
| 965 return static_cast<BuiltinFrame*>(frame); | |
| 966 } | |
| 967 | |
| 968 // Printing support. | |
| 969 void Print(StringStream* accumulator, PrintMode mode, int index) const final; | |
| 970 | |
| 971 protected: | |
| 972 inline explicit BuiltinFrame(StackFrameIteratorBase* iterator); | |
| 973 | |
| 974 int GetNumberOfIncomingArguments() const final; | |
| 944 | 975 |
| 945 private: | 976 private: |
| 946 friend class StackFrameIteratorBase; | 977 friend class StackFrameIteratorBase; |
| 947 }; | 978 }; |
| 948 | 979 |
| 949 class WasmFrame : public StandardFrame { | 980 class WasmFrame : public StandardFrame { |
| 950 public: | 981 public: |
| 951 Type type() const override { return WASM; } | 982 Type type() const override { return WASM; } |
| 952 | 983 |
| 953 // GC support. | 984 // GC support. |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1211 | 1242 |
| 1212 | 1243 |
| 1213 // Reads all frames on the current stack and copies them into the current | 1244 // Reads all frames on the current stack and copies them into the current |
| 1214 // zone memory. | 1245 // zone memory. |
| 1215 Vector<StackFrame*> CreateStackMap(Isolate* isolate, Zone* zone); | 1246 Vector<StackFrame*> CreateStackMap(Isolate* isolate, Zone* zone); |
| 1216 | 1247 |
| 1217 } // namespace internal | 1248 } // namespace internal |
| 1218 } // namespace v8 | 1249 } // namespace v8 |
| 1219 | 1250 |
| 1220 #endif // V8_FRAMES_H_ | 1251 #endif // V8_FRAMES_H_ |
| OLD | NEW |