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

Unified Diff: runtime/vm/kernel_binary.cc

Issue 2820363002: Move Kernel strings into the VM's heap. (Closed)
Patch Set: 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
Index: runtime/vm/kernel_binary.cc
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc
index f71b9283ec2efad199802524893c66b6da405a11..f7f3e8d1fe4d3f5875b4db72c9186ab018233d61 100644
--- a/runtime/vm/kernel_binary.cc
+++ b/runtime/vm/kernel_binary.cc
@@ -106,15 +106,6 @@ class DowncastReader {
};
-class StringImpl {
- public:
- static String* ReadFrom(Reader* reader) {
- TRACE_READ_OFFSET();
- return String::ReadFromImpl(reader);
- }
-};
-
-
class VariableDeclarationImpl {
public:
static VariableDeclaration* ReadFrom(Reader* reader) {
@@ -130,15 +121,12 @@ String* String::ReadFrom(Reader* reader) {
}
-String* String::ReadFromImpl(Reader* reader) {
- TRACE_READ_OFFSET();
- intptr_t size = reader->ReadUInt();
- return ReadRaw(reader, size);
-}
-
-
String* String::ReadRaw(Reader* reader, intptr_t size) {
- return new String(reader->Consume(size), size);
+ ASSERT(reader->string_data_offset() >= 0);
+ String* result =
+ new String(reader->offset() - reader->string_data_offset(), size);
+ reader->Consume(size);
+ return result;
}
@@ -146,11 +134,12 @@ void StringTable::ReadFrom(Reader* reader) {
TRACE_READ_OFFSET();
// Read the table of end offsets.
intptr_t length = reader->ReadUInt();
- int* end_offsets = new int[length];
+ intptr_t* end_offsets = new intptr_t[length];
for (intptr_t i = 0; i < length; ++i) {
end_offsets[i] = reader->ReadUInt();
}
// Read the UTF-8 encoded strings.
+ reader->MarkStringDataOffset();
strings_.EnsureInitialized(length);
intptr_t start_offset = 0;
for (intptr_t i = 0; i < length; ++i) {
@@ -163,22 +152,48 @@ void StringTable::ReadFrom(Reader* reader) {
void SourceTable::ReadFrom(Reader* reader) {
- size_ = reader->helper()->program()->source_uri_table().strings().length();
- source_code_ = new String*[size_];
- line_starts_ = new intptr_t*[size_];
- line_count_ = new intptr_t[size_];
+ size_ = reader->ReadUInt();
+ sources_ = new Source[size_];
+
+ // Build a table of the URI offsets.
+ intptr_t* end_offsets = new intptr_t[size_];
for (intptr_t i = 0; i < size_; ++i) {
- source_code_[i] = StringImpl::ReadFrom(reader);
+ end_offsets[i] = reader->ReadUInt();
+ }
+
+ // Read the URI strings.
+ intptr_t start_offset = 0;
+ for (intptr_t i = 0; i < size_; ++i) {
+ intptr_t length = end_offsets[i] - start_offset;
+ uint8_t* buffer = new uint8_t[length];
+ memmove(buffer, reader->buffer() + reader->offset(), length);
+ reader->Consume(length);
+
+ sources_[i].uri_ = buffer;
+ sources_[i].uri_size_ = length;
+
+ start_offset = end_offsets[i];
+ }
+
+ // Read the source code strings and line starts.
+ for (intptr_t i = 0; i < size_; ++i) {
+ intptr_t length = reader->ReadUInt();
+ uint8_t* buffer = new uint8_t[length];
jensj 2017/04/19 06:41:01 nit: "buffer" is probably not the greatest name.
Kevin Millikin (Google) 2017/04/21 08:22:11 OK. string_buffer.
+ memmove(buffer, reader->buffer() + reader->offset(), length);
+ reader->Consume(length);
intptr_t line_count = reader->ReadUInt();
intptr_t* line_starts = new intptr_t[line_count];
- line_count_[i] = line_count;
intptr_t previous_line_start = 0;
for (intptr_t j = 0; j < line_count; ++j) {
intptr_t line_start = reader->ReadUInt() + previous_line_start;
line_starts[j] = line_start;
previous_line_start = line_start;
}
- line_starts_[i] = line_starts;
+
+ sources_[i].source_code_ = buffer;
+ sources_[i].source_code_size_ = length;
+ sources_[i].line_starts_ = line_starts;
+ sources_[i].line_count_ = line_count;
}
}
@@ -1365,7 +1380,7 @@ FunctionDeclaration* FunctionDeclaration::ReadFrom(Reader* reader) {
Name* Name::ReadFrom(Reader* reader) {
String* name = Reference::ReadStringFrom(reader);
- if (name->size() >= 1 && name->buffer()[0] == '_') {
+ if (name->size() >= 1 && reader->CharacterAt(name, 0) == '_') {
CanonicalName* library_reference = reader->ReadCanonicalNameReference();
return new Name(name, library_reference);
} else {
@@ -1491,7 +1506,8 @@ Program* Program::ReadFrom(Reader* reader) {
reader->helper()->set_program(program);
program->string_table_.ReadFrom(reader);
- program->source_uri_table_.ReadFrom(reader);
+ program->string_data_offset_ = reader->string_data_offset();
+ ASSERT(program->string_data_offset_ >= 0);
program->source_table_.ReadFrom(reader);
int canonical_names = reader->ReadUInt();

Powered by Google App Engine
This is Rietveld 408576698