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() == kNotInlined) { | |
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 { | |
vogelheim
2016/11/04 10:57:41
I don't get this. If I read the code below correct
Yang
2016/11/04 14:32:59
I guess the vector is supposed to return the full
| |
67 Handle<DeoptimizationInputData> deopt_data( | |
68 DeoptimizationInputData::cast(code->deoptimization_data())); | |
69 if (InliningId() == kNotInlined) { | |
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)); | |
vogelheim
2016/11/04 10:57:41
nipitck: (here & function above)
You sometimes bu
| |
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() << ">"; | |
vogelheim
2016/11/04 10:57:41
Why not print the inline id?
Also, should there be
| |
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() == kNotInlined) { | |
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 |