| 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());
|
|
|