Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(407)

Side by Side Diff: src/frames.cc

Issue 17589022: Do not iterate stack handlers in SafeStackFrameIterator (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Strengthened checks in the test as suggested Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/frames.h ('k') | test/cctest/test-cpu-profiler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « src/frames.h ('k') | test/cctest/test-cpu-profiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698