Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(390)

Side by Side Diff: src/source-position.cc

Issue 2451853002: Uniform and precise source positions for inlining (Closed)
Patch Set: addressed comments Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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 out << "<";
17 if (script->name()->IsString()) {
18 out << String::cast(script->name())->ToCString(DISALLOW_NULLS).get();
19 } else {
20 out << "unknown";
21 }
22 out << ":" << pos.line + 1 << ":" << pos.column + 1 << ">";
23 } else {
24 out << "<unknown:" << pos.position.ScriptOffset() << ">";
25 }
26 return out;
27 }
28
29 std::ostream& operator<<(std::ostream& out,
30 const std::vector<SourcePositionInfo>& stack) {
31 bool first = true;
32 out << stack.back();
33 for (int i = static_cast<int>(stack.size()) - 2; i >= 0; --i) {
34 out << " inlined at ";
35 out << stack[i];
36 }
37 return out;
38 }
39
40 std::ostream& operator<<(std::ostream& out, const SourcePosition& pos) {
41 if (pos.isInlined()) {
42 out << "<inlined(" << pos.InliningId() << "):";
43 } else {
44 out << "<not inlined:";
45 }
46 out << pos.ScriptOffset() << ">";
47 return out;
48 }
49
50 SourcePositionInfo SourcePosition::Info(
51 Handle<SharedFunctionInfo> function) const {
52 Handle<Script> script(Script::cast(function->script()));
53 SourcePositionInfo result(*this);
54 Script::PositionInfo pos;
55 if (Script::GetPositionInfo(script, ScriptOffset(), &pos,
56 Script::WITH_OFFSET)) {
57 result.line = pos.line;
58 result.column = pos.column;
59 }
60 result.function = function;
61 return result;
62 }
63
64 std::vector<SourcePositionInfo> SourcePosition::InliningStack(
65 CompilationInfo* cinfo) const {
66 if (!isInlined()) {
67 return std::vector<SourcePositionInfo>{Info(cinfo->shared_info())};
68 } else {
69 InliningPosition inl = cinfo->inlined_functions()[InliningId()].position;
70 std::vector<SourcePositionInfo> stack = inl.position.InliningStack(cinfo);
71 stack.push_back(Info(cinfo->inlined_functions()[InliningId()].shared_info));
72 return stack;
73 }
74 }
75
76 std::vector<SourcePositionInfo> SourcePosition::InliningStack(
77 Handle<Code> code) const {
78 Handle<DeoptimizationInputData> deopt_data(
79 DeoptimizationInputData::cast(code->deoptimization_data()));
80 if (!isInlined()) {
81 Handle<SharedFunctionInfo> function(
82 SharedFunctionInfo::cast(deopt_data->SharedFunctionInfo()));
83
84 return std::vector<SourcePositionInfo>{Info(function)};
85 } else {
86 InliningPosition inl = deopt_data->InliningPositions()->get(InliningId());
87 std::vector<SourcePositionInfo> stack = inl.position.InliningStack(code);
88 if (inl.inlined_function_id == -1) {
89 stack.push_back(SourcePositionInfo(*this));
90 } else {
91 Handle<SharedFunctionInfo> function(SharedFunctionInfo::cast(
92 deopt_data->LiteralArray()->get(inl.inlined_function_id)));
93 stack.push_back(Info(function));
94 }
95 return stack;
96 }
97 }
98
99 void SourcePosition::Print(std::ostream& out,
100 SharedFunctionInfo* function) const {
101 Script* script = Script::cast(function->script());
102 Object* source_name = script->name();
103 Script::PositionInfo pos;
104 script->GetPositionInfo(ScriptOffset(), &pos, Script::WITH_OFFSET);
105 out << "<";
106 if (source_name->IsString()) {
107 out << String::cast(source_name)
108 ->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL)
109 .get();
110 } else {
111 out << "unknown";
112 }
113 out << ":" << pos.line + 1 << ":" << pos.column + 1 << ">";
114 }
115
116 void SourcePosition::Print(std::ostream& out, Code* code) const {
117 DeoptimizationInputData* deopt_data =
118 DeoptimizationInputData::cast(code->deoptimization_data());
119 if (!isInlined()) {
120 SharedFunctionInfo* function(
121 SharedFunctionInfo::cast(deopt_data->SharedFunctionInfo()));
122 Print(out, function);
123 } else {
124 InliningPosition inl = deopt_data->InliningPositions()->get(InliningId());
125 if (inl.inlined_function_id == -1) {
126 out << *this;
127 } else {
128 SharedFunctionInfo* function = SharedFunctionInfo::cast(
129 deopt_data->LiteralArray()->get(inl.inlined_function_id));
130 Print(out, function);
131 }
132 out << " inlined at ";
133 inl.position.Print(out, code);
134 }
135 }
136
137 } // namespace internal
138 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698