| 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_ =
|
|
|