| OLD | NEW |
| 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" |
| 11 #include "vm/kernel_to_il.h" | 11 #include "vm/kernel_to_il.h" |
| 12 #include "vm/os.h" | 12 #include "vm/os.h" |
| 13 | 13 |
| 14 #if defined(DEBUG) | 14 #if defined(DEBUG) |
| 15 #define TRACE_READ_OFFSET() \ | 15 #define TRACE_READ_OFFSET() \ |
| 16 do { \ | 16 do { \ |
| 17 if (FLAG_trace_kernel_binary) reader->DumpOffset(DART_PRETTY_FUNCTION); \ | 17 if (FLAG_trace_kernel_binary) reader->DumpOffset(DART_PRETTY_FUNCTION); \ |
| 18 } while (0) | 18 } while (0) |
| 19 #else | 19 #else |
| 20 #define TRACE_READ_OFFSET() | 20 #define TRACE_READ_OFFSET() |
| 21 #endif | 21 #endif |
| 22 | 22 |
| 23 namespace dart { | 23 namespace dart { |
| 24 | 24 |
| 25 | 25 |
| 26 namespace kernel { | 26 namespace kernel { |
| 27 | 27 |
| 28 | 28 |
| 29 Reader::~Reader() { |
| 30 delete[] string_offsets_; |
| 31 delete[] canonical_name_parents_; |
| 32 delete[] canonical_name_strings_; |
| 33 } |
| 34 |
| 35 |
| 29 template <typename T> | 36 template <typename T> |
| 30 template <typename IT> | 37 template <typename IT> |
| 31 void List<T>::ReadFrom(Reader* reader, TreeNode* parent) { | 38 void List<T>::ReadFrom(Reader* reader, TreeNode* parent) { |
| 32 TRACE_READ_OFFSET(); | 39 TRACE_READ_OFFSET(); |
| 33 ASSERT(parent != NULL); | 40 ASSERT(parent != NULL); |
| 34 int length = reader->ReadListLength(); | 41 int length = reader->ReadListLength(); |
| 35 EnsureInitialized(length); | 42 EnsureInitialized(length); |
| 36 | 43 |
| 37 for (intptr_t i = 0; i < length_; i++) { | 44 for (intptr_t i = 0; i < length_; i++) { |
| 38 IT* object = GetOrCreate<IT>(i, parent); | 45 IT* object = GetOrCreate<IT>(i, parent); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 | 170 |
| 164 Library* Library::ReadFrom(Reader* reader) { | 171 Library* Library::ReadFrom(Reader* reader) { |
| 165 TRACE_READ_OFFSET(); | 172 TRACE_READ_OFFSET(); |
| 166 int flags = reader->ReadFlags(); | 173 int flags = reader->ReadFlags(); |
| 167 ASSERT(flags == 0); // external libraries not supported | 174 ASSERT(flags == 0); // external libraries not supported |
| 168 kernel_data_ = reader->buffer(); | 175 kernel_data_ = reader->buffer(); |
| 169 kernel_data_size_ = reader->size(); | 176 kernel_data_size_ = reader->size(); |
| 170 | 177 |
| 171 canonical_name_ = reader->ReadCanonicalNameReference(); | 178 canonical_name_ = reader->ReadCanonicalNameReference(); |
| 172 name_index_ = reader->ReadUInt(); | 179 name_index_ = reader->ReadUInt(); |
| 173 import_uri_index_ = canonical_name_->name(); | 180 import_uri_index_ = reader->CanonicalNameString(canonical_name_); |
| 174 source_uri_index_ = reader->ReadUInt(); | 181 source_uri_index_ = reader->ReadUInt(); |
| 175 reader->set_current_script_id(source_uri_index_); | 182 reader->set_current_script_id(source_uri_index_); |
| 176 | 183 |
| 177 int num_imports = reader->ReadUInt(); | 184 int num_imports = reader->ReadUInt(); |
| 178 if (num_imports != 0) { | 185 if (num_imports != 0) { |
| 179 FATAL("Deferred imports not implemented in VM"); | 186 FATAL("Deferred imports not implemented in VM"); |
| 180 } | 187 } |
| 181 int num_typedefs = reader->ReadUInt(); | 188 int num_typedefs = reader->ReadUInt(); |
| 182 typedefs().EnsureInitialized(num_typedefs); | 189 typedefs().EnsureInitialized(num_typedefs); |
| 183 for (intptr_t i = 0; i < num_typedefs; i++) { | 190 for (intptr_t i = 0; i < num_typedefs; i++) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 type_parameters_.ReadFrom(reader); | 263 type_parameters_.ReadFrom(reader); |
| 257 first_ = InterfaceType::Cast(DartType::ReadFrom(reader)); | 264 first_ = InterfaceType::Cast(DartType::ReadFrom(reader)); |
| 258 second_ = InterfaceType::Cast(DartType::ReadFrom(reader)); | 265 second_ = InterfaceType::Cast(DartType::ReadFrom(reader)); |
| 259 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( | 266 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( |
| 260 reader); | 267 reader); |
| 261 constructors_.ReadFrom<Constructor>(reader, this); | 268 constructors_.ReadFrom<Constructor>(reader, this); |
| 262 return this; | 269 return this; |
| 263 } | 270 } |
| 264 | 271 |
| 265 | 272 |
| 266 CanonicalName* Reference::ReadMemberFrom(Reader* reader, bool allow_null) { | 273 intptr_t Reference::ReadMemberFrom(Reader* reader, bool allow_null) { |
| 267 TRACE_READ_OFFSET(); | 274 TRACE_READ_OFFSET(); |
| 268 | 275 intptr_t canonical_name = reader->ReadCanonicalNameReference(); |
| 269 CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); | 276 if ((canonical_name == -1) && !allow_null) { |
| 270 if (canonical_name == NULL && !allow_null) { | |
| 271 FATAL("Expected a valid member reference, but got `null`"); | 277 FATAL("Expected a valid member reference, but got `null`"); |
| 272 } | 278 } |
| 273 | |
| 274 if (canonical_name != NULL) { | |
| 275 canonical_name->set_referenced(true); | |
| 276 } | |
| 277 | |
| 278 return canonical_name; | 279 return canonical_name; |
| 279 } | 280 } |
| 280 | 281 |
| 281 | 282 |
| 282 CanonicalName* Reference::ReadClassFrom(Reader* reader, bool allow_null) { | 283 intptr_t Reference::ReadClassFrom(Reader* reader, bool allow_null) { |
| 283 TRACE_READ_OFFSET(); | 284 TRACE_READ_OFFSET(); |
| 284 | 285 intptr_t canonical_name = reader->ReadCanonicalNameReference(); |
| 285 CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); | 286 if ((canonical_name == -1) && !allow_null) { |
| 286 if (canonical_name == NULL && !allow_null) { | |
| 287 FATAL("Expected a valid class reference, but got `null`"); | 287 FATAL("Expected a valid class reference, but got `null`"); |
| 288 } | 288 } |
| 289 | |
| 290 if (canonical_name != NULL) { | |
| 291 canonical_name->set_referenced(true); | |
| 292 } | |
| 293 | |
| 294 return canonical_name; | 289 return canonical_name; |
| 295 } | 290 } |
| 296 | 291 |
| 297 | 292 |
| 298 CanonicalName* Reference::ReadTypedefFrom(Reader* reader) { | 293 intptr_t Reference::ReadTypedefFrom(Reader* reader) { |
| 299 TRACE_READ_OFFSET(); | 294 TRACE_READ_OFFSET(); |
| 300 | 295 intptr_t canonical_name = reader->ReadCanonicalNameReference(); |
| 301 CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); | 296 if (canonical_name == -1) { |
| 302 if (canonical_name == NULL) { | |
| 303 FATAL("Expected a valid typedef reference, but got `null`"); | 297 FATAL("Expected a valid typedef reference, but got `null`"); |
| 304 } | 298 } |
| 305 | |
| 306 canonical_name->set_referenced(true); | |
| 307 | |
| 308 return canonical_name; | 299 return canonical_name; |
| 309 } | 300 } |
| 310 | 301 |
| 311 | 302 |
| 312 Field* Field::ReadFrom(Reader* reader) { | 303 Field* Field::ReadFrom(Reader* reader) { |
| 313 TRACE_READ_OFFSET(); | 304 TRACE_READ_OFFSET(); |
| 314 kernel_offset_ = reader->offset(); // Notice the ReadTag() below. | 305 kernel_offset_ = reader->offset(); // Notice the ReadTag() below. |
| 315 Tag tag = reader->ReadTag(); | 306 Tag tag = reader->ReadTag(); |
| 316 ASSERT(tag == kField); | 307 ASSERT(tag == kField); |
| 317 | 308 |
| (...skipping 1047 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1365 VariableScope<ReaderHelper> parameters(reader->helper()); | 1356 VariableScope<ReaderHelper> parameters(reader->helper()); |
| 1366 decl->function_ = FunctionNode::ReadFrom(reader); | 1357 decl->function_ = FunctionNode::ReadFrom(reader); |
| 1367 return decl; | 1358 return decl; |
| 1368 } | 1359 } |
| 1369 | 1360 |
| 1370 | 1361 |
| 1371 Name* Name::ReadFrom(Reader* reader) { | 1362 Name* Name::ReadFrom(Reader* reader) { |
| 1372 intptr_t name_index = reader->ReadUInt(); | 1363 intptr_t name_index = reader->ReadUInt(); |
| 1373 if ((reader->StringLength(name_index) >= 1) && | 1364 if ((reader->StringLength(name_index) >= 1) && |
| 1374 (reader->CharacterAt(name_index, 0) == '_')) { | 1365 (reader->CharacterAt(name_index, 0) == '_')) { |
| 1375 CanonicalName* library_reference = reader->ReadCanonicalNameReference(); | 1366 intptr_t library_reference = reader->ReadCanonicalNameReference(); |
| 1376 return new Name(name_index, library_reference); | 1367 return new Name(name_index, library_reference); |
| 1377 } else { | 1368 } else { |
| 1378 return new Name(name_index, NULL); | 1369 return new Name(name_index, NULL); |
| 1379 } | 1370 } |
| 1380 } | 1371 } |
| 1381 | 1372 |
| 1382 | 1373 |
| 1383 DartType* DartType::ReadFrom(Reader* reader) { | 1374 DartType* DartType::ReadFrom(Reader* reader) { |
| 1384 TRACE_READ_OFFSET(); | 1375 TRACE_READ_OFFSET(); |
| 1385 Tag tag = reader->ReadTag(); | 1376 Tag tag = reader->ReadTag(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1425 | 1416 |
| 1426 | 1417 |
| 1427 VoidType* VoidType::ReadFrom(Reader* reader) { | 1418 VoidType* VoidType::ReadFrom(Reader* reader) { |
| 1428 TRACE_READ_OFFSET(); | 1419 TRACE_READ_OFFSET(); |
| 1429 return new VoidType(); | 1420 return new VoidType(); |
| 1430 } | 1421 } |
| 1431 | 1422 |
| 1432 | 1423 |
| 1433 InterfaceType* InterfaceType::ReadFrom(Reader* reader) { | 1424 InterfaceType* InterfaceType::ReadFrom(Reader* reader) { |
| 1434 TRACE_READ_OFFSET(); | 1425 TRACE_READ_OFFSET(); |
| 1435 CanonicalName* klass_name = Reference::ReadClassFrom(reader); | 1426 intptr_t klass_name = Reference::ReadClassFrom(reader); |
| 1436 InterfaceType* type = new InterfaceType(klass_name); | 1427 InterfaceType* type = new InterfaceType(klass_name); |
| 1437 type->type_arguments().ReadFromStatic<DartType>(reader); | 1428 type->type_arguments().ReadFromStatic<DartType>(reader); |
| 1438 return type; | 1429 return type; |
| 1439 } | 1430 } |
| 1440 | 1431 |
| 1441 | 1432 |
| 1442 InterfaceType* InterfaceType::ReadFrom(Reader* reader, | 1433 InterfaceType* InterfaceType::ReadFrom(Reader* reader, |
| 1443 bool _without_type_arguments_) { | 1434 bool _without_type_arguments_) { |
| 1444 TRACE_READ_OFFSET(); | 1435 TRACE_READ_OFFSET(); |
| 1445 CanonicalName* klass_name = Reference::ReadClassFrom(reader); | 1436 intptr_t klass_name = Reference::ReadClassFrom(reader); |
| 1446 InterfaceType* type = new InterfaceType(klass_name); | 1437 InterfaceType* type = new InterfaceType(klass_name); |
| 1447 ASSERT(_without_type_arguments_); | 1438 ASSERT(_without_type_arguments_); |
| 1448 return type; | 1439 return type; |
| 1449 } | 1440 } |
| 1450 | 1441 |
| 1451 | 1442 |
| 1452 TypedefType* TypedefType::ReadFrom(Reader* reader) { | 1443 TypedefType* TypedefType::ReadFrom(Reader* reader) { |
| 1453 TRACE_READ_OFFSET(); | 1444 TRACE_READ_OFFSET(); |
| 1454 CanonicalName* typedef_name = Reference::ReadTypedefFrom(reader); | 1445 intptr_t typedef_name = Reference::ReadTypedefFrom(reader); |
| 1455 TypedefType* type = new TypedefType(typedef_name); | 1446 TypedefType* type = new TypedefType(typedef_name); |
| 1456 type->type_arguments().ReadFromStatic<DartType>(reader); | 1447 type->type_arguments().ReadFromStatic<DartType>(reader); |
| 1457 return type; | 1448 return type; |
| 1458 } | 1449 } |
| 1459 | 1450 |
| 1460 | 1451 |
| 1461 FunctionType* FunctionType::ReadFrom(Reader* reader) { | 1452 FunctionType* FunctionType::ReadFrom(Reader* reader) { |
| 1462 TRACE_READ_OFFSET(); | 1453 TRACE_READ_OFFSET(); |
| 1463 FunctionType* type = new FunctionType(); | 1454 FunctionType* type = new FunctionType(); |
| 1464 TypeParameterScope<ReaderHelper> scope(reader->helper()); | 1455 TypeParameterScope<ReaderHelper> scope(reader->helper()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1497 return type; | 1488 return type; |
| 1498 } | 1489 } |
| 1499 | 1490 |
| 1500 | 1491 |
| 1501 Program* Program::ReadFrom(Reader* reader) { | 1492 Program* Program::ReadFrom(Reader* reader) { |
| 1502 TRACE_READ_OFFSET(); | 1493 TRACE_READ_OFFSET(); |
| 1503 uint32_t magic = reader->ReadUInt32(); | 1494 uint32_t magic = reader->ReadUInt32(); |
| 1504 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); | 1495 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); |
| 1505 | 1496 |
| 1506 Program* program = new Program(); | 1497 Program* program = new Program(); |
| 1507 program->canonical_name_root_ = CanonicalName::NewRoot(); | |
| 1508 reader->helper()->set_program(program); | 1498 reader->helper()->set_program(program); |
| 1509 | 1499 |
| 1510 // Skip the table of string end offsets. | 1500 // Deserialize the string offset table to give fast access to the string data |
| 1511 reader->MarkStringTableOffset(); | 1501 // during deserialization. |
| 1512 intptr_t length = reader->ReadUInt(); | 1502 program->string_table_offset_ = reader->offset(); |
| 1513 reader->string_offsets_ = new intptr_t[length + 1]; | 1503 intptr_t string_count = reader->ReadUInt(); |
| 1504 reader->string_offsets_ = new intptr_t[string_count + 1]; |
| 1514 intptr_t offset = 0; | 1505 intptr_t offset = 0; |
| 1515 for (intptr_t i = 0; i < length; ++i) { | 1506 for (intptr_t i = 0; i < string_count; ++i) { |
| 1516 reader->string_offsets_[i] = offset; | 1507 reader->string_offsets_[i] = offset; |
| 1517 offset = reader->ReadUInt(); | 1508 offset = reader->ReadUInt(); |
| 1518 } | 1509 } |
| 1519 reader->string_offsets_[length] = offset; | 1510 reader->string_offsets_[string_count] = offset; |
| 1520 // Skip the UTF-8 encoded strings. | 1511 // Skip the UTF-8 encoded strings. |
| 1521 reader->MarkStringDataOffset(); | 1512 reader->MarkStringDataOffset(); |
| 1522 reader->Consume(offset); | 1513 reader->Consume(offset); |
| 1523 | 1514 |
| 1524 program->string_table_offset_ = reader->string_table_offset(); | |
| 1525 ASSERT(program->string_table_offset_ >= 0); | |
| 1526 program->source_table_.ReadFrom(reader); | 1515 program->source_table_.ReadFrom(reader); |
| 1527 | 1516 |
| 1528 int canonical_names = reader->ReadUInt(); | 1517 // Deserialize the canonical name table to give fast access to canonical names |
| 1529 reader->helper()->SetCanonicalNameCount(canonical_names); | 1518 // during deserialization. |
| 1530 for (int i = 0; i < canonical_names; ++i) { | 1519 program->name_table_offset_ = reader->offset(); |
| 1531 int biased_parent_index = reader->ReadUInt(); | 1520 intptr_t name_count = reader->ReadUInt(); |
| 1532 CanonicalName* parent; | 1521 reader->canonical_name_parents_ = new intptr_t[name_count]; |
| 1533 if (biased_parent_index != 0) { | 1522 reader->canonical_name_strings_ = new intptr_t[name_count]; |
| 1534 parent = reader->helper()->GetCanonicalName(biased_parent_index - 1); | 1523 for (int i = 0; i < name_count; ++i) { |
| 1535 } else { | 1524 // The parent name index is biased: 0 is the root name and otherwise N+1 is |
| 1536 parent = program->canonical_name_root(); | 1525 // the Nth name. |
| 1537 } | 1526 reader->canonical_name_parents_[i] = reader->ReadUInt() - 1; |
| 1538 ASSERT(parent != NULL); | 1527 reader->canonical_name_strings_[i] = reader->ReadUInt(); |
| 1539 intptr_t name_index = reader->ReadUInt(); | |
| 1540 CanonicalName* canonical_name = parent->AddChild(name_index); | |
| 1541 reader->helper()->SetCanonicalName(i, canonical_name); | |
| 1542 } | 1528 } |
| 1543 | 1529 |
| 1544 int libraries = reader->ReadUInt(); | 1530 int libraries = reader->ReadUInt(); |
| 1545 program->libraries().EnsureInitialized(libraries); | 1531 program->libraries().EnsureInitialized(libraries); |
| 1546 for (intptr_t i = 0; i < libraries; i++) { | 1532 for (intptr_t i = 0; i < libraries; i++) { |
| 1547 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); | 1533 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); |
| 1548 } | 1534 } |
| 1549 | 1535 |
| 1550 program->main_method_reference_ = | 1536 program->main_method_reference_ = |
| 1551 Reference::ReadMemberFrom(reader, /*allow_null=*/true); | 1537 Reference::ReadMemberFrom(reader, /*allow_null=*/true); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1594 | 1580 |
| 1595 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, | 1581 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, |
| 1596 intptr_t buffer_length) { | 1582 intptr_t buffer_length) { |
| 1597 kernel::Reader reader(buffer, buffer_length); | 1583 kernel::Reader reader(buffer, buffer_length); |
| 1598 return kernel::Program::ReadFrom(&reader); | 1584 return kernel::Program::ReadFrom(&reader); |
| 1599 } | 1585 } |
| 1600 | 1586 |
| 1601 | 1587 |
| 1602 } // namespace dart | 1588 } // namespace dart |
| 1603 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 1589 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| OLD | NEW |