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

Side by Side Diff: runtime/vm/kernel_binary.cc

Issue 2820363002: Move Kernel strings into the VM's heap. (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 unified diff | Download patch
« no previous file with comments | « runtime/vm/kernel_binary.h ('k') | runtime/vm/kernel_binary_flowgraph.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 #if !defined(DART_PRECOMPILED_RUNTIME) 4 #if !defined(DART_PRECOMPILED_RUNTIME)
5 5
6 #include "vm/kernel_binary.h" 6 #include "vm/kernel_binary.h"
7 #include "platform/globals.h" 7 #include "platform/globals.h"
8 #include "vm/flags.h" 8 #include "vm/flags.h"
9 #include "vm/growable_array.h" 9 #include "vm/growable_array.h"
10 #include "vm/kernel.h" 10 #include "vm/kernel.h"
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 template <typename B, typename S> 99 template <typename B, typename S>
100 class DowncastReader { 100 class DowncastReader {
101 public: 101 public:
102 static S* ReadFrom(Reader* reader) { 102 static S* ReadFrom(Reader* reader) {
103 TRACE_READ_OFFSET(); 103 TRACE_READ_OFFSET();
104 return S::Cast(B::ReadFrom(reader)); 104 return S::Cast(B::ReadFrom(reader));
105 } 105 }
106 }; 106 };
107 107
108 108
109 class StringImpl {
110 public:
111 static String* ReadFrom(Reader* reader) {
112 TRACE_READ_OFFSET();
113 return String::ReadFromImpl(reader);
114 }
115 };
116
117
118 class VariableDeclarationImpl { 109 class VariableDeclarationImpl {
119 public: 110 public:
120 static VariableDeclaration* ReadFrom(Reader* reader) { 111 static VariableDeclaration* ReadFrom(Reader* reader) {
121 TRACE_READ_OFFSET(); 112 TRACE_READ_OFFSET();
122 return VariableDeclaration::ReadFromImpl(reader, false); 113 return VariableDeclaration::ReadFromImpl(reader, false);
123 } 114 }
124 }; 115 };
125 116
126 117
127 String* String::ReadFrom(Reader* reader) { 118 String* String::ReadFrom(Reader* reader) {
128 TRACE_READ_OFFSET(); 119 TRACE_READ_OFFSET();
129 return Reference::ReadStringFrom(reader); 120 return Reference::ReadStringFrom(reader);
130 } 121 }
131 122
132 123
133 String* String::ReadFromImpl(Reader* reader) {
134 TRACE_READ_OFFSET();
135 intptr_t size = reader->ReadUInt();
136 return ReadRaw(reader, size);
137 }
138
139
140 String* String::ReadRaw(Reader* reader, intptr_t size) { 124 String* String::ReadRaw(Reader* reader, intptr_t size) {
141 return new String(reader->Consume(size), size); 125 ASSERT(reader->string_data_offset() >= 0);
126 String* result =
127 new String(reader->offset() - reader->string_data_offset(), size);
128 reader->Consume(size);
129 return result;
142 } 130 }
143 131
144 132
145 void StringTable::ReadFrom(Reader* reader) { 133 void StringTable::ReadFrom(Reader* reader) {
146 TRACE_READ_OFFSET(); 134 TRACE_READ_OFFSET();
147 // Read the table of end offsets. 135 // Read the table of end offsets.
148 intptr_t length = reader->ReadUInt(); 136 intptr_t length = reader->ReadUInt();
149 int* end_offsets = new int[length]; 137 intptr_t* end_offsets = new intptr_t[length];
150 for (intptr_t i = 0; i < length; ++i) { 138 for (intptr_t i = 0; i < length; ++i) {
151 end_offsets[i] = reader->ReadUInt(); 139 end_offsets[i] = reader->ReadUInt();
152 } 140 }
153 // Read the UTF-8 encoded strings. 141 // Read the UTF-8 encoded strings.
142 reader->MarkStringDataOffset();
154 strings_.EnsureInitialized(length); 143 strings_.EnsureInitialized(length);
155 intptr_t start_offset = 0; 144 intptr_t start_offset = 0;
156 for (intptr_t i = 0; i < length; ++i) { 145 for (intptr_t i = 0; i < length; ++i) {
157 ASSERT(strings_[i] == NULL); 146 ASSERT(strings_[i] == NULL);
158 strings_[i] = String::ReadRaw(reader, end_offsets[i] - start_offset); 147 strings_[i] = String::ReadRaw(reader, end_offsets[i] - start_offset);
159 start_offset = end_offsets[i]; 148 start_offset = end_offsets[i];
160 } 149 }
161 delete[] end_offsets; 150 delete[] end_offsets;
162 } 151 }
163 152
164 153
165 void SourceTable::ReadFrom(Reader* reader) { 154 void SourceTable::ReadFrom(Reader* reader) {
166 size_ = reader->helper()->program()->source_uri_table().strings().length(); 155 size_ = reader->ReadUInt();
167 source_code_ = new String*[size_]; 156 sources_ = new Source[size_];
168 line_starts_ = new intptr_t*[size_]; 157
169 line_count_ = new intptr_t[size_]; 158 // Build a table of the URI offsets.
159 intptr_t* end_offsets = new intptr_t[size_];
170 for (intptr_t i = 0; i < size_; ++i) { 160 for (intptr_t i = 0; i < size_; ++i) {
171 source_code_[i] = StringImpl::ReadFrom(reader); 161 end_offsets[i] = reader->ReadUInt();
162 }
163
164 // Read the URI strings.
165 intptr_t start_offset = 0;
166 for (intptr_t i = 0; i < size_; ++i) {
167 intptr_t length = end_offsets[i] - start_offset;
168 uint8_t* buffer = new uint8_t[length];
169 memmove(buffer, reader->buffer() + reader->offset(), length);
170 reader->Consume(length);
171
172 sources_[i].uri_ = buffer;
173 sources_[i].uri_size_ = length;
174
175 start_offset = end_offsets[i];
176 }
177
178 // Read the source code strings and line starts.
179 for (intptr_t i = 0; i < size_; ++i) {
180 intptr_t length = reader->ReadUInt();
181 uint8_t* string_buffer = new uint8_t[length];
182 memmove(string_buffer, reader->buffer() + reader->offset(), length);
183 reader->Consume(length);
172 intptr_t line_count = reader->ReadUInt(); 184 intptr_t line_count = reader->ReadUInt();
173 intptr_t* line_starts = new intptr_t[line_count]; 185 intptr_t* line_starts = new intptr_t[line_count];
174 line_count_[i] = line_count;
175 intptr_t previous_line_start = 0; 186 intptr_t previous_line_start = 0;
176 for (intptr_t j = 0; j < line_count; ++j) { 187 for (intptr_t j = 0; j < line_count; ++j) {
177 intptr_t line_start = reader->ReadUInt() + previous_line_start; 188 intptr_t line_start = reader->ReadUInt() + previous_line_start;
178 line_starts[j] = line_start; 189 line_starts[j] = line_start;
179 previous_line_start = line_start; 190 previous_line_start = line_start;
180 } 191 }
181 line_starts_[i] = line_starts; 192
193 sources_[i].source_code_ = string_buffer;
194 sources_[i].source_code_size_ = length;
195 sources_[i].line_starts_ = line_starts;
196 sources_[i].line_count_ = line_count;
182 } 197 }
183 } 198 }
184 199
185 200
186 Library* Library::ReadFrom(Reader* reader) { 201 Library* Library::ReadFrom(Reader* reader) {
187 TRACE_READ_OFFSET(); 202 TRACE_READ_OFFSET();
188 int flags = reader->ReadFlags(); 203 int flags = reader->ReadFlags();
189 ASSERT(flags == 0); // external libraries not supported 204 ASSERT(flags == 0); // external libraries not supported
190 kernel_data_ = reader->buffer(); 205 kernel_data_ = reader->buffer();
191 kernel_data_size_ = reader->size(); 206 kernel_data_size_ = reader->size();
(...skipping 1166 matching lines...) Expand 10 before | Expand all | Expand 10 after
1358 decl->position_ = reader->ReadPosition(); 1373 decl->position_ = reader->ReadPosition();
1359 decl->variable_ = VariableDeclaration::ReadFromImpl(reader, false); 1374 decl->variable_ = VariableDeclaration::ReadFromImpl(reader, false);
1360 VariableScope<ReaderHelper> parameters(reader->helper()); 1375 VariableScope<ReaderHelper> parameters(reader->helper());
1361 decl->function_ = FunctionNode::ReadFrom(reader); 1376 decl->function_ = FunctionNode::ReadFrom(reader);
1362 return decl; 1377 return decl;
1363 } 1378 }
1364 1379
1365 1380
1366 Name* Name::ReadFrom(Reader* reader) { 1381 Name* Name::ReadFrom(Reader* reader) {
1367 String* name = Reference::ReadStringFrom(reader); 1382 String* name = Reference::ReadStringFrom(reader);
1368 if (name->size() >= 1 && name->buffer()[0] == '_') { 1383 if (name->size() >= 1 && reader->CharacterAt(name, 0) == '_') {
1369 CanonicalName* library_reference = reader->ReadCanonicalNameReference(); 1384 CanonicalName* library_reference = reader->ReadCanonicalNameReference();
1370 return new Name(name, library_reference); 1385 return new Name(name, library_reference);
1371 } else { 1386 } else {
1372 return new Name(name, NULL); 1387 return new Name(name, NULL);
1373 } 1388 }
1374 } 1389 }
1375 1390
1376 1391
1377 DartType* DartType::ReadFrom(Reader* reader) { 1392 DartType* DartType::ReadFrom(Reader* reader) {
1378 TRACE_READ_OFFSET(); 1393 TRACE_READ_OFFSET();
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1484 Program* Program::ReadFrom(Reader* reader) { 1499 Program* Program::ReadFrom(Reader* reader) {
1485 TRACE_READ_OFFSET(); 1500 TRACE_READ_OFFSET();
1486 uint32_t magic = reader->ReadUInt32(); 1501 uint32_t magic = reader->ReadUInt32();
1487 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); 1502 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier");
1488 1503
1489 Program* program = new Program(); 1504 Program* program = new Program();
1490 program->canonical_name_root_ = CanonicalName::NewRoot(); 1505 program->canonical_name_root_ = CanonicalName::NewRoot();
1491 reader->helper()->set_program(program); 1506 reader->helper()->set_program(program);
1492 1507
1493 program->string_table_.ReadFrom(reader); 1508 program->string_table_.ReadFrom(reader);
1494 program->source_uri_table_.ReadFrom(reader); 1509 program->string_data_offset_ = reader->string_data_offset();
1510 ASSERT(program->string_data_offset_ >= 0);
1495 program->source_table_.ReadFrom(reader); 1511 program->source_table_.ReadFrom(reader);
1496 1512
1497 int canonical_names = reader->ReadUInt(); 1513 int canonical_names = reader->ReadUInt();
1498 reader->helper()->SetCanonicalNameCount(canonical_names); 1514 reader->helper()->SetCanonicalNameCount(canonical_names);
1499 for (int i = 0; i < canonical_names; ++i) { 1515 for (int i = 0; i < canonical_names; ++i) {
1500 int biased_parent_index = reader->ReadUInt(); 1516 int biased_parent_index = reader->ReadUInt();
1501 CanonicalName* parent; 1517 CanonicalName* parent;
1502 if (biased_parent_index != 0) { 1518 if (biased_parent_index != 0) {
1503 parent = reader->helper()->GetCanonicalName(biased_parent_index - 1); 1519 parent = reader->helper()->GetCanonicalName(biased_parent_index - 1);
1504 } else { 1520 } else {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1563 1579
1564 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, 1580 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer,
1565 intptr_t buffer_length) { 1581 intptr_t buffer_length) {
1566 kernel::Reader reader(buffer, buffer_length); 1582 kernel::Reader reader(buffer, buffer_length);
1567 return kernel::Program::ReadFrom(&reader); 1583 return kernel::Program::ReadFrom(&reader);
1568 } 1584 }
1569 1585
1570 1586
1571 } // namespace dart 1587 } // namespace dart
1572 #endif // !defined(DART_PRECOMPILED_RUNTIME) 1588 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« no previous file with comments | « runtime/vm/kernel_binary.h ('k') | runtime/vm/kernel_binary_flowgraph.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698