| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 | 157 |
| 158 const Address functionAddr = | 158 const Address functionAddr = |
| 159 sample->fp + JavaScriptFrameConstants::kFunctionOffset; | 159 sample->fp + JavaScriptFrameConstants::kFunctionOffset; |
| 160 if (SafeStackFrameIterator::IsWithinBounds(sample->sp, js_entry_sp, | 160 if (SafeStackFrameIterator::IsWithinBounds(sample->sp, js_entry_sp, |
| 161 functionAddr)) { | 161 functionAddr)) { |
| 162 sample->function = Memory::Address_at(functionAddr) - kHeapObjectTag; | 162 sample->function = Memory::Address_at(functionAddr) - kHeapObjectTag; |
| 163 } | 163 } |
| 164 | 164 |
| 165 int i = 0; | 165 int i = 0; |
| 166 const Address callback = VMState::external_callback(); | 166 const Address callback = VMState::external_callback(); |
| 167 if (callback != NULL) { | 167 // Surprisingly, PC can point _exactly_ to callback start, with good |
| 168 // probability, and this will result in reporting fake nested |
| 169 // callback call. |
| 170 if (callback != NULL && callback != sample->pc) { |
| 168 sample->stack[i++] = callback; | 171 sample->stack[i++] = callback; |
| 169 } | 172 } |
| 170 | 173 |
| 171 SafeStackTraceFrameIterator it(sample->fp, sample->sp, | 174 SafeStackTraceFrameIterator it(sample->fp, sample->sp, |
| 172 sample->sp, js_entry_sp); | 175 sample->sp, js_entry_sp); |
| 173 while (!it.done() && i < TickSample::kMaxFramesCount) { | 176 while (!it.done() && i < TickSample::kMaxFramesCount) { |
| 174 sample->stack[i++] = | 177 sample->stack[i++] = |
| 175 reinterpret_cast<Address>(it.frame()->function_slot_object()) - | 178 reinterpret_cast<Address>(it.frame()->function_slot_object()) - |
| 176 kHeapObjectTag; | 179 kHeapObjectTag; |
| 177 it.Advance(); | 180 it.Advance(); |
| (...skipping 1468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1646 } | 1649 } |
| 1647 // Otherwise, if the sliding state window computation has not been | 1650 // Otherwise, if the sliding state window computation has not been |
| 1648 // started we do it now. | 1651 // started we do it now. |
| 1649 if (sliding_state_window_ == NULL) { | 1652 if (sliding_state_window_ == NULL) { |
| 1650 sliding_state_window_ = new SlidingStateWindow(); | 1653 sliding_state_window_ = new SlidingStateWindow(); |
| 1651 } | 1654 } |
| 1652 #endif | 1655 #endif |
| 1653 } | 1656 } |
| 1654 | 1657 |
| 1655 } } // namespace v8::internal | 1658 } } // namespace v8::internal |
| OLD | NEW |