| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_STACK_FRAME_H_ | 5 #ifndef VM_STACK_FRAME_H_ |
| 6 #define VM_STACK_FRAME_H_ | 6 #define VM_STACK_FRAME_H_ |
| 7 | 7 |
| 8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
| 9 #include "vm/object.h" | 9 #include "vm/object.h" |
| 10 #include "vm/stub_code.h" | 10 #include "vm/stub_code.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 | 30 |
| 31 // Generic stack frame. | 31 // Generic stack frame. |
| 32 class StackFrame : public ValueObject { | 32 class StackFrame : public ValueObject { |
| 33 public: | 33 public: |
| 34 virtual ~StackFrame() { } | 34 virtual ~StackFrame() { } |
| 35 | 35 |
| 36 // Accessors to get the pc, sp and fp of a frame. | 36 // Accessors to get the pc, sp and fp of a frame. |
| 37 uword sp() const { return sp_; } | 37 uword sp() const { return sp_; } |
| 38 uword fp() const { return fp_; } | 38 uword fp() const { return fp_; } |
| 39 uword pc() const { | 39 uword pc() const { |
| 40 return *reinterpret_cast<uword*>(sp_ + PcAddressOffsetFromSp()); | 40 return *reinterpret_cast<uword*>(sp_ + (kSavedPcSlotFromSp * kWordSize)); |
| 41 } | 41 } |
| 42 | 42 |
| 43 void set_pc(uword value) { | 43 void set_pc(uword value) { |
| 44 *reinterpret_cast<uword*>(sp_ + PcAddressOffsetFromSp()) = value; | 44 *reinterpret_cast<uword*>(sp_ + (kSavedPcSlotFromSp * kWordSize)) = value; |
| 45 } | |
| 46 | |
| 47 void SetEntrypointMarker(uword value) { | |
| 48 ASSERT(!(IsStubFrame() || IsEntryFrame() || IsExitFrame())); | |
| 49 *reinterpret_cast<uword*>(fp_ + EntrypointMarkerOffsetFromFp()) = value; | |
| 50 } | 45 } |
| 51 | 46 |
| 52 // Visit objects in the frame. | 47 // Visit objects in the frame. |
| 53 virtual void VisitObjectPointers(ObjectPointerVisitor* visitor); | 48 virtual void VisitObjectPointers(ObjectPointerVisitor* visitor); |
| 54 | 49 |
| 55 // Print a frame. | 50 // Print a frame. |
| 56 virtual void Print() const; | 51 virtual void Print() const; |
| 57 | 52 |
| 58 // Check validity of a frame, used for assertion purposes. | 53 // Check validity of a frame, used for assertion purposes. |
| 59 virtual bool IsValid() const; | 54 virtual bool IsValid() const; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 76 | 71 |
| 77 protected: | 72 protected: |
| 78 StackFrame() : fp_(0), sp_(0) { } | 73 StackFrame() : fp_(0), sp_(0) { } |
| 79 | 74 |
| 80 // Name of the frame, used for generic frame printing functionality. | 75 // Name of the frame, used for generic frame printing functionality. |
| 81 virtual const char* GetName() const { return IsStubFrame()? "stub" : "dart"; } | 76 virtual const char* GetName() const { return IsStubFrame()? "stub" : "dart"; } |
| 82 | 77 |
| 83 private: | 78 private: |
| 84 RawCode* GetCodeObject() const; | 79 RawCode* GetCodeObject() const; |
| 85 | 80 |
| 86 // Target specific implementations for locating pc and caller fp/sp values. | 81 uword GetCallerSp() const { |
| 87 static intptr_t PcAddressOffsetFromSp(); | 82 return fp() + (kCallerSpSlotFromFp * kWordSize); |
| 88 static intptr_t EntrypointMarkerOffsetFromFp(); | 83 } |
| 89 uword GetCallerSp() const; | 84 uword GetCallerFp() const { |
| 90 uword GetCallerFp() const; | 85 return *(reinterpret_cast<uword*>( |
| 86 fp() + (kSavedCallerFpSlotFromFp * kWordSize))); |
| 87 } |
| 91 | 88 |
| 92 uword fp_; | 89 uword fp_; |
| 93 uword sp_; | 90 uword sp_; |
| 94 | 91 |
| 95 // The iterators FrameSetIterator and StackFrameIterator set the private | 92 // The iterators FrameSetIterator and StackFrameIterator set the private |
| 96 // fields fp_ and sp_ when they return the respective frame objects. | 93 // fields fp_ and sp_ when they return the respective frame objects. |
| 97 friend class FrameSetIterator; | 94 friend class FrameSetIterator; |
| 98 friend class StackFrameIterator; | 95 friend class StackFrameIterator; |
| 99 DISALLOW_COPY_AND_ASSIGN(StackFrame); | 96 DISALLOW_COPY_AND_ASSIGN(StackFrame); |
| 100 }; | 97 }; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 RawContext* SavedContext() const; | 132 RawContext* SavedContext() const; |
| 136 | 133 |
| 137 // Visit objects in the frame. | 134 // Visit objects in the frame. |
| 138 virtual void VisitObjectPointers(ObjectPointerVisitor* visitor); | 135 virtual void VisitObjectPointers(ObjectPointerVisitor* visitor); |
| 139 | 136 |
| 140 protected: | 137 protected: |
| 141 virtual const char* GetName() const { return "entry"; } | 138 virtual const char* GetName() const { return "entry"; } |
| 142 | 139 |
| 143 private: | 140 private: |
| 144 EntryFrame() { } | 141 EntryFrame() { } |
| 145 intptr_t ExitLinkOffset() const; | |
| 146 intptr_t SavedContextOffset() const; | |
| 147 | 142 |
| 148 friend class StackFrameIterator; | 143 friend class StackFrameIterator; |
| 149 DISALLOW_COPY_AND_ASSIGN(EntryFrame); | 144 DISALLOW_COPY_AND_ASSIGN(EntryFrame); |
| 150 }; | 145 }; |
| 151 | 146 |
| 152 | 147 |
| 153 // Iterator for iterating over all frames from the last ExitFrame to the | 148 // Iterator for iterating over all frames from the last ExitFrame to the |
| 154 // first EntryFrame. | 149 // first EntryFrame. |
| 155 class StackFrameIterator : public ValueObject { | 150 class StackFrameIterator : public ValueObject { |
| 156 public: | 151 public: |
| (...skipping 12 matching lines...) Expand all Loading... |
| 169 private: | 164 private: |
| 170 // Iterator for iterating over the set of frames (dart or stub) which exist | 165 // Iterator for iterating over the set of frames (dart or stub) which exist |
| 171 // in one EntryFrame and ExitFrame block. | 166 // in one EntryFrame and ExitFrame block. |
| 172 class FrameSetIterator : public ValueObject { | 167 class FrameSetIterator : public ValueObject { |
| 173 public: | 168 public: |
| 174 // Checks if a next non entry/exit frame exists in the set. | 169 // Checks if a next non entry/exit frame exists in the set. |
| 175 bool HasNext() const { | 170 bool HasNext() const { |
| 176 if (fp_ == 0) { | 171 if (fp_ == 0) { |
| 177 return false; | 172 return false; |
| 178 } | 173 } |
| 179 intptr_t offset = StackFrame::PcAddressOffsetFromSp(); | 174 const uword pc = *(reinterpret_cast<uword*>( |
| 180 uword pc = *(reinterpret_cast<uword*>(sp_ + offset)); | 175 sp_ + (kSavedPcSlotFromSp * kWordSize))); |
| 181 return !StubCode::InInvocationStub(pc); | 176 return !StubCode::InInvocationStub(pc); |
| 182 } | 177 } |
| 183 | 178 |
| 184 // Get next non entry/exit frame in the set (assumes a next frame exists). | 179 // Get next non entry/exit frame in the set (assumes a next frame exists). |
| 185 StackFrame* NextFrame(bool validate); | 180 StackFrame* NextFrame(bool validate); |
| 186 | 181 |
| 187 private: | 182 private: |
| 188 FrameSetIterator() : fp_(0), sp_(0), stack_frame_() { } | 183 FrameSetIterator() : fp_(0), sp_(0), stack_frame_() { } |
| 189 | 184 |
| 190 uword fp_; | 185 uword fp_; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 GrowableArray<DeoptInstr*> deopt_instructions_; | 273 GrowableArray<DeoptInstr*> deopt_instructions_; |
| 279 Array& object_table_; | 274 Array& object_table_; |
| 280 | 275 |
| 281 DISALLOW_COPY_AND_ASSIGN(InlinedFunctionsIterator); | 276 DISALLOW_COPY_AND_ASSIGN(InlinedFunctionsIterator); |
| 282 }; | 277 }; |
| 283 | 278 |
| 284 } // namespace dart | 279 } // namespace dart |
| 285 | 280 |
| 286 #endif // VM_STACK_FRAME_H_ | 281 #endif // VM_STACK_FRAME_H_ |
| 287 | 282 |
| OLD | NEW |