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

Unified Diff: runtime/vm/kernel_binary_flowgraph.cc

Issue 2790073004: Restructure the Kernel string table. (Closed)
Patch Set: Incorporate review comments. Created 3 years, 8 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/kernel_binary_flowgraph.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/kernel_binary_flowgraph.cc
diff --git a/runtime/vm/kernel_binary_flowgraph.cc b/runtime/vm/kernel_binary_flowgraph.cc
index 3fdd7a26aba7510267d8ee8b9e0e6a81561bb2f8..671b8d6b0cd672d971b30ef0a8a20ddc1d3dd0f1 100644
--- a/runtime/vm/kernel_binary_flowgraph.cc
+++ b/runtime/vm/kernel_binary_flowgraph.cc
@@ -307,33 +307,28 @@ Fragment StreamingFlowGraphBuilder::BuildAt(intptr_t kernel_offset) {
return Fragment();
}
-intptr_t StreamingFlowGraphBuilder::GetStringTableOffset(intptr_t index) {
- if (string_table_offsets_ != NULL && string_table_entries_read_ > index) {
- return string_table_offsets_[index];
- }
-
- intptr_t saved_offset = ReaderOffset();
- if (string_table_offsets_ == NULL) {
- reader_->set_offset(4); // Skip kMagicProgramFile - now at string table.
- string_table_size_ = ReadListLength();
- string_table_offsets_ = new intptr_t[string_table_size_];
- string_table_offsets_[0] = ReaderOffset();
- string_table_entries_read_ = 1;
- }
+intptr_t StreamingFlowGraphBuilder::GetStringOffset(intptr_t index) {
+ if (string_offsets_ == NULL) {
+ intptr_t saved_offset = ReaderOffset();
+ reader_->set_offset(4); // Skip kMagicProgramFile to the string table.
+ string_offset_count_ = ReadListLength() + 1;
+ string_offsets_ = new intptr_t[string_offset_count_];
+
+ // Build a table of the 0-based string start and end offsets.
+ string_offsets_[0] = 0;
+ for (intptr_t i = 1; i < string_offset_count_; ++i) {
+ string_offsets_[i] = ReadUInt();
+ }
+ // And adjust the offsets now that we know the start offset of the first
+ // string relative to the start of the binary.
+ intptr_t base = ReaderOffset();
+ for (intptr_t i = 0; i < string_offset_count_; ++i) {
+ string_offsets_[i] += base;
+ }
- ASSERT(string_table_size_ > index);
- --string_table_entries_read_;
- reader_->set_offset(string_table_offsets_[string_table_entries_read_]);
- for (; string_table_entries_read_ < index; ++string_table_entries_read_) {
- string_table_offsets_[string_table_entries_read_] = ReaderOffset();
- uint32_t bytes = ReadUInt();
- SkipBytes(bytes);
+ SetOffset(saved_offset);
}
- string_table_offsets_[string_table_entries_read_] = ReaderOffset();
- ++string_table_entries_read_;
-
- SetOffset(saved_offset);
- return string_table_offsets_[index];
+ return string_offsets_[index];
}
CanonicalName* StreamingFlowGraphBuilder::GetCanonicalName(intptr_t index) {
@@ -348,21 +343,21 @@ CanonicalName* StreamingFlowGraphBuilder::GetCanonicalName(intptr_t index) {
if (canonical_names_ == NULL) {
// Find offset from where to read canonical names table.
- // First skip the string table:
- // Get first string to make sure we have the table size, get last string and
- // read it to get past the string table.
- // Note that this will also cache all string positions.
- GetStringTableOffset(0);
- SetOffset(GetStringTableOffset(string_table_size_ - 1));
- uint32_t bytes = ReadUInt();
- SkipBytes(bytes);
+ // First skip the string table. The last offset is the end offset of the
+ // last string.
+ if (string_offsets_ == NULL) {
+ // Ensure that the length and all the offsets are available.
+ GetStringOffset(0);
+ }
+ SetOffset(GetStringOffset(string_offset_count_ - 1));
- // Another string table (source URIs)
+ // There is another string table for the source URIs. Skip it as well.
intptr_t list_length = ReadListLength();
+ intptr_t end_offset = 0;
for (intptr_t i = 0; i < list_length; ++i) {
- uint32_t bytes = ReadUInt();
- SkipBytes(bytes);
+ end_offset = ReadUInt();
}
+ SkipBytes(end_offset);
// Source code table
for (intptr_t i = 0; i < list_length; ++i) {
@@ -450,37 +445,22 @@ ParsedFunction* StreamingFlowGraphBuilder::parsed_function() {
return flow_graph_builder_->parsed_function_;
}
-dart::String& StreamingFlowGraphBuilder::DartSymbol(intptr_t str_index) {
- intptr_t saved_offset = ReaderOffset();
-
- SetOffset(GetStringTableOffset(str_index));
- uint32_t bytes = ReadUInt();
- const uint8_t* data = &reader_->buffer()[ReaderOffset()];
-
- SetOffset(saved_offset);
- return H.DartSymbol(data, bytes);
+dart::String& StreamingFlowGraphBuilder::DartSymbol(intptr_t index) {
+ intptr_t start = GetStringOffset(index);
+ intptr_t end = GetStringOffset(index + 1);
+ return H.DartSymbol(reader_->buffer() + start, end - start);
}
-dart::String& StreamingFlowGraphBuilder::DartString(intptr_t str_index) {
- intptr_t saved_offset = ReaderOffset();
-
- SetOffset(GetStringTableOffset(str_index));
- uint32_t bytes = ReadUInt();
- const uint8_t* data = &reader_->buffer()[ReaderOffset()];
-
- SetOffset(saved_offset);
- return H.DartString(data, bytes);
+dart::String& StreamingFlowGraphBuilder::DartString(intptr_t index) {
+ intptr_t start = GetStringOffset(index);
+ intptr_t end = GetStringOffset(index + 1);
+ return H.DartString(reader_->buffer() + start, end - start);
}
-String* StreamingFlowGraphBuilder::KernelString(intptr_t str_index) {
- intptr_t savedOffset = ReaderOffset();
-
- SetOffset(GetStringTableOffset(str_index));
- uint32_t bytes = ReadUInt();
- const uint8_t* data = &reader_->buffer()[ReaderOffset()];
-
- SetOffset(savedOffset);
- return new String(data, bytes);
+String* StreamingFlowGraphBuilder::KernelString(intptr_t index) {
+ intptr_t start = GetStringOffset(index);
+ intptr_t end = GetStringOffset(index + 1);
+ return new String(reader_->buffer() + start, end - start);
}
Fragment StreamingFlowGraphBuilder::DebugStepCheck(TokenPosition position) {
« no previous file with comments | « runtime/vm/kernel_binary_flowgraph.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698