| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 can_access_heap_objects_(true) { | 105 can_access_heap_objects_(true) { |
| 106 Reset(); | 106 Reset(); |
| 107 } | 107 } |
| 108 StackFrameIterator::StackFrameIterator(Isolate* isolate, | 108 StackFrameIterator::StackFrameIterator(Isolate* isolate, |
| 109 bool use_top, Address fp, Address sp) | 109 bool use_top, Address fp, Address sp) |
| 110 : isolate_(isolate), | 110 : isolate_(isolate), |
| 111 STACK_FRAME_TYPE_LIST(INITIALIZE_SINGLETON) | 111 STACK_FRAME_TYPE_LIST(INITIALIZE_SINGLETON) |
| 112 frame_(NULL), handler_(NULL), | 112 frame_(NULL), handler_(NULL), |
| 113 thread_(use_top ? isolate_->thread_local_top() : NULL), | 113 thread_(use_top ? isolate_->thread_local_top() : NULL), |
| 114 fp_(use_top ? NULL : fp), sp_(sp), | 114 fp_(use_top ? NULL : fp), sp_(sp), |
| 115 advance_(use_top ? &StackFrameIterator::AdvanceWithHandler : | 115 advance_(&StackFrameIterator::AdvanceWithoutHandler), |
| 116 &StackFrameIterator::AdvanceWithoutHandler), | |
| 117 can_access_heap_objects_(false) { | 116 can_access_heap_objects_(false) { |
| 118 if (use_top || fp != NULL) { | 117 if (use_top || fp != NULL) { |
| 119 Reset(); | 118 Reset(); |
| 120 } | 119 } |
| 121 } | 120 } |
| 122 | 121 |
| 123 #undef INITIALIZE_SINGLETON | 122 #undef INITIALIZE_SINGLETON |
| 124 | 123 |
| 125 | 124 |
| 126 void StackFrameIterator::AdvanceWithHandler() { | 125 void StackFrameIterator::AdvanceWithHandler() { |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 return Isolate::handler(top) != NULL; | 291 return Isolate::handler(top) != NULL; |
| 293 } | 292 } |
| 294 | 293 |
| 295 | 294 |
| 296 void SafeStackFrameIterator::AdvanceOneFrame() { | 295 void SafeStackFrameIterator::AdvanceOneFrame() { |
| 297 ASSERT(!done()); | 296 ASSERT(!done()); |
| 298 StackFrame* last_frame = iterator_.frame(); | 297 StackFrame* last_frame = iterator_.frame(); |
| 299 Address last_sp = last_frame->sp(), last_fp = last_frame->fp(); | 298 Address last_sp = last_frame->sp(), last_fp = last_frame->fp(); |
| 300 // Before advancing to the next stack frame, perform pointer validity tests | 299 // Before advancing to the next stack frame, perform pointer validity tests |
| 301 iteration_done_ = !IsValidFrame(last_frame) || | 300 iteration_done_ = !IsValidFrame(last_frame) || |
| 302 !CanIterateHandles(last_frame, iterator_.handler()) || | |
| 303 !IsValidCaller(last_frame); | 301 !IsValidCaller(last_frame); |
| 304 if (iteration_done_) return; | 302 if (iteration_done_) return; |
| 305 | 303 |
| 306 iterator_.Advance(); | 304 iterator_.Advance(); |
| 307 if (iterator_.done()) return; | 305 if (iterator_.done()) return; |
| 308 // Check that we have actually moved to the previous frame in the stack | 306 // Check that we have actually moved to the previous frame in the stack |
| 309 StackFrame* prev_frame = iterator_.frame(); | 307 StackFrame* prev_frame = iterator_.frame(); |
| 310 iteration_done_ = prev_frame->sp() < last_sp || prev_frame->fp() < last_fp; | 308 iteration_done_ = prev_frame->sp() < last_sp || prev_frame->fp() < last_fp; |
| 311 } | 309 } |
| 312 | 310 |
| 313 | 311 |
| 314 bool SafeStackFrameIterator::CanIterateHandles(StackFrame* frame, | |
| 315 StackHandler* handler) { | |
| 316 // If StackIterator iterates over StackHandles, verify that | |
| 317 // StackHandlerIterator can be instantiated (see StackHandlerIterator | |
| 318 // constructor.) | |
| 319 return !is_valid_top_ || (frame->sp() <= handler->address()); | |
| 320 } | |
| 321 | |
| 322 | |
| 323 bool SafeStackFrameIterator::IsValidFrame(StackFrame* frame) const { | 312 bool SafeStackFrameIterator::IsValidFrame(StackFrame* frame) const { |
| 324 return IsValidStackAddress(frame->sp()) && IsValidStackAddress(frame->fp()); | 313 return IsValidStackAddress(frame->sp()) && IsValidStackAddress(frame->fp()); |
| 325 } | 314 } |
| 326 | 315 |
| 327 | 316 |
| 328 bool SafeStackFrameIterator::IsValidCaller(StackFrame* frame) { | 317 bool SafeStackFrameIterator::IsValidCaller(StackFrame* frame) { |
| 329 StackFrame::State state; | 318 StackFrame::State state; |
| 330 if (frame->is_entry() || frame->is_entry_construct()) { | 319 if (frame->is_entry() || frame->is_entry_construct()) { |
| 331 // See EntryFrame::GetCallerState. It computes the caller FP address | 320 // See EntryFrame::GetCallerState. It computes the caller FP address |
| 332 // and calls ExitFrame::GetStateForFramePointer on it. We need to be | 321 // and calls ExitFrame::GetStateForFramePointer on it. We need to be |
| (...skipping 1288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1621 ZoneList<StackFrame*> list(10, zone); | 1610 ZoneList<StackFrame*> list(10, zone); |
| 1622 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { | 1611 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { |
| 1623 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); | 1612 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); |
| 1624 list.Add(frame, zone); | 1613 list.Add(frame, zone); |
| 1625 } | 1614 } |
| 1626 return list.ToVector(); | 1615 return list.ToVector(); |
| 1627 } | 1616 } |
| 1628 | 1617 |
| 1629 | 1618 |
| 1630 } } // namespace v8::internal | 1619 } } // namespace v8::internal |
| OLD | NEW |