Index: runtime/vm/kernel_binary.cc |
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc |
index 8f63e6b05ee5ce69871239d7e100ee50294c587c..e7b25c9a2347821770517b9c67d3a134431afdec 100644 |
--- a/runtime/vm/kernel_binary.cc |
+++ b/runtime/vm/kernel_binary.cc |
@@ -26,6 +26,13 @@ namespace dart { |
namespace kernel { |
+Reader::~Reader() { |
+ delete[] string_offsets_; |
+ delete[] canonical_name_parents_; |
+ delete[] canonical_name_strings_; |
+} |
+ |
+ |
template <typename T> |
template <typename IT> |
void List<T>::ReadFrom(Reader* reader, TreeNode* parent) { |
@@ -170,7 +177,7 @@ Library* Library::ReadFrom(Reader* reader) { |
canonical_name_ = reader->ReadCanonicalNameReference(); |
name_index_ = reader->ReadUInt(); |
- import_uri_index_ = canonical_name_->name(); |
+ import_uri_index_ = reader->CanonicalNameString(canonical_name_); |
source_uri_index_ = reader->ReadUInt(); |
reader->set_current_script_id(source_uri_index_); |
@@ -263,48 +270,32 @@ MixinClass* MixinClass::ReadFrom(Reader* reader) { |
} |
-CanonicalName* Reference::ReadMemberFrom(Reader* reader, bool allow_null) { |
+intptr_t Reference::ReadMemberFrom(Reader* reader, bool allow_null) { |
TRACE_READ_OFFSET(); |
- |
- CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); |
- if (canonical_name == NULL && !allow_null) { |
+ intptr_t canonical_name = reader->ReadCanonicalNameReference(); |
+ if ((canonical_name == -1) && !allow_null) { |
FATAL("Expected a valid member reference, but got `null`"); |
} |
- |
- if (canonical_name != NULL) { |
- canonical_name->set_referenced(true); |
- } |
- |
return canonical_name; |
} |
-CanonicalName* Reference::ReadClassFrom(Reader* reader, bool allow_null) { |
+intptr_t Reference::ReadClassFrom(Reader* reader, bool allow_null) { |
TRACE_READ_OFFSET(); |
- |
- CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); |
- if (canonical_name == NULL && !allow_null) { |
+ intptr_t canonical_name = reader->ReadCanonicalNameReference(); |
+ if ((canonical_name == -1) && !allow_null) { |
FATAL("Expected a valid class reference, but got `null`"); |
} |
- |
- if (canonical_name != NULL) { |
- canonical_name->set_referenced(true); |
- } |
- |
return canonical_name; |
} |
-CanonicalName* Reference::ReadTypedefFrom(Reader* reader) { |
+intptr_t Reference::ReadTypedefFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
- |
- CanonicalName* canonical_name = reader->ReadCanonicalNameReference(); |
- if (canonical_name == NULL) { |
+ intptr_t canonical_name = reader->ReadCanonicalNameReference(); |
+ if (canonical_name == -1) { |
FATAL("Expected a valid typedef reference, but got `null`"); |
} |
- |
- canonical_name->set_referenced(true); |
- |
return canonical_name; |
} |
@@ -1372,7 +1363,7 @@ Name* Name::ReadFrom(Reader* reader) { |
intptr_t name_index = reader->ReadUInt(); |
if ((reader->StringLength(name_index) >= 1) && |
(reader->CharacterAt(name_index, 0) == '_')) { |
- CanonicalName* library_reference = reader->ReadCanonicalNameReference(); |
+ intptr_t library_reference = reader->ReadCanonicalNameReference(); |
return new Name(name_index, library_reference); |
} else { |
return new Name(name_index, NULL); |
@@ -1432,7 +1423,7 @@ VoidType* VoidType::ReadFrom(Reader* reader) { |
InterfaceType* InterfaceType::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
- CanonicalName* klass_name = Reference::ReadClassFrom(reader); |
+ intptr_t klass_name = Reference::ReadClassFrom(reader); |
InterfaceType* type = new InterfaceType(klass_name); |
type->type_arguments().ReadFromStatic<DartType>(reader); |
return type; |
@@ -1442,7 +1433,7 @@ InterfaceType* InterfaceType::ReadFrom(Reader* reader) { |
InterfaceType* InterfaceType::ReadFrom(Reader* reader, |
bool _without_type_arguments_) { |
TRACE_READ_OFFSET(); |
- CanonicalName* klass_name = Reference::ReadClassFrom(reader); |
+ intptr_t klass_name = Reference::ReadClassFrom(reader); |
InterfaceType* type = new InterfaceType(klass_name); |
ASSERT(_without_type_arguments_); |
return type; |
@@ -1451,7 +1442,7 @@ InterfaceType* InterfaceType::ReadFrom(Reader* reader, |
TypedefType* TypedefType::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
- CanonicalName* typedef_name = Reference::ReadTypedefFrom(reader); |
+ intptr_t typedef_name = Reference::ReadTypedefFrom(reader); |
TypedefType* type = new TypedefType(typedef_name); |
type->type_arguments().ReadFromStatic<DartType>(reader); |
return type; |
@@ -1504,41 +1495,36 @@ Program* Program::ReadFrom(Reader* reader) { |
if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); |
Program* program = new Program(); |
- program->canonical_name_root_ = CanonicalName::NewRoot(); |
reader->helper()->set_program(program); |
- // Skip the table of string end offsets. |
- reader->MarkStringTableOffset(); |
- intptr_t length = reader->ReadUInt(); |
- reader->string_offsets_ = new intptr_t[length + 1]; |
+ // Deserialize the string offset table to give fast access to the string data |
+ // during deserialization. |
+ program->string_table_offset_ = reader->offset(); |
+ intptr_t string_count = reader->ReadUInt(); |
+ reader->string_offsets_ = new intptr_t[string_count + 1]; |
intptr_t offset = 0; |
- for (intptr_t i = 0; i < length; ++i) { |
+ for (intptr_t i = 0; i < string_count; ++i) { |
reader->string_offsets_[i] = offset; |
offset = reader->ReadUInt(); |
} |
- reader->string_offsets_[length] = offset; |
+ reader->string_offsets_[string_count] = offset; |
// Skip the UTF-8 encoded strings. |
reader->MarkStringDataOffset(); |
reader->Consume(offset); |
- program->string_table_offset_ = reader->string_table_offset(); |
- ASSERT(program->string_table_offset_ >= 0); |
program->source_table_.ReadFrom(reader); |
- int canonical_names = reader->ReadUInt(); |
- reader->helper()->SetCanonicalNameCount(canonical_names); |
- for (int i = 0; i < canonical_names; ++i) { |
- int biased_parent_index = reader->ReadUInt(); |
- CanonicalName* parent; |
- if (biased_parent_index != 0) { |
- parent = reader->helper()->GetCanonicalName(biased_parent_index - 1); |
- } else { |
- parent = program->canonical_name_root(); |
- } |
- ASSERT(parent != NULL); |
- intptr_t name_index = reader->ReadUInt(); |
- CanonicalName* canonical_name = parent->AddChild(name_index); |
- reader->helper()->SetCanonicalName(i, canonical_name); |
+ // Deserialize the canonical name table to give fast access to canonical names |
+ // during deserialization. |
+ program->name_table_offset_ = reader->offset(); |
+ intptr_t name_count = reader->ReadUInt(); |
+ reader->canonical_name_parents_ = new intptr_t[name_count]; |
+ reader->canonical_name_strings_ = new intptr_t[name_count]; |
+ for (int i = 0; i < name_count; ++i) { |
+ // The parent name index is biased: 0 is the root name and otherwise N+1 is |
+ // the Nth name. |
+ reader->canonical_name_parents_[i] = reader->ReadUInt() - 1; |
+ reader->canonical_name_strings_[i] = reader->ReadUInt(); |
} |
int libraries = reader->ReadUInt(); |