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

Unified Diff: runtime/vm/object.cc

Issue 2993253002: Make line-starts 32-bits TypedData instead of Array of smis.
Patch Set: Created 3 years, 4 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/raw_object.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 e2d2e89336fffbd7638bbb77c3fd3732519c4698..9f1f2ad5dee89b9754bf0928d856bcc07de3b54a 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -9023,27 +9023,25 @@ RawGrowableObjectArray* Script::GenerateLineNumberArray() const {
Smi& value = Smi::Handle(zone);
if (kind() == RawScript::kKernelTag) {
- const Array& line_starts_array = Array::Handle(line_starts());
- if (line_starts_array.IsNull()) {
+ const TypedData& line_starts_data = TypedData::Handle(line_starts());
+ if (line_starts_data.IsNull()) {
// Scripts in the AOT snapshot do not have a line starts array.
// A well-formed line number array has a leading null.
info.Add(line_separator); // New line.
return info.raw();
}
- intptr_t line_count = line_starts_array.Length();
+ intptr_t line_count = line_starts_data.Length();
ASSERT(line_count > 0);
const Array& debug_positions_array = Array::Handle(debug_positions());
intptr_t token_count = debug_positions_array.Length();
int token_index = 0;
for (int line_index = 0; line_index < line_count; ++line_index) {
- value ^= line_starts_array.At(line_index);
- intptr_t start = value.Value();
+ intptr_t start = line_starts_data.GetUint32(line_index << 2);
// Output the rest of the tokens if we have no next line.
intptr_t end = TokenPosition::kMaxSourcePos;
if (line_index + 1 < line_count) {
- value ^= line_starts_array.At(line_index + 1);
- end = value.Value();
+ end = line_starts_data.GetUint32((line_index + 1) << 2);
}
bool first = true;
while (token_index < token_count) {
@@ -9175,7 +9173,7 @@ void Script::set_source(const String& value) const {
StorePointer(&raw_ptr()->source_, value.raw());
}
-void Script::set_line_starts(const Array& value) const {
+void Script::set_line_starts(const TypedData& value) const {
StorePointer(&raw_ptr()->line_starts_, value.raw());
}
@@ -9198,7 +9196,7 @@ RawArray* Script::yield_positions() const {
return raw_ptr()->yield_positions_;
}
-RawArray* Script::line_starts() const {
+RawTypedData* Script::line_starts() const {
return raw_ptr()->line_starts_;
}
@@ -9263,40 +9261,45 @@ intptr_t Script::GetTokenLineUsingLineStarts(
return 0;
}
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()) {
+ TypedData& line_starts_data = TypedData::Handle(zone, line_starts());
+ if (line_starts_data.IsNull()) {
ASSERT(kind() != RawScript::kKernelTag);
- GrowableObjectArray& line_starts_list =
- GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
+ GrowableArray<intptr_t> line_starts_list(10);
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);
+ intptr_t token_pos = 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);
+ token_pos = tkit.CurrentPosition().value() + 1;
line_starts_list.Add(token_pos);
}
tkit.Advance();
}
- line_starts_array = Array::MakeFixedLength(line_starts_list);
- set_line_starts(line_starts_array);
+
+ intptr_t length = line_starts_list.length();
+ line_starts_data =
+ TypedData::New(kTypedDataUint32ArrayCid, length, Heap::kOld);
+ for (intptr_t i = 0; i < length; ++i) {
+ line_starts_data.SetUint32(i << 2, line_starts_list.At(i));
+ }
+
+ set_line_starts(line_starts_data);
}
- ASSERT(line_starts_array.Length() > 0);
+ ASSERT(line_starts_data.Length() > 0);
intptr_t offset = target_token_pos.Pos();
intptr_t min = 0;
- intptr_t max = line_starts_array.Length() - 1;
+ intptr_t max = line_starts_data.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) {
+ intptr_t value = line_starts_data.GetUint32(midpoint << 2);
+ if (value > offset) {
max = midpoint - 1;
} else {
min = midpoint;
@@ -9313,8 +9316,8 @@ void Script::GetTokenLocation(TokenPosition token_pos,
Zone* zone = Thread::Current()->zone();
if (kind() == RawScript::kKernelTag) {
- const Array& line_starts_array = Array::Handle(zone, line_starts());
- if (line_starts_array.IsNull()) {
+ const TypedData& line_starts_data = TypedData::Handle(zone, line_starts());
+ if (line_starts_data.IsNull()) {
// Scripts in the AOT snapshot do not have a line starts array.
*line = -1;
if (column != NULL) {
@@ -9325,27 +9328,25 @@ void Script::GetTokenLocation(TokenPosition token_pos,
}
return;
}
- ASSERT(line_starts_array.Length() > 0);
+ ASSERT(line_starts_data.Length() > 0);
intptr_t offset = token_pos.value();
intptr_t min = 0;
- intptr_t max = line_starts_array.Length() - 1;
+ intptr_t max = line_starts_data.Length() - 1;
// Binary search to find the line containing this offset.
- Smi& smi = Smi::Handle(zone);
while (min < max) {
intptr_t midpoint = (max - min + 1) / 2 + min;
-
- smi ^= line_starts_array.At(midpoint);
- if (smi.Value() > offset) {
+ intptr_t value = line_starts_data.GetUint32(midpoint << 2);
+ if (value > offset) {
max = midpoint - 1;
} else {
min = midpoint;
}
}
*line = min + 1; // Line numbers start at 1.
- smi ^= line_starts_array.At(min);
+ intptr_t value = line_starts_data.GetUint32(min << 2);
if (column != NULL) {
- *column = offset - smi.Value() + 1;
+ *column = offset - value + 1;
}
if (token_len != NULL) {
// We don't explicitly save this data: Load the source
@@ -9417,20 +9418,19 @@ void Script::TokenRangeAtLine(intptr_t line_number,
ASSERT(line_number > 0);
if (kind() == RawScript::kKernelTag) {
- const Array& line_starts_array = Array::Handle(line_starts());
- if (line_starts_array.IsNull()) {
+ const TypedData& line_starts_data = TypedData::Handle(line_starts());
+ if (line_starts_data.IsNull()) {
// Scripts in the AOT snapshot do not have a line starts array.
*first_token_index = TokenPosition::kNoSource;
*last_token_index = TokenPosition::kNoSource;
return;
}
- ASSERT(line_starts_array.Length() >= line_number);
- Smi& value = Smi::Handle();
- value ^= line_starts_array.At(line_number - 1);
- *first_token_index = TokenPosition(value.Value());
- if (line_starts_array.Length() > line_number) {
- value ^= line_starts_array.At(line_number);
- *last_token_index = TokenPosition(value.Value() - 1);
+ ASSERT(line_starts_data.Length() >= line_number);
+ intptr_t value = line_starts_data.GetUint32((line_number - 1) << 2);
+ *first_token_index = TokenPosition(value);
+ if (line_starts_data.Length() > line_number) {
+ value = line_starts_data.GetUint32(line_number << 2);
+ *last_token_index = TokenPosition(value - 1);
} else {
// Length of source is last possible token in this script.
*last_token_index = TokenPosition(String::Handle(Source()).Length());
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698