| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/frames.h" | 5 #include "src/frames.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
| 10 #include "src/ast/scopeinfo.h" | 10 #include "src/ast/scopeinfo.h" |
| 11 #include "src/base/bits.h" | 11 #include "src/base/bits.h" |
| 12 #include "src/deoptimizer.h" | 12 #include "src/deoptimizer.h" |
| 13 #include "src/frames-inl.h" | 13 #include "src/frames-inl.h" |
| 14 #include "src/full-codegen/full-codegen.h" | 14 #include "src/full-codegen/full-codegen.h" |
| 15 #include "src/register-configuration.h" | 15 #include "src/register-configuration.h" |
| 16 #include "src/safepoint-table.h" | 16 #include "src/safepoint-table.h" |
| 17 #include "src/string-stream.h" | 17 #include "src/string-stream.h" |
| 18 #include "src/vm-state-inl.h" | 18 #include "src/vm-state-inl.h" |
| 19 #include "src/wasm/wasm-module.h" |
| 19 | 20 |
| 20 namespace v8 { | 21 namespace v8 { |
| 21 namespace internal { | 22 namespace internal { |
| 22 | 23 |
| 23 ReturnAddressLocationResolver | 24 ReturnAddressLocationResolver |
| 24 StackFrame::return_address_location_resolver_ = NULL; | 25 StackFrame::return_address_location_resolver_ = NULL; |
| 25 | 26 |
| 26 | 27 |
| 27 // Iterator that supports traversing the stack handlers of a | 28 // Iterator that supports traversing the stack handlers of a |
| 28 // particular frame. Needs to know the top of the handler chain. | 29 // particular frame. Needs to know the top of the handler chain. |
| (...skipping 27 matching lines...) Expand all Loading... |
| 56 #define INITIALIZE_SINGLETON(type, field) field##_(this), | 57 #define INITIALIZE_SINGLETON(type, field) field##_(this), |
| 57 StackFrameIteratorBase::StackFrameIteratorBase(Isolate* isolate, | 58 StackFrameIteratorBase::StackFrameIteratorBase(Isolate* isolate, |
| 58 bool can_access_heap_objects) | 59 bool can_access_heap_objects) |
| 59 : isolate_(isolate), | 60 : isolate_(isolate), |
| 60 STACK_FRAME_TYPE_LIST(INITIALIZE_SINGLETON) | 61 STACK_FRAME_TYPE_LIST(INITIALIZE_SINGLETON) |
| 61 frame_(NULL), handler_(NULL), | 62 frame_(NULL), handler_(NULL), |
| 62 can_access_heap_objects_(can_access_heap_objects) { | 63 can_access_heap_objects_(can_access_heap_objects) { |
| 63 } | 64 } |
| 64 #undef INITIALIZE_SINGLETON | 65 #undef INITIALIZE_SINGLETON |
| 65 | 66 |
| 66 | |
| 67 StackFrameIterator::StackFrameIterator(Isolate* isolate) | 67 StackFrameIterator::StackFrameIterator(Isolate* isolate) |
| 68 : StackFrameIteratorBase(isolate, true) { | 68 : StackFrameIterator(isolate, isolate->thread_local_top()) {} |
| 69 Reset(isolate->thread_local_top()); | |
| 70 } | |
| 71 | |
| 72 | 69 |
| 73 StackFrameIterator::StackFrameIterator(Isolate* isolate, ThreadLocalTop* t) | 70 StackFrameIterator::StackFrameIterator(Isolate* isolate, ThreadLocalTop* t) |
| 74 : StackFrameIteratorBase(isolate, true) { | 71 : StackFrameIteratorBase(isolate, true) { |
| 75 Reset(t); | 72 Reset(t); |
| 76 } | 73 } |
| 77 | 74 |
| 78 | |
| 79 void StackFrameIterator::Advance() { | 75 void StackFrameIterator::Advance() { |
| 80 DCHECK(!done()); | 76 DCHECK(!done()); |
| 81 // Compute the state of the calling frame before restoring | 77 // Compute the state of the calling frame before restoring |
| 82 // callee-saved registers and unwinding handlers. This allows the | 78 // callee-saved registers and unwinding handlers. This allows the |
| 83 // frame code that computes the caller state to access the top | 79 // frame code that computes the caller state to access the top |
| 84 // handler and the value of any callee-saved register if needed. | 80 // handler and the value of any callee-saved register if needed. |
| 85 StackFrame::State state; | 81 StackFrame::State state; |
| 86 StackFrame::Type type = frame_->GetCallerState(&state); | 82 StackFrame::Type type = frame_->GetCallerState(&state); |
| 87 | 83 |
| 88 // Unwind handlers corresponding to the current frame. | 84 // Unwind handlers corresponding to the current frame. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 } | 154 } |
| 159 | 155 |
| 160 | 156 |
| 161 // ------------------------------------------------------------------------- | 157 // ------------------------------------------------------------------------- |
| 162 | 158 |
| 163 StackTraceFrameIterator::StackTraceFrameIterator(Isolate* isolate) | 159 StackTraceFrameIterator::StackTraceFrameIterator(Isolate* isolate) |
| 164 : iterator_(isolate) { | 160 : iterator_(isolate) { |
| 165 if (!done() && !IsValidFrame(iterator_.frame())) Advance(); | 161 if (!done() && !IsValidFrame(iterator_.frame())) Advance(); |
| 166 } | 162 } |
| 167 | 163 |
| 164 StackTraceFrameIterator::StackTraceFrameIterator(Isolate* isolate, |
| 165 StackFrame::Id id) |
| 166 : StackTraceFrameIterator(isolate) { |
| 167 while (!done() && frame()->id() != id) Advance(); |
| 168 } |
| 168 | 169 |
| 169 void StackTraceFrameIterator::Advance() { | 170 void StackTraceFrameIterator::Advance() { |
| 170 do { | 171 do { |
| 171 iterator_.Advance(); | 172 iterator_.Advance(); |
| 172 } while (!done() && !IsValidFrame(iterator_.frame())); | 173 } while (!done() && !IsValidFrame(iterator_.frame())); |
| 173 } | 174 } |
| 174 | 175 |
| 175 bool StackTraceFrameIterator::IsValidFrame(StackFrame* frame) const { | 176 bool StackTraceFrameIterator::IsValidFrame(StackFrame* frame) const { |
| 176 if (frame->is_java_script()) { | 177 if (frame->is_java_script()) { |
| 177 JavaScriptFrame* jsFrame = static_cast<JavaScriptFrame*>(frame); | 178 JavaScriptFrame* jsFrame = static_cast<JavaScriptFrame*>(frame); |
| 178 if (!jsFrame->function()->IsJSFunction()) return false; | 179 if (!jsFrame->function()->IsJSFunction()) return false; |
| 179 Object* script = jsFrame->function()->shared()->script(); | 180 Object* script = jsFrame->function()->shared()->script(); |
| 180 // Don't show functions from native scripts to user. | 181 // Don't show functions from native scripts to user. |
| 181 return (script->IsScript() && | 182 return (script->IsScript() && |
| 182 Script::TYPE_NATIVE != Script::cast(script)->type()); | 183 Script::TYPE_NATIVE != Script::cast(script)->type()); |
| 183 } | 184 } |
| 184 // apart from javascript, only wasm is valid | 185 // apart from javascript, only wasm is valid |
| 185 return frame->is_wasm(); | 186 return frame->is_wasm(); |
| 186 } | 187 } |
| 187 | 188 |
| 189 void StackTraceFrameIterator::AdvanceToArgumentsFrame() { |
| 190 if (!is_javascript() || !javascript_frame()->has_adapted_arguments()) return; |
| 191 iterator_.Advance(); |
| 192 DCHECK(iterator_.frame()->is_arguments_adaptor()); |
| 193 } |
| 188 | 194 |
| 189 // ------------------------------------------------------------------------- | 195 // ------------------------------------------------------------------------- |
| 190 | 196 |
| 191 | 197 |
| 192 SafeStackFrameIterator::SafeStackFrameIterator( | 198 SafeStackFrameIterator::SafeStackFrameIterator( |
| 193 Isolate* isolate, | 199 Isolate* isolate, |
| 194 Address fp, Address sp, Address js_entry_sp) | 200 Address fp, Address sp, Address js_entry_sp) |
| 195 : StackFrameIteratorBase(isolate, false), | 201 : StackFrameIteratorBase(isolate, false), |
| 196 low_bound_(sp), | 202 low_bound_(sp), |
| 197 high_bound_(js_entry_sp), | 203 high_bound_(js_entry_sp), |
| (...skipping 1134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1332 Code* WasmFrame::unchecked_code() const { | 1338 Code* WasmFrame::unchecked_code() const { |
| 1333 return static_cast<Code*>(isolate()->FindCodeObject(pc())); | 1339 return static_cast<Code*>(isolate()->FindCodeObject(pc())); |
| 1334 } | 1340 } |
| 1335 | 1341 |
| 1336 void WasmFrame::Iterate(ObjectVisitor* v) const { IterateCompiledFrame(v); } | 1342 void WasmFrame::Iterate(ObjectVisitor* v) const { IterateCompiledFrame(v); } |
| 1337 | 1343 |
| 1338 Address WasmFrame::GetCallerStackPointer() const { | 1344 Address WasmFrame::GetCallerStackPointer() const { |
| 1339 return fp() + ExitFrameConstants::kCallerSPOffset; | 1345 return fp() + ExitFrameConstants::kCallerSPOffset; |
| 1340 } | 1346 } |
| 1341 | 1347 |
| 1342 Object* WasmFrame::wasm_obj() { | 1348 Object* WasmFrame::wasm_obj() const { |
| 1343 FixedArray* deopt_data = LookupCode()->deoptimization_data(); | 1349 FixedArray* deopt_data = LookupCode()->deoptimization_data(); |
| 1344 DCHECK(deopt_data->length() == 2); | 1350 DCHECK(deopt_data->length() == 2); |
| 1345 return deopt_data->get(0); | 1351 return deopt_data->get(0); |
| 1346 } | 1352 } |
| 1347 | 1353 |
| 1348 uint32_t WasmFrame::function_index() { | 1354 uint32_t WasmFrame::function_index() const { |
| 1349 FixedArray* deopt_data = LookupCode()->deoptimization_data(); | 1355 FixedArray* deopt_data = LookupCode()->deoptimization_data(); |
| 1350 DCHECK(deopt_data->length() == 2); | 1356 DCHECK(deopt_data->length() == 2); |
| 1351 Object* func_index_obj = deopt_data->get(1); | 1357 return Smi::cast(deopt_data->get(1))->value(); |
| 1352 if (func_index_obj->IsUndefined(isolate())) return static_cast<uint32_t>(-1); | |
| 1353 if (func_index_obj->IsSmi()) return Smi::cast(func_index_obj)->value(); | |
| 1354 DCHECK(func_index_obj->IsHeapNumber()); | |
| 1355 uint32_t val = static_cast<uint32_t>(-1); | |
| 1356 func_index_obj->ToUint32(&val); | |
| 1357 DCHECK(val != static_cast<uint32_t>(-1)); | |
| 1358 return val; | |
| 1359 } | 1358 } |
| 1360 | 1359 |
| 1361 namespace { | 1360 namespace { |
| 1362 | 1361 |
| 1363 | 1362 |
| 1364 void PrintFunctionSource(StringStream* accumulator, SharedFunctionInfo* shared, | 1363 void PrintFunctionSource(StringStream* accumulator, SharedFunctionInfo* shared, |
| 1365 Code* code) { | 1364 Code* code) { |
| 1366 if (FLAG_max_stack_trace_source_length != 0 && code != NULL) { | 1365 if (FLAG_max_stack_trace_source_length != 0 && code != NULL) { |
| 1367 std::ostringstream os; | 1366 std::ostringstream os; |
| 1368 os << "--------- s o u r c e c o d e ---------\n" | 1367 os << "--------- s o u r c e c o d e ---------\n" |
| (...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1788 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { | 1787 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { |
| 1789 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); | 1788 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); |
| 1790 list.Add(frame, zone); | 1789 list.Add(frame, zone); |
| 1791 } | 1790 } |
| 1792 return list.ToVector(); | 1791 return list.ToVector(); |
| 1793 } | 1792 } |
| 1794 | 1793 |
| 1795 | 1794 |
| 1796 } // namespace internal | 1795 } // namespace internal |
| 1797 } // namespace v8 | 1796 } // namespace v8 |
| OLD | NEW |