| 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 RUNTIME_VM_STACK_FRAME_H_ | 5 #ifndef RUNTIME_VM_STACK_FRAME_H_ |
| 6 #define RUNTIME_VM_STACK_FRAME_H_ | 6 #define RUNTIME_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 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 // users of StackFrameIterator to ensure that the thread given is not running | 205 // users of StackFrameIterator to ensure that the thread given is not running |
| 206 // concurrently. | 206 // concurrently. |
| 207 class StackFrameIterator : public ValueObject { | 207 class StackFrameIterator : public ValueObject { |
| 208 public: | 208 public: |
| 209 static const bool kValidateFrames = true; | 209 static const bool kValidateFrames = true; |
| 210 static const bool kDontValidateFrames = false; | 210 static const bool kDontValidateFrames = false; |
| 211 | 211 |
| 212 // Iterators for iterating over all frames from the last ExitFrame to the | 212 // Iterators for iterating over all frames from the last ExitFrame to the |
| 213 // first EntryFrame. | 213 // first EntryFrame. |
| 214 explicit StackFrameIterator(bool validate, | 214 explicit StackFrameIterator(bool validate, |
| 215 Thread* thread = Thread::Current()); | 215 Thread* thread, |
| 216 bool allow_iterating_other_thread); |
| 216 StackFrameIterator(uword last_fp, | 217 StackFrameIterator(uword last_fp, |
| 217 bool validate, | 218 bool validate, |
| 218 Thread* thread = Thread::Current()); | 219 Thread* thread, |
| 220 bool allow_iterating_other_thread); |
| 219 | 221 |
| 220 #if !defined(TARGET_ARCH_DBC) | 222 #if !defined(TARGET_ARCH_DBC) |
| 221 // Iterator for iterating over all frames from the current frame (given by its | 223 // Iterator for iterating over all frames from the current frame (given by its |
| 222 // fp, sp, and pc) to the first EntryFrame. | 224 // fp, sp, and pc) to the first EntryFrame. |
| 223 StackFrameIterator(uword fp, | 225 StackFrameIterator(uword fp, |
| 224 uword sp, | 226 uword sp, |
| 225 uword pc, | 227 uword pc, |
| 226 bool validate, | 228 bool validate, |
| 227 Thread* thread = Thread::Current()); | 229 Thread* thread, |
| 230 bool allow_iterating_other_thread); |
| 228 #endif | 231 #endif |
| 229 | 232 |
| 230 // Checks if a next frame exists. | 233 // Checks if a next frame exists. |
| 231 bool HasNextFrame() const { return frames_.fp_ != 0; } | 234 bool HasNextFrame() const { return frames_.fp_ != 0; } |
| 232 | 235 |
| 233 // Get next frame. | 236 // Get next frame. |
| 234 StackFrame* NextFrame(); | 237 StackFrame* NextFrame(); |
| 235 | 238 |
| 236 bool validate() const { return validate_; } | 239 bool validate() const { return validate_; } |
| 237 | 240 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 | 298 |
| 296 // Iterator for iterating over all dart frames (skips over exit frames, | 299 // Iterator for iterating over all dart frames (skips over exit frames, |
| 297 // entry frames and stub frames). | 300 // entry frames and stub frames). |
| 298 // A DartFrameIterator can be initialized with an isolate other than the | 301 // A DartFrameIterator can be initialized with an isolate other than the |
| 299 // current thread's isolate. Because this is generally a bad idea, | 302 // current thread's isolate. Because this is generally a bad idea, |
| 300 // it is only allowed on Windows- where it is needed for the profiler. | 303 // it is only allowed on Windows- where it is needed for the profiler. |
| 301 // It is the responsibility of users of DartFrameIterator to ensure that the | 304 // It is the responsibility of users of DartFrameIterator to ensure that the |
| 302 // isolate given is not running concurrently on another thread. | 305 // isolate given is not running concurrently on another thread. |
| 303 class DartFrameIterator : public ValueObject { | 306 class DartFrameIterator : public ValueObject { |
| 304 public: | 307 public: |
| 305 explicit DartFrameIterator(Thread* thread = Thread::Current()) | 308 explicit DartFrameIterator(Thread* thread, bool allow_iterating_other_thread) |
| 306 : frames_(StackFrameIterator::kDontValidateFrames, thread) {} | 309 : frames_(StackFrameIterator::kDontValidateFrames, |
| 307 explicit DartFrameIterator(uword last_fp, Thread* thread = Thread::Current()) | 310 thread, |
| 308 : frames_(last_fp, StackFrameIterator::kDontValidateFrames, thread) {} | 311 allow_iterating_other_thread) {} |
| 312 explicit DartFrameIterator(uword last_fp, |
| 313 Thread* thread, |
| 314 bool allow_iterating_other_thread) |
| 315 : frames_(last_fp, |
| 316 StackFrameIterator::kDontValidateFrames, |
| 317 thread, |
| 318 allow_iterating_other_thread) {} |
| 309 | 319 |
| 310 #if !defined(TARGET_ARCH_DBC) | 320 #if !defined(TARGET_ARCH_DBC) |
| 311 DartFrameIterator(uword fp, | 321 DartFrameIterator(uword fp, |
| 312 uword sp, | 322 uword sp, |
| 313 uword pc, | 323 uword pc, |
| 314 Thread* thread = Thread::Current()) | 324 Thread* thread, |
| 315 : frames_(fp, sp, pc, StackFrameIterator::kDontValidateFrames, thread) {} | 325 bool allow_iterating_other_thread) |
| 326 : frames_(fp, |
| 327 sp, |
| 328 pc, |
| 329 StackFrameIterator::kDontValidateFrames, |
| 330 thread, |
| 331 allow_iterating_other_thread) {} |
| 316 #endif | 332 #endif |
| 317 | 333 |
| 318 // Get next dart frame. | 334 // Get next dart frame. |
| 319 StackFrame* NextFrame() { | 335 StackFrame* NextFrame() { |
| 320 StackFrame* frame = frames_.NextFrame(); | 336 StackFrame* frame = frames_.NextFrame(); |
| 321 while (frame != NULL && !frame->IsDartFrame(frames_.validate())) { | 337 while (frame != NULL && !frame->IsDartFrame(frames_.validate())) { |
| 322 frame = frames_.NextFrame(); | 338 frame = frames_.NextFrame(); |
| 323 } | 339 } |
| 324 return frame; | 340 return frame; |
| 325 } | 341 } |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 | 419 |
| 404 | 420 |
| 405 DART_FORCE_INLINE static uword LocalVarAddress(uword fp, intptr_t index) { | 421 DART_FORCE_INLINE static uword LocalVarAddress(uword fp, intptr_t index) { |
| 406 return fp + LocalVarIndex(0, index) * kWordSize; | 422 return fp + LocalVarIndex(0, index) * kWordSize; |
| 407 } | 423 } |
| 408 | 424 |
| 409 | 425 |
| 410 } // namespace dart | 426 } // namespace dart |
| 411 | 427 |
| 412 #endif // RUNTIME_VM_STACK_FRAME_H_ | 428 #endif // RUNTIME_VM_STACK_FRAME_H_ |
| OLD | NEW |