OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "src/source-position.h" |
| 6 #include "src/compilation-info.h" |
| 7 #include "src/objects-inl.h" |
| 8 |
| 9 namespace v8 { |
| 10 namespace internal { |
| 11 |
| 12 std::ostream& operator<<(std::ostream& out, const SourcePositionInfo& pos) { |
| 13 Handle<SharedFunctionInfo> function; |
| 14 if (pos.function.ToHandle(&function)) { |
| 15 Handle<Script> script(Script::cast(function->script())); |
| 16 Handle<String> name(String::cast(script->name())); |
| 17 out << "<" << name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL).get() |
| 18 << ":" << pos.line + 1 << ":" << pos.column + 1 << ">"; |
| 19 } else { |
| 20 out << "<unknown:" << pos.position.ScriptOffset() << ">"; |
| 21 } |
| 22 return out; |
| 23 } |
| 24 |
| 25 std::ostream& operator<<(std::ostream& out, |
| 26 const std::vector<SourcePositionInfo>& stack) { |
| 27 bool first = true; |
| 28 out << stack.back(); |
| 29 for (int i = static_cast<int>(stack.size()) - 2; i >= 0; --i) { |
| 30 out << " inlined at "; |
| 31 out << stack[i]; |
| 32 } |
| 33 return out; |
| 34 } |
| 35 |
| 36 std::ostream& operator<<(std::ostream& out, const SourcePosition& pos) { |
| 37 out << "<" << pos.InliningId() << ":" << pos.ScriptOffset() << ">"; |
| 38 return out; |
| 39 } |
| 40 |
| 41 SourcePositionInfo SourcePosition::Info( |
| 42 Handle<SharedFunctionInfo> function) const { |
| 43 Handle<Script> script(Script::cast(function->script())); |
| 44 SourcePositionInfo result(*this); |
| 45 Script::PositionInfo pos; |
| 46 if (script->GetPositionInfo(ScriptOffset(), &pos, Script::NO_OFFSET)) { |
| 47 result.line = pos.line; |
| 48 result.column = pos.column; |
| 49 } |
| 50 result.function = function; |
| 51 return result; |
| 52 } |
| 53 |
| 54 std::vector<SourcePositionInfo> SourcePosition::Info( |
| 55 CompilationInfo* cinfo) const { |
| 56 if (InliningId() == kUnknown) { |
| 57 return std::vector<SourcePositionInfo>{Info(cinfo->shared_info())}; |
| 58 } else { |
| 59 InliningPosition inl = cinfo->inlined_functions()[InliningId()].position; |
| 60 std::vector<SourcePositionInfo> stack = inl.position.Info(cinfo); |
| 61 stack.push_back(Info(cinfo->inlined_functions()[InliningId()].shared_info)); |
| 62 return stack; |
| 63 } |
| 64 } |
| 65 |
| 66 std::vector<SourcePositionInfo> SourcePosition::Info(Handle<Code> code) const { |
| 67 Handle<DeoptimizationInputData> deopt_data( |
| 68 DeoptimizationInputData::cast(code->deoptimization_data())); |
| 69 if (InliningId() == kUnknown) { |
| 70 Handle<SharedFunctionInfo> function( |
| 71 SharedFunctionInfo::cast(deopt_data->SharedFunctionInfo())); |
| 72 |
| 73 return std::vector<SourcePositionInfo>{Info(function)}; |
| 74 } else { |
| 75 InliningPosition inl = deopt_data->InliningPositions()->get(InliningId()); |
| 76 std::vector<SourcePositionInfo> stack = inl.position.Info(code); |
| 77 if (inl.inlined_function_id == -1) { |
| 78 stack.push_back(SourcePositionInfo(*this)); |
| 79 } else { |
| 80 Handle<SharedFunctionInfo> function(SharedFunctionInfo::cast( |
| 81 deopt_data->LiteralArray()->get(inl.inlined_function_id))); |
| 82 stack.push_back(Info(function)); |
| 83 } |
| 84 return stack; |
| 85 } |
| 86 } |
| 87 |
| 88 void SourcePosition::Print(std::ostream& out) const { |
| 89 out << "<" << ScriptOffset() << ">"; |
| 90 } |
| 91 |
| 92 void SourcePosition::Print(std::ostream& out, |
| 93 SharedFunctionInfo* function) const { |
| 94 Script* script = Script::cast(function->script()); |
| 95 String* name = String::cast(script->name()); |
| 96 Script::PositionInfo pos; |
| 97 script->GetPositionInfo(ScriptOffset(), &pos, Script::NO_OFFSET); |
| 98 out << "<" << name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL).get() |
| 99 << ":" << pos.line + 1 << ":" << pos.column + 1 << ">"; |
| 100 } |
| 101 |
| 102 void SourcePosition::Print(std::ostream& out, Code* code) const { |
| 103 DeoptimizationInputData* deopt_data = |
| 104 DeoptimizationInputData::cast(code->deoptimization_data()); |
| 105 if (InliningId() == kUnknown) { |
| 106 SharedFunctionInfo* function( |
| 107 SharedFunctionInfo::cast(deopt_data->SharedFunctionInfo())); |
| 108 Print(out, function); |
| 109 } else { |
| 110 InliningPosition inl = deopt_data->InliningPositions()->get(InliningId()); |
| 111 if (inl.inlined_function_id == -1) { |
| 112 Print(out); |
| 113 } else { |
| 114 SharedFunctionInfo* function = SharedFunctionInfo::cast( |
| 115 deopt_data->LiteralArray()->get(inl.inlined_function_id)); |
| 116 Print(out, function); |
| 117 } |
| 118 out << " inlined at "; |
| 119 inl.position.Print(out, code); |
| 120 } |
| 121 } |
| 122 |
| 123 } // namespace internal |
| 124 } // namespace v8 |
OLD | NEW |