| Index: runtime/vm/kernel_binary.cc
|
| diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc
|
| index e7f25e92a2606b05ede46cccae1798b409b15d75..dd791b1446b7002797268ef93d7bb737c5306198 100644
|
| --- a/runtime/vm/kernel_binary.cc
|
| +++ b/runtime/vm/kernel_binary.cc
|
| @@ -88,9 +88,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_;
|
| }
|
| }
|
|
|
| @@ -360,6 +363,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_);
|
| @@ -378,6 +382,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);
|
|
|
| @@ -386,6 +391,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);
|
| @@ -400,6 +406,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);
|
|
|
| @@ -409,6 +416,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_);
|
| @@ -624,7 +632,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;
|
| }
|
| @@ -637,7 +646,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;
|
| }
|
|
|
| @@ -649,7 +659,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();
|
| @@ -665,7 +676,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();
|
| @@ -1580,6 +1592,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();
|
| @@ -1819,7 +1832,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_ =
|
|
|