Index: runtime/vm/kernel_binary.cc |
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc |
index 220355deebc327ddd04a3269cca27296af7d895b..b57fef26f69effad369c89acb5f4dfd7545ab751 100644 |
--- a/runtime/vm/kernel_binary.cc |
+++ b/runtime/vm/kernel_binary.cc |
@@ -87,9 +87,12 @@ void TypeParameterList::ReadFrom(Reader* reader) { |
reader->helper()->type_parameters().Push(parameter); |
} |
- // Read all [TypeParameter]s and their bounds. |
- for (intptr_t i = 0; i < length; i++) { |
- (*this)[i]->ReadFrom(reader); |
+ if (length > 0) { |
+ // Read all [TypeParameter]s and their bounds. |
+ for (intptr_t i = 0; i < length; i++) { |
+ (*this)[i]->ReadFrom(reader); |
+ } |
+ first_offset = (*this)[0]->kernel_offset_; |
} |
} |
@@ -322,6 +325,7 @@ Field* Field::ReadFrom(Reader* reader) { |
position_ = reader->ReadPosition(false); |
end_position_ = reader->ReadPosition(false); |
flags_ = reader->ReadFlags(); |
+ reader->ReadUInt(); // parent class binary offset (or 0). |
name_ = Name::ReadFrom(reader); |
source_uri_index_ = reader->ReadUInt(); |
reader->set_current_script_id(source_uri_index_); |
@@ -340,6 +344,7 @@ Field* Field::ReadFrom(Reader* reader) { |
Constructor* Constructor::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
+ kernel_offset_ = reader->offset(); // Notice the ReadTag() below. |
Tag tag = reader->ReadTag(); |
ASSERT(tag == kConstructor); |
@@ -348,6 +353,7 @@ Constructor* Constructor::ReadFrom(Reader* reader) { |
position_ = reader->ReadPosition(); |
end_position_ = reader->ReadPosition(); |
flags_ = reader->ReadFlags(); |
+ reader->ReadUInt(); // parent class binary offset. |
name_ = Name::ReadFrom(reader); |
annotations_.ReadFromStatic<Expression>(reader); |
function_ = FunctionNode::ReadFrom(reader); |
@@ -362,6 +368,7 @@ Constructor* Constructor::ReadFrom(Reader* reader) { |
Procedure* Procedure::ReadFrom(Reader* reader) { |
TRACE_READ_OFFSET(); |
+ kernel_offset_ = reader->offset(); // Notice the ReadTag() below. |
Tag tag = reader->ReadTag(); |
ASSERT(tag == kProcedure); |
@@ -371,6 +378,7 @@ Procedure* Procedure::ReadFrom(Reader* reader) { |
end_position_ = reader->ReadPosition(false); |
kind_ = static_cast<ProcedureKind>(reader->ReadByte()); |
flags_ = reader->ReadFlags(); |
+ reader->ReadUInt(); // parent class binary offset (or 0). |
name_ = Name::ReadFrom(reader); |
source_uri_index_ = reader->ReadUInt(); |
reader->set_current_script_id(source_uri_index_); |
@@ -586,7 +594,8 @@ VariableGet* VariableGet::ReadFrom(Reader* reader) { |
get->position_ = reader->ReadPosition(); |
get->variable_kernel_offset_ = reader->ReadUInt(); |
get->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt()); |
- ASSERT(get->variable_->kernel_offset() == get->variable_kernel_offset_); |
+ ASSERT(get->variable_->kernel_offset_no_tag() == |
+ get->variable_kernel_offset_); |
reader->ReadOptional<DartType>(); // Unused promoted type. |
return get; |
} |
@@ -599,7 +608,8 @@ VariableGet* VariableGet::ReadFrom(Reader* reader, uint8_t payload) { |
get->position_ = reader->ReadPosition(); |
get->variable_kernel_offset_ = reader->ReadUInt(); |
get->variable_ = reader->helper()->variables().Lookup(payload); |
- ASSERT(get->variable_->kernel_offset() == get->variable_kernel_offset_); |
+ ASSERT(get->variable_->kernel_offset_no_tag() == |
+ get->variable_kernel_offset_); |
return get; |
} |
@@ -611,7 +621,8 @@ VariableSet* VariableSet::ReadFrom(Reader* reader) { |
set->position_ = reader->ReadPosition(); |
set->variable_kernel_offset_ = reader->ReadUInt(); |
set->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt()); |
- ASSERT(set->variable_->kernel_offset() == set->variable_kernel_offset_); |
+ ASSERT(set->variable_->kernel_offset_no_tag() == |
+ set->variable_kernel_offset_); |
set->expression_ = Expression::ReadFrom(reader); |
set->can_stream_ = set->expression_->can_stream(); |
@@ -627,7 +638,8 @@ VariableSet* VariableSet::ReadFrom(Reader* reader, uint8_t payload) { |
set->variable_ = reader->helper()->variables().Lookup(payload); |
set->position_ = reader->ReadPosition(); |
set->variable_kernel_offset_ = reader->ReadUInt(); |
- ASSERT(set->variable_->kernel_offset() == set->variable_kernel_offset_); |
+ ASSERT(set->variable_->kernel_offset_no_tag() == |
+ set->variable_kernel_offset_); |
set->expression_ = Expression::ReadFrom(reader); |
set->can_stream_ = set->expression_->can_stream(); |
@@ -1542,6 +1554,7 @@ VariableDeclaration* VariableDeclaration::ReadFromImpl(Reader* reader, |
VariableDeclaration* decl = new VariableDeclaration(); |
// -1 or -0 depending on whether there's a tag or not. |
decl->kernel_offset_ = reader->offset() - (read_tag ? 1 : 0); |
+ decl->kernel_offset_no_tag_ = reader->offset(); |
decl->position_ = reader->ReadPosition(); |
decl->equals_position_ = reader->ReadPosition(); |
decl->flags_ = reader->ReadFlags(); |
@@ -1781,7 +1794,10 @@ FunctionNode* FunctionNode::ReadFrom(Reader* reader) { |
TypeParameterScope<ReaderHelper> scope(reader->helper()); |
FunctionNode* function = new FunctionNode(); |
- function->kernel_offset_ = reader->offset(); // FunctionNode has no tag. |
+ // FunctionNode tag not read yet. |
+ function->kernel_offset_ = reader->offset(); |
+ Tag tag = reader->ReadTag(); |
+ ASSERT(tag == kFunctionNode); |
function->position_ = reader->ReadPosition(); |
function->end_position_ = reader->ReadPosition(); |
function->async_marker_ = |