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

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 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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698