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 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 const Address limit_; | 72 const Address limit_; |
73 StackHandler* handler_; | 73 StackHandler* handler_; |
74 }; | 74 }; |
75 | 75 |
76 | 76 |
77 // ------------------------------------------------------------------------- | 77 // ------------------------------------------------------------------------- |
78 | 78 |
79 | 79 |
80 #define INITIALIZE_SINGLETON(type, field) field##_(this), | 80 #define INITIALIZE_SINGLETON(type, field) field##_(this), |
81 StackFrameIteratorBase::StackFrameIteratorBase(Isolate* isolate, | 81 StackFrameIteratorBase::StackFrameIteratorBase(Isolate* isolate, |
82 bool can_access_heap_objects) | 82 bool can_access_heap_objects, |
| 83 bool allow_builtins_on_stack) |
83 : isolate_(isolate), | 84 : isolate_(isolate), |
84 STACK_FRAME_TYPE_LIST(INITIALIZE_SINGLETON) | 85 STACK_FRAME_TYPE_LIST(INITIALIZE_SINGLETON) |
85 frame_(NULL), handler_(NULL), | 86 frame_(NULL), handler_(NULL), |
86 can_access_heap_objects_(can_access_heap_objects) { | 87 can_access_heap_objects_(can_access_heap_objects), |
| 88 allow_builtins_on_stack_(allow_builtins_on_stack) { |
87 } | 89 } |
88 #undef INITIALIZE_SINGLETON | 90 #undef INITIALIZE_SINGLETON |
89 | 91 |
90 | 92 |
91 StackFrameIterator::StackFrameIterator(Isolate* isolate) | 93 StackFrameIterator::StackFrameIterator(Isolate* isolate, |
92 : StackFrameIteratorBase(isolate, true) { | 94 bool allow_builtins_on_stack) |
| 95 : StackFrameIteratorBase(isolate, true, allow_builtins_on_stack) { |
93 Reset(isolate->thread_local_top()); | 96 Reset(isolate->thread_local_top()); |
94 } | 97 } |
95 | 98 |
96 | 99 |
97 StackFrameIterator::StackFrameIterator(Isolate* isolate, ThreadLocalTop* t) | 100 StackFrameIterator::StackFrameIterator(Isolate* isolate, ThreadLocalTop* t) |
98 : StackFrameIteratorBase(isolate, true) { | 101 : StackFrameIteratorBase(isolate, true, false) { |
99 Reset(t); | 102 Reset(t); |
100 } | 103 } |
101 | 104 |
102 | 105 |
103 void StackFrameIterator::Advance() { | 106 void StackFrameIterator::Advance() { |
104 ASSERT(!done()); | 107 ASSERT(!done()); |
105 // Compute the state of the calling frame before restoring | 108 // Compute the state of the calling frame before restoring |
106 // callee-saved registers and unwinding handlers. This allows the | 109 // callee-saved registers and unwinding handlers. This allows the |
107 // frame code that computes the caller state to access the top | 110 // frame code that computes the caller state to access the top |
108 // handler and the value of any callee-saved register if needed. | 111 // handler and the value of any callee-saved register if needed. |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 void JavaScriptFrameIterator::AdvanceToArgumentsFrame() { | 185 void JavaScriptFrameIterator::AdvanceToArgumentsFrame() { |
183 if (!frame()->has_adapted_arguments()) return; | 186 if (!frame()->has_adapted_arguments()) return; |
184 iterator_.Advance(); | 187 iterator_.Advance(); |
185 ASSERT(iterator_.frame()->is_arguments_adaptor()); | 188 ASSERT(iterator_.frame()->is_arguments_adaptor()); |
186 } | 189 } |
187 | 190 |
188 | 191 |
189 // ------------------------------------------------------------------------- | 192 // ------------------------------------------------------------------------- |
190 | 193 |
191 | 194 |
192 StackTraceFrameIterator::StackTraceFrameIterator(Isolate* isolate) | 195 StackTraceFrameIterator::StackTraceFrameIterator(Isolate* isolate, |
193 : JavaScriptFrameIterator(isolate) { | 196 bool allow_builtins_on_stack) |
| 197 : JavaScriptFrameIterator(isolate, allow_builtins_on_stack) { |
194 if (!done() && !IsValidFrame()) Advance(); | 198 if (!done() && !IsValidFrame()) Advance(); |
195 } | 199 } |
196 | 200 |
197 | 201 |
198 void StackTraceFrameIterator::Advance() { | 202 void StackTraceFrameIterator::Advance() { |
199 while (true) { | 203 while (true) { |
200 JavaScriptFrameIterator::Advance(); | 204 JavaScriptFrameIterator::Advance(); |
201 if (done()) return; | 205 if (done()) return; |
202 if (IsValidFrame()) return; | 206 if (IsValidFrame()) return; |
203 } | 207 } |
204 } | 208 } |
205 | 209 |
206 | 210 |
207 bool StackTraceFrameIterator::IsValidFrame() { | 211 bool StackTraceFrameIterator::IsValidFrame() { |
208 if (!frame()->function()->IsJSFunction()) return false; | 212 if (!frame()->function()->IsJSFunction()) return false; |
209 Object* script = frame()->function()->shared()->script(); | 213 Object* script = frame()->function()->shared()->script(); |
210 // Don't show functions from native scripts to user. | 214 // Don't show functions from native scripts to user. |
211 return (script->IsScript() && | 215 return (script->IsScript() && |
212 Script::TYPE_NATIVE != Script::cast(script)->type()->value()); | 216 Script::TYPE_NATIVE != Script::cast(script)->type()->value()); |
213 } | 217 } |
214 | 218 |
215 | 219 |
216 // ------------------------------------------------------------------------- | 220 // ------------------------------------------------------------------------- |
217 | 221 |
218 | 222 |
219 SafeStackFrameIterator::SafeStackFrameIterator( | 223 SafeStackFrameIterator::SafeStackFrameIterator( |
220 Isolate* isolate, | 224 Isolate* isolate, |
221 Address fp, Address sp, Address js_entry_sp) | 225 Address fp, Address sp, Address js_entry_sp) |
222 : StackFrameIteratorBase(isolate, false), | 226 : StackFrameIteratorBase(isolate, false, true), |
223 low_bound_(sp), | 227 low_bound_(sp), |
224 high_bound_(js_entry_sp), | 228 high_bound_(js_entry_sp), |
225 top_frame_type_(StackFrame::NONE), | 229 top_frame_type_(StackFrame::NONE), |
226 external_callback_scope_(isolate->external_callback_scope()) { | 230 external_callback_scope_(isolate->external_callback_scope()) { |
227 StackFrame::State state; | 231 StackFrame::State state; |
228 StackFrame::Type type; | 232 StackFrame::Type type; |
229 ThreadLocalTop* top = isolate->thread_local_top(); | 233 ThreadLocalTop* top = isolate->thread_local_top(); |
230 if (IsValidTop(top)) { | 234 if (IsValidTop(top)) { |
231 type = ExitFrame::GetStateForFramePointer(Isolate::c_entry_fp(top), &state); | 235 type = ExitFrame::GetStateForFramePointer(Isolate::c_entry_fp(top), &state); |
232 top_frame_type_ = type; | 236 top_frame_type_ = type; |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 const int offset = StandardFrameConstants::kMarkerOffset; | 451 const int offset = StandardFrameConstants::kMarkerOffset; |
448 Object* marker = Memory::Object_at(state->fp + offset); | 452 Object* marker = Memory::Object_at(state->fp + offset); |
449 if (!marker->IsSmi()) { | 453 if (!marker->IsSmi()) { |
450 // If we're using a "safe" stack iterator, we treat optimized | 454 // If we're using a "safe" stack iterator, we treat optimized |
451 // frames as normal JavaScript frames to avoid having to look | 455 // frames as normal JavaScript frames to avoid having to look |
452 // into the heap to determine the state. This is safe as long | 456 // into the heap to determine the state. This is safe as long |
453 // as nobody tries to GC... | 457 // as nobody tries to GC... |
454 if (!iterator->can_access_heap_objects_) return JAVA_SCRIPT; | 458 if (!iterator->can_access_heap_objects_) return JAVA_SCRIPT; |
455 Code::Kind kind = GetContainingCode(iterator->isolate(), | 459 Code::Kind kind = GetContainingCode(iterator->isolate(), |
456 *(state->pc_address))->kind(); | 460 *(state->pc_address))->kind(); |
457 ASSERT(kind == Code::FUNCTION || kind == Code::OPTIMIZED_FUNCTION); | 461 ASSERT(kind == Code::FUNCTION || kind == Code::OPTIMIZED_FUNCTION || |
| 462 iterator->allow_builtins_on_stack_); |
458 return (kind == Code::OPTIMIZED_FUNCTION) ? OPTIMIZED : JAVA_SCRIPT; | 463 return (kind == Code::OPTIMIZED_FUNCTION) ? OPTIMIZED : JAVA_SCRIPT; |
459 } | 464 } |
460 return static_cast<StackFrame::Type>(Smi::cast(marker)->value()); | 465 return static_cast<StackFrame::Type>(Smi::cast(marker)->value()); |
461 } | 466 } |
462 | 467 |
463 | 468 |
464 #ifdef DEBUG | 469 #ifdef DEBUG |
465 bool StackFrame::can_access_heap_objects() const { | 470 bool StackFrame::can_access_heap_objects() const { |
466 return iterator_->can_access_heap_objects_; | 471 return iterator_->can_access_heap_objects_; |
467 } | 472 } |
(...skipping 1159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1627 ZoneList<StackFrame*> list(10, zone); | 1632 ZoneList<StackFrame*> list(10, zone); |
1628 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { | 1633 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { |
1629 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); | 1634 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); |
1630 list.Add(frame, zone); | 1635 list.Add(frame, zone); |
1631 } | 1636 } |
1632 return list.ToVector(); | 1637 return list.ToVector(); |
1633 } | 1638 } |
1634 | 1639 |
1635 | 1640 |
1636 } } // namespace v8::internal | 1641 } } // namespace v8::internal |
OLD | NEW |