OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 StackFrameIterator::StackFrameIterator(bool use_top, Address fp, Address sp) | 79 StackFrameIterator::StackFrameIterator(bool use_top, Address fp, Address sp) |
80 : STACK_FRAME_TYPE_LIST(INITIALIZE_SINGLETON) | 80 : STACK_FRAME_TYPE_LIST(INITIALIZE_SINGLETON) |
81 frame_(NULL), handler_(NULL), | 81 frame_(NULL), handler_(NULL), |
82 thread_(use_top ? Top::GetCurrentThread() : NULL), | 82 thread_(use_top ? Top::GetCurrentThread() : NULL), |
83 fp_(use_top ? NULL : fp), sp_(sp), | 83 fp_(use_top ? NULL : fp), sp_(sp), |
84 advance_(use_top ? &StackFrameIterator::AdvanceWithHandler : | 84 advance_(use_top ? &StackFrameIterator::AdvanceWithHandler : |
85 &StackFrameIterator::AdvanceWithoutHandler) { | 85 &StackFrameIterator::AdvanceWithoutHandler) { |
86 if (use_top || fp != NULL) { | 86 if (use_top || fp != NULL) { |
87 Reset(); | 87 Reset(); |
88 } | 88 } |
89 JavaScriptFrame_.DisableHeapAccess(); | |
90 } | 89 } |
91 | 90 |
92 #undef INITIALIZE_SINGLETON | 91 #undef INITIALIZE_SINGLETON |
93 | 92 |
94 | 93 |
95 void StackFrameIterator::AdvanceWithHandler() { | 94 void StackFrameIterator::AdvanceWithHandler() { |
96 ASSERT(!done()); | 95 ASSERT(!done()); |
97 // Compute the state of the calling frame before restoring | 96 // Compute the state of the calling frame before restoring |
98 // callee-saved registers and unwinding handlers. This allows the | 97 // callee-saved registers and unwinding handlers. This allows the |
99 // frame code that computes the caller state to access the top | 98 // frame code that computes the caller state to access the top |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 bool SafeStackFrameIterator::CanIterateHandles(StackFrame* frame, | 224 bool SafeStackFrameIterator::CanIterateHandles(StackFrame* frame, |
226 StackHandler* handler) { | 225 StackHandler* handler) { |
227 // If StackIterator iterates over StackHandles, verify that | 226 // If StackIterator iterates over StackHandles, verify that |
228 // StackHandlerIterator can be instantiated (see StackHandlerIterator | 227 // StackHandlerIterator can be instantiated (see StackHandlerIterator |
229 // constructor.) | 228 // constructor.) |
230 return !is_valid_top_ || (frame->sp() <= handler->address()); | 229 return !is_valid_top_ || (frame->sp() <= handler->address()); |
231 } | 230 } |
232 | 231 |
233 | 232 |
234 bool SafeStackFrameIterator::IsValidFrame(StackFrame* frame) const { | 233 bool SafeStackFrameIterator::IsValidFrame(StackFrame* frame) const { |
235 return IsValidStackAddress(frame->sp()) && IsValidStackAddress(frame->fp()); | 234 return IsValidStackAddress(frame->sp()) && IsValidStackAddress(frame->fp()) && |
| 235 // JavaScriptFrame uses function shared info to advance, hence it must |
| 236 // point to a valid function object. |
| 237 (!frame->is_java_script() || |
| 238 reinterpret_cast<JavaScriptFrame*>(frame)->is_at_function()); |
236 } | 239 } |
237 | 240 |
238 | 241 |
239 bool SafeStackFrameIterator::IsValidCaller(StackFrame* frame) { | 242 bool SafeStackFrameIterator::IsValidCaller(StackFrame* frame) { |
240 StackFrame::State state; | 243 StackFrame::State state; |
241 if (frame->is_entry() || frame->is_entry_construct()) { | 244 if (frame->is_entry() || frame->is_entry_construct()) { |
242 // See EntryFrame::GetCallerState. It computes the caller FP address | 245 // See EntryFrame::GetCallerState. It computes the caller FP address |
243 // and calls ExitFrame::GetStateForFramePointer on it. We need to be | 246 // and calls ExitFrame::GetStateForFramePointer on it. We need to be |
244 // sure that caller FP address is valid. | 247 // sure that caller FP address is valid. |
245 Address caller_fp = Memory::Address_at( | 248 Address caller_fp = Memory::Address_at( |
(...skipping 25 matching lines...) Expand all Loading... |
271 } | 274 } |
272 | 275 |
273 | 276 |
274 // ------------------------------------------------------------------------- | 277 // ------------------------------------------------------------------------- |
275 | 278 |
276 | 279 |
277 #ifdef ENABLE_LOGGING_AND_PROFILING | 280 #ifdef ENABLE_LOGGING_AND_PROFILING |
278 SafeStackTraceFrameIterator::SafeStackTraceFrameIterator( | 281 SafeStackTraceFrameIterator::SafeStackTraceFrameIterator( |
279 Address fp, Address sp, Address low_bound, Address high_bound) : | 282 Address fp, Address sp, Address low_bound, Address high_bound) : |
280 SafeJavaScriptFrameIterator(fp, sp, low_bound, high_bound) { | 283 SafeJavaScriptFrameIterator(fp, sp, low_bound, high_bound) { |
281 if (!done() && !frame()->is_java_script()) Advance(); | 284 if (!done() && !frame()->is_at_function()) Advance(); |
282 } | 285 } |
283 | 286 |
284 | 287 |
285 void SafeStackTraceFrameIterator::Advance() { | 288 void SafeStackTraceFrameIterator::Advance() { |
286 while (true) { | 289 while (true) { |
287 SafeJavaScriptFrameIterator::Advance(); | 290 SafeJavaScriptFrameIterator::Advance(); |
288 if (done()) return; | 291 if (done()) return; |
289 if (frame()->is_java_script()) return; | 292 if (frame()->is_at_function()) return; |
290 } | 293 } |
291 } | 294 } |
292 #endif | 295 #endif |
293 | 296 |
294 | 297 |
295 // ------------------------------------------------------------------------- | 298 // ------------------------------------------------------------------------- |
296 | 299 |
297 | 300 |
298 void StackHandler::Cook(Code* code) { | 301 void StackHandler::Cook(Code* code) { |
299 ASSERT(MarkCompactCollector::IsCompacting()); | 302 ASSERT(MarkCompactCollector::IsCompacting()); |
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
731 reg_code[i++] = r; | 734 reg_code[i++] = r; |
732 | 735 |
733 ASSERT(i == kNumJSCallerSaved); | 736 ASSERT(i == kNumJSCallerSaved); |
734 } | 737 } |
735 ASSERT(0 <= n && n < kNumJSCallerSaved); | 738 ASSERT(0 <= n && n < kNumJSCallerSaved); |
736 return reg_code[n]; | 739 return reg_code[n]; |
737 } | 740 } |
738 | 741 |
739 | 742 |
740 } } // namespace v8::internal | 743 } } // namespace v8::internal |
OLD | NEW |