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

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

Issue 2852943003: Move the Kernel string offsets into the VM's heap. (Closed)
Patch Set: Incorporate review comments. Created 3 years, 7 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.h » ('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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 reader->helper()->type_parameters().Push(parameter); 80 reader->helper()->type_parameters().Push(parameter);
81 } 81 }
82 82
83 // Read all [TypeParameter]s and their bounds. 83 // Read all [TypeParameter]s and their bounds.
84 for (intptr_t i = 0; i < length; i++) { 84 for (intptr_t i = 0; i < length; i++) {
85 (*this)[i]->ReadFrom(reader); 85 (*this)[i]->ReadFrom(reader);
86 } 86 }
87 } 87 }
88 88
89 89
90 template <typename A, typename B> 90 NamedParameter* NamedParameter::ReadFrom(Reader* reader) {
91 Tuple<A, B>* Tuple<A, B>::ReadFrom(Reader* reader) {
92 TRACE_READ_OFFSET(); 91 TRACE_READ_OFFSET();
93 A* first = A::ReadFrom(reader); 92 intptr_t name_index = reader->ReadUInt();
94 B* second = B::ReadFrom(reader); 93 DartType* type = DartType::ReadFrom(reader);
95 return new Tuple<A, B>(first, second); 94 return new NamedParameter(name_index, type);
96 } 95 }
97 96
98 97
99 template <typename B, typename S> 98 template <typename B, typename S>
100 class DowncastReader { 99 class DowncastReader {
101 public: 100 public:
102 static S* ReadFrom(Reader* reader) { 101 static S* ReadFrom(Reader* reader) {
103 TRACE_READ_OFFSET(); 102 TRACE_READ_OFFSET();
104 return S::Cast(B::ReadFrom(reader)); 103 return S::Cast(B::ReadFrom(reader));
105 } 104 }
106 }; 105 };
107 106
108 107
109 class VariableDeclarationImpl { 108 class VariableDeclarationImpl {
110 public: 109 public:
111 static VariableDeclaration* ReadFrom(Reader* reader) { 110 static VariableDeclaration* ReadFrom(Reader* reader) {
112 TRACE_READ_OFFSET(); 111 TRACE_READ_OFFSET();
113 return VariableDeclaration::ReadFromImpl(reader, false); 112 return VariableDeclaration::ReadFromImpl(reader, false);
114 } 113 }
115 }; 114 };
116 115
117 116
118 String* String::ReadFrom(Reader* reader) {
119 TRACE_READ_OFFSET();
120 return Reference::ReadStringFrom(reader);
121 }
122
123
124 String* String::ReadRaw(Reader* reader, intptr_t 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;
130 }
131
132
133 void StringTable::ReadFrom(Reader* reader) {
134 TRACE_READ_OFFSET();
135 // Read the table of end offsets.
136 intptr_t length = reader->ReadUInt();
137 intptr_t* end_offsets = new intptr_t[length];
138 for (intptr_t i = 0; i < length; ++i) {
139 end_offsets[i] = reader->ReadUInt();
140 }
141 // Read the UTF-8 encoded strings.
142 reader->MarkStringDataOffset();
143 strings_.EnsureInitialized(length);
144 intptr_t start_offset = 0;
145 for (intptr_t i = 0; i < length; ++i) {
146 ASSERT(strings_[i] == NULL);
147 strings_[i] = String::ReadRaw(reader, end_offsets[i] - start_offset);
148 start_offset = end_offsets[i];
149 }
150 delete[] end_offsets;
151 }
152
153
154 void SourceTable::ReadFrom(Reader* reader) { 117 void SourceTable::ReadFrom(Reader* reader) {
155 size_ = reader->ReadUInt(); 118 size_ = reader->ReadUInt();
156 sources_ = new Source[size_]; 119 sources_ = new Source[size_];
157 120
158 // Build a table of the URI offsets. 121 // Build a table of the URI offsets.
159 intptr_t* end_offsets = new intptr_t[size_]; 122 intptr_t* end_offsets = new intptr_t[size_];
160 for (intptr_t i = 0; i < size_; ++i) { 123 for (intptr_t i = 0; i < size_; ++i) {
161 end_offsets[i] = reader->ReadUInt(); 124 end_offsets[i] = reader->ReadUInt();
162 } 125 }
163 126
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 162
200 163
201 Library* Library::ReadFrom(Reader* reader) { 164 Library* Library::ReadFrom(Reader* reader) {
202 TRACE_READ_OFFSET(); 165 TRACE_READ_OFFSET();
203 int flags = reader->ReadFlags(); 166 int flags = reader->ReadFlags();
204 ASSERT(flags == 0); // external libraries not supported 167 ASSERT(flags == 0); // external libraries not supported
205 kernel_data_ = reader->buffer(); 168 kernel_data_ = reader->buffer();
206 kernel_data_size_ = reader->size(); 169 kernel_data_size_ = reader->size();
207 170
208 canonical_name_ = reader->ReadCanonicalNameReference(); 171 canonical_name_ = reader->ReadCanonicalNameReference();
209 name_ = Reference::ReadStringFrom(reader); 172 name_index_ = reader->ReadUInt();
210 import_uri_ = canonical_name_->name(); 173 import_uri_index_ = canonical_name_->name();
211 source_uri_index_ = reader->ReadUInt(); 174 source_uri_index_ = reader->ReadUInt();
212 reader->set_current_script_id(source_uri_index_); 175 reader->set_current_script_id(source_uri_index_);
213 176
214 int num_imports = reader->ReadUInt(); 177 int num_imports = reader->ReadUInt();
215 if (num_imports != 0) { 178 if (num_imports != 0) {
216 FATAL("Deferred imports not implemented in VM"); 179 FATAL("Deferred imports not implemented in VM");
217 } 180 }
218 int num_typedefs = reader->ReadUInt(); 181 int num_typedefs = reader->ReadUInt();
219 typedefs().EnsureInitialized(num_typedefs); 182 typedefs().EnsureInitialized(num_typedefs);
220 for (intptr_t i = 0; i < num_typedefs; i++) { 183 for (intptr_t i = 0; i < num_typedefs; i++) {
(...skipping 12 matching lines...) Expand all
233 procedures().ReadFrom<Procedure>(reader, this); 196 procedures().ReadFrom<Procedure>(reader, this);
234 return this; 197 return this;
235 } 198 }
236 199
237 200
238 Typedef* Typedef::ReadFrom(Reader* reader) { 201 Typedef* Typedef::ReadFrom(Reader* reader) {
239 TRACE_READ_OFFSET(); 202 TRACE_READ_OFFSET();
240 203
241 canonical_name_ = reader->ReadCanonicalNameReference(); 204 canonical_name_ = reader->ReadCanonicalNameReference();
242 position_ = reader->ReadPosition(false); 205 position_ = reader->ReadPosition(false);
243 name_ = Reference::ReadStringFrom(reader); 206 name_index_ = reader->ReadUInt();
244 source_uri_index_ = reader->ReadUInt(); 207 source_uri_index_ = reader->ReadUInt();
245 type_parameters_.ReadFrom(reader); 208 type_parameters_.ReadFrom(reader);
246 type_ = DartType::ReadFrom(reader); 209 type_ = DartType::ReadFrom(reader);
247 210
248 return this; 211 return this;
249 } 212 }
250 213
251 214
252 Class* Class::ReadFrom(Reader* reader) { 215 Class* Class::ReadFrom(Reader* reader) {
253 TRACE_READ_OFFSET(); 216 TRACE_READ_OFFSET();
254 217
255 canonical_name_ = reader->ReadCanonicalNameReference(); 218 canonical_name_ = reader->ReadCanonicalNameReference();
256 position_ = reader->ReadPosition(false); 219 position_ = reader->ReadPosition(false);
257 is_abstract_ = reader->ReadBool(); 220 is_abstract_ = reader->ReadBool();
258 name_ = Reference::ReadStringFrom(reader); 221 name_index_ = reader->ReadUInt();
259 source_uri_index_ = reader->ReadUInt(); 222 source_uri_index_ = reader->ReadUInt();
260 reader->set_current_script_id(source_uri_index_); 223 reader->set_current_script_id(source_uri_index_);
261 reader->record_token_position(position_); 224 reader->record_token_position(position_);
262 annotations_.ReadFromStatic<Expression>(reader); 225 annotations_.ReadFromStatic<Expression>(reader);
263 226
264 return this; 227 return this;
265 } 228 }
266 229
267 230
268 NormalClass* NormalClass::ReadFrom(Reader* reader) { 231 NormalClass* NormalClass::ReadFrom(Reader* reader) {
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 if (canonical_name == NULL) { 302 if (canonical_name == NULL) {
340 FATAL("Expected a valid typedef reference, but got `null`"); 303 FATAL("Expected a valid typedef reference, but got `null`");
341 } 304 }
342 305
343 canonical_name->set_referenced(true); 306 canonical_name->set_referenced(true);
344 307
345 return canonical_name; 308 return canonical_name;
346 } 309 }
347 310
348 311
349 String* Reference::ReadStringFrom(Reader* reader) {
350 int index = reader->ReadUInt();
351 return reader->helper()->program()->string_table().strings()[index];
352 }
353
354
355 Field* Field::ReadFrom(Reader* reader) { 312 Field* Field::ReadFrom(Reader* reader) {
356 TRACE_READ_OFFSET(); 313 TRACE_READ_OFFSET();
357 kernel_offset_ = reader->offset(); // Notice the ReadTag() below. 314 kernel_offset_ = reader->offset(); // Notice the ReadTag() below.
358 Tag tag = reader->ReadTag(); 315 Tag tag = reader->ReadTag();
359 ASSERT(tag == kField); 316 ASSERT(tag == kField);
360 317
361 canonical_name_ = reader->ReadCanonicalNameReference(); 318 canonical_name_ = reader->ReadCanonicalNameReference();
362 position_ = reader->ReadPosition(false); 319 position_ = reader->ReadPosition(false);
363 end_position_ = reader->ReadPosition(false); 320 end_position_ = reader->ReadPosition(false);
364 flags_ = reader->ReadFlags(); 321 flags_ = reader->ReadFlags();
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 Arguments* arguments = new Arguments(); 669 Arguments* arguments = new Arguments();
713 arguments->types().ReadFromStatic<DartType>(reader); 670 arguments->types().ReadFromStatic<DartType>(reader);
714 arguments->positional().ReadFromStatic<Expression>(reader); 671 arguments->positional().ReadFromStatic<Expression>(reader);
715 arguments->named().ReadFromStatic<NamedExpression>(reader); 672 arguments->named().ReadFromStatic<NamedExpression>(reader);
716 return arguments; 673 return arguments;
717 } 674 }
718 675
719 676
720 NamedExpression* NamedExpression::ReadFrom(Reader* reader) { 677 NamedExpression* NamedExpression::ReadFrom(Reader* reader) {
721 TRACE_READ_OFFSET(); 678 TRACE_READ_OFFSET();
722 String* name = Reference::ReadStringFrom(reader); 679 intptr_t name_index = reader->ReadUInt();
723 Expression* expression = Expression::ReadFrom(reader); 680 Expression* expression = Expression::ReadFrom(reader);
724 return new NamedExpression(name, expression); 681 return new NamedExpression(name_index, expression);
725 } 682 }
726 683
727 684
728 MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) { 685 MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) {
729 TRACE_READ_OFFSET(); 686 TRACE_READ_OFFSET();
730 MethodInvocation* invocation = new MethodInvocation(); 687 MethodInvocation* invocation = new MethodInvocation();
731 invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 688 invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
732 invocation->position_ = reader->ReadPosition(); 689 invocation->position_ = reader->ReadPosition();
733 invocation->receiver_ = Expression::ReadFrom(reader); 690 invocation->receiver_ = Expression::ReadFrom(reader);
734 invocation->name_ = Name::ReadFrom(reader); 691 invocation->name_ = Name::ReadFrom(reader);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 expr->position_ = reader->ReadPosition(); 792 expr->position_ = reader->ReadPosition();
836 expr->operand_ = Expression::ReadFrom(reader); 793 expr->operand_ = Expression::ReadFrom(reader);
837 expr->type_ = DartType::ReadFrom(reader); 794 expr->type_ = DartType::ReadFrom(reader);
838 return expr; 795 return expr;
839 } 796 }
840 797
841 798
842 StringLiteral* StringLiteral::ReadFrom(Reader* reader) { 799 StringLiteral* StringLiteral::ReadFrom(Reader* reader) {
843 TRACE_READ_OFFSET(); 800 TRACE_READ_OFFSET();
844 intptr_t offset = reader->offset() - 1; // -1 to include tag byte. 801 intptr_t offset = reader->offset() - 1; // -1 to include tag byte.
845 StringLiteral* lit = new StringLiteral(Reference::ReadStringFrom(reader)); 802 StringLiteral* lit = new StringLiteral(reader->ReadUInt());
846 lit->kernel_offset_ = offset; 803 lit->kernel_offset_ = offset;
847 return lit; 804 return lit;
848 } 805 }
849 806
850 807
851 BigintLiteral* BigintLiteral::ReadFrom(Reader* reader) { 808 BigintLiteral* BigintLiteral::ReadFrom(Reader* reader) {
852 TRACE_READ_OFFSET(); 809 TRACE_READ_OFFSET();
853 intptr_t offset = reader->offset() - 1; // -1 to include tag byte. 810 intptr_t offset = reader->offset() - 1; // -1 to include tag byte.
854 BigintLiteral* lit = new BigintLiteral(Reference::ReadStringFrom(reader)); 811 BigintLiteral* lit = new BigintLiteral(reader->ReadUInt());
855 lit->kernel_offset_ = offset; 812 lit->kernel_offset_ = offset;
856 return lit; 813 return lit;
857 } 814 }
858 815
859 816
860 IntLiteral* IntLiteral::ReadFrom(Reader* reader, bool is_negative) { 817 IntLiteral* IntLiteral::ReadFrom(Reader* reader, bool is_negative) {
861 TRACE_READ_OFFSET(); 818 TRACE_READ_OFFSET();
862 IntLiteral* literal = new IntLiteral(); 819 IntLiteral* literal = new IntLiteral();
863 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 820 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
864 literal->value_ = is_negative ? -static_cast<int64_t>(reader->ReadUInt()) 821 literal->value_ = is_negative ? -static_cast<int64_t>(reader->ReadUInt())
865 : reader->ReadUInt(); 822 : reader->ReadUInt();
866 return literal; 823 return literal;
867 } 824 }
868 825
869 826
870 IntLiteral* IntLiteral::ReadFrom(Reader* reader, uint8_t payload) { 827 IntLiteral* IntLiteral::ReadFrom(Reader* reader, uint8_t payload) {
871 TRACE_READ_OFFSET(); 828 TRACE_READ_OFFSET();
872 IntLiteral* literal = new IntLiteral(); 829 IntLiteral* literal = new IntLiteral();
873 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 830 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
874 literal->value_ = static_cast<int32_t>(payload) - SpecializedIntLiteralBias; 831 literal->value_ = static_cast<int32_t>(payload) - SpecializedIntLiteralBias;
875 return literal; 832 return literal;
876 } 833 }
877 834
878 835
879 DoubleLiteral* DoubleLiteral::ReadFrom(Reader* reader) { 836 DoubleLiteral* DoubleLiteral::ReadFrom(Reader* reader) {
880 TRACE_READ_OFFSET(); 837 TRACE_READ_OFFSET();
881 DoubleLiteral* literal = new DoubleLiteral(); 838 DoubleLiteral* literal = new DoubleLiteral();
882 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 839 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
883 literal->value_ = Reference::ReadStringFrom(reader); 840 literal->value_index_ = reader->ReadUInt();
884 return literal; 841 return literal;
885 } 842 }
886 843
887 844
888 BoolLiteral* BoolLiteral::ReadFrom(Reader* reader, bool value) { 845 BoolLiteral* BoolLiteral::ReadFrom(Reader* reader, bool value) {
889 TRACE_READ_OFFSET(); 846 TRACE_READ_OFFSET();
890 BoolLiteral* lit = new BoolLiteral(); 847 BoolLiteral* lit = new BoolLiteral();
891 lit->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 848 lit->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
892 lit->value_ = value; 849 lit->value_ = value;
893 return lit; 850 return lit;
894 } 851 }
895 852
896 853
897 NullLiteral* NullLiteral::ReadFrom(Reader* reader) { 854 NullLiteral* NullLiteral::ReadFrom(Reader* reader) {
898 TRACE_READ_OFFSET(); 855 TRACE_READ_OFFSET();
899 NullLiteral* lit = new NullLiteral(); 856 NullLiteral* lit = new NullLiteral();
900 lit->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 857 lit->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
901 return lit; 858 return lit;
902 } 859 }
903 860
904 861
905 SymbolLiteral* SymbolLiteral::ReadFrom(Reader* reader) { 862 SymbolLiteral* SymbolLiteral::ReadFrom(Reader* reader) {
906 TRACE_READ_OFFSET(); 863 TRACE_READ_OFFSET();
907 SymbolLiteral* lit = new SymbolLiteral(); 864 SymbolLiteral* lit = new SymbolLiteral();
908 lit->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 865 lit->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
909 lit->value_ = Reference::ReadStringFrom(reader); 866 lit->value_index_ = reader->ReadUInt();
910 return lit; 867 return lit;
911 } 868 }
912 869
913 870
914 TypeLiteral* TypeLiteral::ReadFrom(Reader* reader) { 871 TypeLiteral* TypeLiteral::ReadFrom(Reader* reader) {
915 TRACE_READ_OFFSET(); 872 TRACE_READ_OFFSET();
916 TypeLiteral* literal = new TypeLiteral(); 873 TypeLiteral* literal = new TypeLiteral();
917 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 874 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
918 literal->type_ = DartType::ReadFrom(reader); 875 literal->type_ = DartType::ReadFrom(reader);
919 return literal; 876 return literal;
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after
1377 bool read_tag) { 1334 bool read_tag) {
1378 TRACE_READ_OFFSET(); 1335 TRACE_READ_OFFSET();
1379 PositionScope scope(reader); 1336 PositionScope scope(reader);
1380 1337
1381 VariableDeclaration* decl = new VariableDeclaration(); 1338 VariableDeclaration* decl = new VariableDeclaration();
1382 // -1 or -0 depending on whether there's a tag or not. 1339 // -1 or -0 depending on whether there's a tag or not.
1383 decl->kernel_offset_ = reader->offset() - (read_tag ? 1 : 0); 1340 decl->kernel_offset_ = reader->offset() - (read_tag ? 1 : 0);
1384 decl->position_ = reader->ReadPosition(); 1341 decl->position_ = reader->ReadPosition();
1385 decl->equals_position_ = reader->ReadPosition(); 1342 decl->equals_position_ = reader->ReadPosition();
1386 decl->flags_ = reader->ReadFlags(); 1343 decl->flags_ = reader->ReadFlags();
1387 decl->name_ = Reference::ReadStringFrom(reader); 1344 decl->name_index_ = reader->ReadUInt();
1388 decl->type_ = DartType::ReadFrom(reader); 1345 decl->type_ = DartType::ReadFrom(reader);
1389 decl->initializer_ = reader->ReadOptional<Expression>(); 1346 decl->initializer_ = reader->ReadOptional<Expression>();
1390 1347
1391 // Go to next token position so it ends *after* the last potentially 1348 // Go to next token position so it ends *after* the last potentially
1392 // debuggable position in the initializer. 1349 // debuggable position in the initializer.
1393 TokenPosition position = reader->max_position(); 1350 TokenPosition position = reader->max_position();
1394 if (position.IsReal()) position.Next(); 1351 if (position.IsReal()) position.Next();
1395 decl->end_position_ = position; 1352 decl->end_position_ = position;
1396 reader->helper()->variables().Push(decl); 1353 reader->helper()->variables().Push(decl);
1397 1354
1398 return decl; 1355 return decl;
1399 } 1356 }
1400 1357
1401 1358
1402 FunctionDeclaration* FunctionDeclaration::ReadFrom(Reader* reader) { 1359 FunctionDeclaration* FunctionDeclaration::ReadFrom(Reader* reader) {
1403 TRACE_READ_OFFSET(); 1360 TRACE_READ_OFFSET();
1404 FunctionDeclaration* decl = new FunctionDeclaration(); 1361 FunctionDeclaration* decl = new FunctionDeclaration();
1405 decl->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 1362 decl->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1406 decl->position_ = reader->ReadPosition(); 1363 decl->position_ = reader->ReadPosition();
1407 decl->variable_ = VariableDeclaration::ReadFromImpl(reader, false); 1364 decl->variable_ = VariableDeclaration::ReadFromImpl(reader, false);
1408 VariableScope<ReaderHelper> parameters(reader->helper()); 1365 VariableScope<ReaderHelper> parameters(reader->helper());
1409 decl->function_ = FunctionNode::ReadFrom(reader); 1366 decl->function_ = FunctionNode::ReadFrom(reader);
1410 return decl; 1367 return decl;
1411 } 1368 }
1412 1369
1413 1370
1414 Name* Name::ReadFrom(Reader* reader) { 1371 Name* Name::ReadFrom(Reader* reader) {
1415 String* name = Reference::ReadStringFrom(reader); 1372 intptr_t name_index = reader->ReadUInt();
1416 if (name->size() >= 1 && reader->CharacterAt(name, 0) == '_') { 1373 if ((reader->StringLength(name_index) >= 1) &&
1374 (reader->CharacterAt(name_index, 0) == '_')) {
1417 CanonicalName* library_reference = reader->ReadCanonicalNameReference(); 1375 CanonicalName* library_reference = reader->ReadCanonicalNameReference();
1418 return new Name(name, library_reference); 1376 return new Name(name_index, library_reference);
1419 } else { 1377 } else {
1420 return new Name(name, NULL); 1378 return new Name(name_index, NULL);
1421 } 1379 }
1422 } 1380 }
1423 1381
1424 1382
1425 DartType* DartType::ReadFrom(Reader* reader) { 1383 DartType* DartType::ReadFrom(Reader* reader) {
1426 TRACE_READ_OFFSET(); 1384 TRACE_READ_OFFSET();
1427 Tag tag = reader->ReadTag(); 1385 Tag tag = reader->ReadTag();
1428 switch (tag) { 1386 switch (tag) {
1429 case kInvalidType: 1387 case kInvalidType:
1430 return InvalidType::ReadFrom(reader); 1388 return InvalidType::ReadFrom(reader);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1500 } 1458 }
1501 1459
1502 1460
1503 FunctionType* FunctionType::ReadFrom(Reader* reader) { 1461 FunctionType* FunctionType::ReadFrom(Reader* reader) {
1504 TRACE_READ_OFFSET(); 1462 TRACE_READ_OFFSET();
1505 FunctionType* type = new FunctionType(); 1463 FunctionType* type = new FunctionType();
1506 TypeParameterScope<ReaderHelper> scope(reader->helper()); 1464 TypeParameterScope<ReaderHelper> scope(reader->helper());
1507 type->type_parameters().ReadFrom(reader); 1465 type->type_parameters().ReadFrom(reader);
1508 type->required_parameter_count_ = reader->ReadUInt(); 1466 type->required_parameter_count_ = reader->ReadUInt();
1509 type->positional_parameters().ReadFromStatic<DartType>(reader); 1467 type->positional_parameters().ReadFromStatic<DartType>(reader);
1510 type->named_parameters().ReadFromStatic<Tuple<String, DartType> >(reader); 1468 type->named_parameters().ReadFromStatic<NamedParameter>(reader);
1511 type->return_type_ = DartType::ReadFrom(reader); 1469 type->return_type_ = DartType::ReadFrom(reader);
1512 return type; 1470 return type;
1513 } 1471 }
1514 1472
1515 1473
1516 FunctionType* FunctionType::ReadFrom(Reader* reader, bool _is_simple_) { 1474 FunctionType* FunctionType::ReadFrom(Reader* reader, bool _is_simple_) {
1517 TRACE_READ_OFFSET(); 1475 TRACE_READ_OFFSET();
1518 FunctionType* type = new FunctionType(); 1476 FunctionType* type = new FunctionType();
1519 ASSERT(_is_simple_); 1477 ASSERT(_is_simple_);
1520 type->positional_parameters().ReadFromStatic<DartType>(reader); 1478 type->positional_parameters().ReadFromStatic<DartType>(reader);
(...skipping 21 matching lines...) Expand all
1542 1500
1543 Program* Program::ReadFrom(Reader* reader) { 1501 Program* Program::ReadFrom(Reader* reader) {
1544 TRACE_READ_OFFSET(); 1502 TRACE_READ_OFFSET();
1545 uint32_t magic = reader->ReadUInt32(); 1503 uint32_t magic = reader->ReadUInt32();
1546 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); 1504 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier");
1547 1505
1548 Program* program = new Program(); 1506 Program* program = new Program();
1549 program->canonical_name_root_ = CanonicalName::NewRoot(); 1507 program->canonical_name_root_ = CanonicalName::NewRoot();
1550 reader->helper()->set_program(program); 1508 reader->helper()->set_program(program);
1551 1509
1552 program->string_table_.ReadFrom(reader); 1510 // Skip the table of string end offsets.
1553 program->string_data_offset_ = reader->string_data_offset(); 1511 reader->MarkStringTableOffset();
1554 ASSERT(program->string_data_offset_ >= 0); 1512 intptr_t length = reader->ReadUInt();
1513 reader->string_offsets_ = new intptr_t[length + 1];
1514 intptr_t offset = 0;
1515 for (intptr_t i = 0; i < length; ++i) {
1516 reader->string_offsets_[i] = offset;
1517 offset = reader->ReadUInt();
1518 }
1519 reader->string_offsets_[length] = offset;
1520 // Skip the UTF-8 encoded strings.
1521 reader->MarkStringDataOffset();
1522 reader->Consume(offset);
1523
1524 program->string_table_offset_ = reader->string_table_offset();
1525 ASSERT(program->string_table_offset_ >= 0);
1555 program->source_table_.ReadFrom(reader); 1526 program->source_table_.ReadFrom(reader);
1556 1527
1557 int canonical_names = reader->ReadUInt(); 1528 int canonical_names = reader->ReadUInt();
1558 reader->helper()->SetCanonicalNameCount(canonical_names); 1529 reader->helper()->SetCanonicalNameCount(canonical_names);
1559 for (int i = 0; i < canonical_names; ++i) { 1530 for (int i = 0; i < canonical_names; ++i) {
1560 int biased_parent_index = reader->ReadUInt(); 1531 int biased_parent_index = reader->ReadUInt();
1561 CanonicalName* parent; 1532 CanonicalName* parent;
1562 if (biased_parent_index != 0) { 1533 if (biased_parent_index != 0) {
1563 parent = reader->helper()->GetCanonicalName(biased_parent_index - 1); 1534 parent = reader->helper()->GetCanonicalName(biased_parent_index - 1);
1564 } else { 1535 } else {
1565 parent = program->canonical_name_root(); 1536 parent = program->canonical_name_root();
1566 } 1537 }
1567 ASSERT(parent != NULL); 1538 ASSERT(parent != NULL);
1568 int name_index = reader->ReadUInt(); 1539 intptr_t name_index = reader->ReadUInt();
1569 String* name = program->string_table().strings()[name_index]; 1540 CanonicalName* canonical_name = parent->AddChild(name_index);
1570 CanonicalName* canonical_name = parent->AddChild(name);
1571 reader->helper()->SetCanonicalName(i, canonical_name); 1541 reader->helper()->SetCanonicalName(i, canonical_name);
1572 } 1542 }
1573 1543
1574 int libraries = reader->ReadUInt(); 1544 int libraries = reader->ReadUInt();
1575 program->libraries().EnsureInitialized(libraries); 1545 program->libraries().EnsureInitialized(libraries);
1576 for (intptr_t i = 0; i < libraries; i++) { 1546 for (intptr_t i = 0; i < libraries; i++) {
1577 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); 1547 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader);
1578 } 1548 }
1579 1549
1580 program->main_method_reference_ = 1550 program->main_method_reference_ =
(...skipping 25 matching lines...) Expand all
1606 LabelScope<ReaderHelper, BlockStack<LabeledStatement> > labels( 1576 LabelScope<ReaderHelper, BlockStack<LabeledStatement> > labels(
1607 reader->helper()); 1577 reader->helper());
1608 VariableScope<ReaderHelper> vars(reader->helper()); 1578 VariableScope<ReaderHelper> vars(reader->helper());
1609 function->body_ = reader->ReadOptional<Statement>(); 1579 function->body_ = reader->ReadOptional<Statement>();
1610 return function; 1580 return function;
1611 } 1581 }
1612 1582
1613 1583
1614 TypeParameter* TypeParameter::ReadFrom(Reader* reader) { 1584 TypeParameter* TypeParameter::ReadFrom(Reader* reader) {
1615 TRACE_READ_OFFSET(); 1585 TRACE_READ_OFFSET();
1616 name_ = Reference::ReadStringFrom(reader); 1586 name_index_ = reader->ReadUInt();
1617 bound_ = DartType::ReadFrom(reader); 1587 bound_ = DartType::ReadFrom(reader);
1618 return this; 1588 return this;
1619 } 1589 }
1620 1590
1621 1591
1622 } // namespace kernel 1592 } // namespace kernel
1623 1593
1624 1594
1625 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, 1595 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer,
1626 intptr_t buffer_length) { 1596 intptr_t buffer_length) {
1627 kernel::Reader reader(buffer, buffer_length); 1597 kernel::Reader reader(buffer, buffer_length);
1628 return kernel::Program::ReadFrom(&reader); 1598 return kernel::Program::ReadFrom(&reader);
1629 } 1599 }
1630 1600
1631 1601
1632 } // namespace dart 1602 } // namespace dart
1633 #endif // !defined(DART_PRECOMPILED_RUNTIME) 1603 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« no previous file with comments | « runtime/vm/kernel_binary.h ('k') | runtime/vm/kernel_binary_flowgraph.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698