| 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 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 | 284 |
| 285 SafeStackFrameIterator::SafeStackFrameIterator( | 285 SafeStackFrameIterator::SafeStackFrameIterator( |
| 286 Isolate* isolate, | 286 Isolate* isolate, |
| 287 Address fp, Address sp, Address low_bound, Address high_bound) : | 287 Address fp, Address sp, Address low_bound, Address high_bound) : |
| 288 maintainer_(isolate), | 288 maintainer_(isolate), |
| 289 stack_validator_(low_bound, high_bound), | 289 stack_validator_(low_bound, high_bound), |
| 290 is_valid_top_(IsValidTop(isolate, low_bound, high_bound)), | 290 is_valid_top_(IsValidTop(isolate, low_bound, high_bound)), |
| 291 is_valid_fp_(IsWithinBounds(low_bound, high_bound, fp)), | 291 is_valid_fp_(IsWithinBounds(low_bound, high_bound, fp)), |
| 292 iteration_done_(!is_valid_top_ && !is_valid_fp_), | 292 iteration_done_(!is_valid_top_ && !is_valid_fp_), |
| 293 iterator_(isolate, is_valid_top_, is_valid_fp_ ? fp : NULL, sp) { | 293 iterator_(isolate, is_valid_top_, is_valid_fp_ ? fp : NULL, sp) { |
| 294 if (!done()) Advance(); |
| 294 } | 295 } |
| 295 | 296 |
| 296 bool SafeStackFrameIterator::is_active(Isolate* isolate) { | 297 bool SafeStackFrameIterator::is_active(Isolate* isolate) { |
| 297 return isolate->safe_stack_iterator_counter() > 0; | 298 return isolate->safe_stack_iterator_counter() > 0; |
| 298 } | 299 } |
| 299 | 300 |
| 300 | 301 |
| 301 bool SafeStackFrameIterator::IsValidTop(Isolate* isolate, | 302 bool SafeStackFrameIterator::IsValidTop(Isolate* isolate, |
| 302 Address low_bound, Address high_bound) { | 303 Address low_bound, Address high_bound) { |
| 303 ThreadLocalTop* top = isolate->thread_local_top(); | 304 ThreadLocalTop* top = isolate->thread_local_top(); |
| 304 Address fp = Isolate::c_entry_fp(top); | 305 Address fp = Isolate::c_entry_fp(top); |
| 305 ExitFrameValidator validator(low_bound, high_bound); | 306 ExitFrameValidator validator(low_bound, high_bound); |
| 306 if (!validator.IsValidFP(fp)) return false; | 307 if (!validator.IsValidFP(fp)) return false; |
| 307 return Isolate::handler(top) != NULL; | 308 return Isolate::handler(top) != NULL; |
| 308 } | 309 } |
| 309 | 310 |
| 310 | 311 |
| 311 void SafeStackFrameIterator::Advance() { | 312 void SafeStackFrameIterator::AdvanceOneFrame() { |
| 312 ASSERT(!done()); | 313 ASSERT(!done()); |
| 313 StackFrame* last_frame = iterator_.frame(); | 314 StackFrame* last_frame = iterator_.frame(); |
| 314 Address last_sp = last_frame->sp(), last_fp = last_frame->fp(); | 315 Address last_sp = last_frame->sp(), last_fp = last_frame->fp(); |
| 315 // Before advancing to the next stack frame, perform pointer validity tests | 316 // Before advancing to the next stack frame, perform pointer validity tests |
| 316 iteration_done_ = !IsValidFrame(last_frame) || | 317 iteration_done_ = !IsValidFrame(last_frame) || |
| 317 !CanIterateHandles(last_frame, iterator_.handler()) || | 318 !CanIterateHandles(last_frame, iterator_.handler()) || |
| 318 !IsValidCaller(last_frame); | 319 !IsValidCaller(last_frame); |
| 319 if (iteration_done_) return; | 320 if (iteration_done_) return; |
| 320 | 321 |
| 321 iterator_.Advance(); | 322 iterator_.Advance(); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 if (!number_of_args->IsSmi()) { | 360 if (!number_of_args->IsSmi()) { |
| 360 return false; | 361 return false; |
| 361 } | 362 } |
| 362 } | 363 } |
| 363 frame->ComputeCallerState(&state); | 364 frame->ComputeCallerState(&state); |
| 364 return IsValidStackAddress(state.sp) && IsValidStackAddress(state.fp) && | 365 return IsValidStackAddress(state.sp) && IsValidStackAddress(state.fp) && |
| 365 iterator_.SingletonFor(frame->GetCallerState(&state)) != NULL; | 366 iterator_.SingletonFor(frame->GetCallerState(&state)) != NULL; |
| 366 } | 367 } |
| 367 | 368 |
| 368 | 369 |
| 370 void SafeStackFrameIterator::Advance() { |
| 371 while (true) { |
| 372 AdvanceOneFrame(); |
| 373 if (done()) return; |
| 374 if (iterator_.frame()->is_java_script()) return; |
| 375 } |
| 376 } |
| 377 |
| 378 |
| 369 // ------------------------------------------------------------------------- | 379 // ------------------------------------------------------------------------- |
| 370 | 380 |
| 371 | 381 |
| 372 SafeStackTraceFrameIterator::SafeStackTraceFrameIterator( | |
| 373 Isolate* isolate, | |
| 374 Address fp, Address sp, Address low_bound, Address high_bound) | |
| 375 : iterator_(isolate, fp, sp, low_bound, high_bound) { | |
| 376 if (!done()) Advance(); | |
| 377 } | |
| 378 | |
| 379 | |
| 380 void SafeStackTraceFrameIterator::Advance() { | |
| 381 while (true) { | |
| 382 iterator_.Advance(); | |
| 383 if (iterator_.done()) return; | |
| 384 if (iterator_.frame()->is_java_script()) return; | |
| 385 } | |
| 386 } | |
| 387 | |
| 388 | |
| 389 Code* StackFrame::GetSafepointData(Isolate* isolate, | 382 Code* StackFrame::GetSafepointData(Isolate* isolate, |
| 390 Address inner_pointer, | 383 Address inner_pointer, |
| 391 SafepointEntry* safepoint_entry, | 384 SafepointEntry* safepoint_entry, |
| 392 unsigned* stack_slots) { | 385 unsigned* stack_slots) { |
| 393 InnerPointerToCodeCache::InnerPointerToCodeCacheEntry* entry = | 386 InnerPointerToCodeCache::InnerPointerToCodeCacheEntry* entry = |
| 394 isolate->inner_pointer_to_code_cache()->GetCacheEntry(inner_pointer); | 387 isolate->inner_pointer_to_code_cache()->GetCacheEntry(inner_pointer); |
| 395 if (!entry->safepoint_entry.is_valid()) { | 388 if (!entry->safepoint_entry.is_valid()) { |
| 396 entry->safepoint_entry = entry->code->GetSafepointEntry(inner_pointer); | 389 entry->safepoint_entry = entry->code->GetSafepointEntry(inner_pointer); |
| 397 ASSERT(entry->safepoint_entry.is_valid()); | 390 ASSERT(entry->safepoint_entry.is_valid()); |
| 398 } else { | 391 } else { |
| (...skipping 1237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1636 ZoneList<StackFrame*> list(10, zone); | 1629 ZoneList<StackFrame*> list(10, zone); |
| 1637 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { | 1630 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { |
| 1638 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); | 1631 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); |
| 1639 list.Add(frame, zone); | 1632 list.Add(frame, zone); |
| 1640 } | 1633 } |
| 1641 return list.ToVector(); | 1634 return list.ToVector(); |
| 1642 } | 1635 } |
| 1643 | 1636 |
| 1644 | 1637 |
| 1645 } } // namespace v8::internal | 1638 } } // namespace v8::internal |
| OLD | NEW |