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

Unified Diff: runtime/vm/object.cc

Issue 2687143005: Include metadata in AOT to expand inline frames in stack traces and provide line numbers. (Closed)
Patch Set: . Created 3 years, 10 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/precompiler.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.cc
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 41d38171d1010be385df811a97fff0c8a105c989..8a61e4ca56842e6df2e0cc1d1cda00478a59ccec 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -9077,6 +9077,54 @@ void Script::SetLocationOffset(intptr_t line_offset,
}
+// Specialized for AOT compilation, which does this lookup for every token
+// position that could be part of a stack trace.
+intptr_t Script::GetTokenLineUsingLineStarts(
+ TokenPosition target_token_pos) const {
+ Zone* zone = Thread::Current()->zone();
+ Array& line_starts_array = Array::Handle(zone, line_starts());
+ Smi& token_pos = Smi::Handle(zone);
+ if (line_starts_array.IsNull()) {
+ ASSERT(kind() != RawScript::kKernelTag);
+ GrowableObjectArray& line_starts_list =
+ GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
+ const TokenStream& tkns = TokenStream::Handle(zone, tokens());
+ TokenStream::Iterator tkit(zone, tkns, TokenPosition::kMinSource,
+ TokenStream::Iterator::kAllTokens);
+ intptr_t cur_line = line_offset() + 1;
+ token_pos = Smi::New(0);
+ line_starts_list.Add(token_pos);
+ while (tkit.CurrentTokenKind() != Token::kEOS) {
+ if (tkit.CurrentTokenKind() == Token::kNEWLINE) {
+ cur_line++;
+ token_pos = Smi::New(tkit.CurrentPosition().value() + 1);
+ line_starts_list.Add(token_pos);
+ }
+ tkit.Advance();
+ }
+ line_starts_array = Array::MakeArray(line_starts_list);
+ set_line_starts(line_starts_array);
+ }
+
+ ASSERT(line_starts_array.Length() > 0);
+ intptr_t offset = target_token_pos.value();
+ intptr_t min = 0;
+ intptr_t max = line_starts_array.Length() - 1;
+
+ // Binary search to find the line containing this offset.
+ while (min < max) {
+ int midpoint = (max - min + 1) / 2 + min;
+ token_pos ^= line_starts_array.At(midpoint);
+ if (token_pos.Value() > offset) {
+ max = midpoint - 1;
+ } else {
+ min = midpoint;
+ }
+ }
+ return min + 1; // Line numbers start at 1.
+}
+
+
void Script::GetTokenLocation(TokenPosition token_pos,
intptr_t* line,
intptr_t* column,
@@ -9085,7 +9133,7 @@ void Script::GetTokenLocation(TokenPosition token_pos,
Zone* zone = Thread::Current()->zone();
if (kind() == RawScript::kKernelTag) {
- const Array& line_starts_array = Array::Handle(line_starts());
+ const Array& line_starts_array = Array::Handle(zone, line_starts());
if (line_starts_array.IsNull()) {
// Scripts in the AOT snapshot do not have a line starts array.
*line = -1;
@@ -9099,13 +9147,13 @@ void Script::GetTokenLocation(TokenPosition token_pos,
}
ASSERT(line_starts_array.Length() > 0);
intptr_t offset = token_pos.value();
- int min = 0;
- int max = line_starts_array.Length() - 1;
+ intptr_t min = 0;
+ intptr_t max = line_starts_array.Length() - 1;
// Binary search to find the line containing this offset.
- Smi& smi = Smi::Handle();
+ Smi& smi = Smi::Handle(zone);
while (min < max) {
- int midpoint = (max - min + 1) / 2 + min;
+ intptr_t midpoint = (max - min + 1) / 2 + min;
smi ^= line_starts_array.At(midpoint);
if (smi.Value() > offset) {
@@ -9114,7 +9162,7 @@ void Script::GetTokenLocation(TokenPosition token_pos,
min = midpoint;
}
}
- *line = min + 1;
+ *line = min + 1; // Line numbers start at 1.
smi ^= line_starts_array.At(min);
if (column != NULL) {
*column = offset - smi.Value() + 1;
@@ -14087,21 +14135,13 @@ intptr_t Code::GetPrologueOffset() const {
RawArray* Code::inlined_id_to_function() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
- return Array::null();
-#else
return raw_ptr()->inlined_id_to_function_;
-#endif
}
void Code::set_inlined_id_to_function(const Array& value) const {
-#if defined(DART_PRECOMPILED_RUNTIME)
- UNREACHABLE();
-#else
ASSERT(value.IsOld());
StorePointer(&raw_ptr()->inlined_id_to_function_, value.raw());
-#endif
}
@@ -14466,8 +14506,8 @@ void Code::GetInlinedFunctionsAtInstruction(
GrowableArray<TokenPosition>* token_positions) const {
const CodeSourceMap& map = CodeSourceMap::Handle(code_source_map());
if (map.IsNull()) {
- // Stub code.
- return;
+ ASSERT(!IsFunctionCode());
+ return; // VM stub or allocation stub.
}
const Array& id_map = Array::Handle(inlined_id_to_function());
const Function& root = Function::Handle(function());
@@ -22367,11 +22407,15 @@ static void PrintStackTraceFrame(Zone* zone,
zone, script.IsNull() ? String::New("Kernel") : script.url());
intptr_t line = -1;
intptr_t column = -1;
- if (!script.IsNull() && token_pos.IsReal()) {
- if (script.HasSource() || script.kind() == RawScript::kKernelTag) {
- script.GetTokenLocation(token_pos, &line, &column);
- } else {
- script.GetTokenLocation(token_pos, &line, NULL);
+ if (FLAG_precompiled_mode) {
+ line = token_pos.value();
+ } else {
+ if (!script.IsNull() && token_pos.IsReal()) {
+ if (script.HasSource() || script.kind() == RawScript::kKernelTag) {
+ script.GetTokenLocation(token_pos, &line, &column);
+ } else {
+ script.GetTokenLocation(token_pos, &line, NULL);
+ }
}
}
if (column >= 0) {
@@ -22420,8 +22464,7 @@ const char* StackTrace::ToCStringInternal(const StackTrace& stack_trace_in,
} else {
ASSERT(code.IsFunctionCode());
intptr_t pc_offset = Smi::Value(stack_trace.PcOffsetAtFrame(i));
- if (code.is_optimized() && stack_trace.expand_inlined() &&
- !FLAG_precompiled_mode) {
+ if (code.is_optimized() && stack_trace.expand_inlined()) {
code.GetInlinedFunctionsAtReturnAddress(pc_offset, &inlined_functions,
&inlined_token_positions);
ASSERT(inlined_functions.length() >= 1);
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/precompiler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698