diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md index dc2228c965a..865beb67705 100644 --- a/pkg/kernel/binary.md +++ b/pkg/kernel/binary.md @@ -131,7 +131,7 @@ type CanonicalName { type ComponentFile { UInt32 magic = 0x90ABCDEF; - UInt32 formatVersion = 14; + UInt32 formatVersion = 15; Library[] libraries; UriSource sourceMap; List canonicalNames; @@ -373,8 +373,8 @@ type Procedure extends Member { Name name; List annotations; // Only present if the 'isForwardingStub' flag is set. - Option forwardingStubSuperTarget; - Option forwardingStubInterfaceTarget; + MemberReference forwardingStubSuperTarget; // May be NullReference. + MemberReference forwardingStubInterfaceTarget; // May be NullReference. // Can only be absent if abstract, but tag is there anyway. Option function; } @@ -886,7 +886,7 @@ type StringConstant extends Constant { type SymbolConstant extends Constant { Byte tag = 5; - Option library; + LibraryReference library; // May be NullReference. StringReference name; } diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart index 219bd73ecc7..0c9b61b68c4 100644 --- a/pkg/kernel/lib/binary/ast_from_binary.dart +++ b/pkg/kernel/lib/binary/ast_from_binary.dart @@ -216,10 +216,7 @@ class BinaryBuilder { case ConstantTag.StringConstant: return new StringConstant(readStringReference()); case ConstantTag.SymbolConstant: - Reference libraryReference; - if (readAndCheckOptionTag()) { - libraryReference = readLibraryReference(); - } + Reference libraryReference = readLibraryReference(allowNull: true); return new SymbolConstant(readStringReference(), libraryReference); case ConstantTag.MapConstant: final DartType keyType = readDartType(); @@ -1113,9 +1110,9 @@ class BinaryBuilder { (kind == ProcedureKind.Factory && functionNodeSize <= 50) || _disableLazyReading; var forwardingStubSuperTargetReference = - readAndCheckOptionTag() ? readMemberReference() : null; + readMemberReference(allowNull: true); var forwardingStubInterfaceTargetReference = - readAndCheckOptionTag() ? readMemberReference() : null; + readMemberReference(allowNull: true); var function = readFunctionNodeOption(!readFunctionNodeNow, endOffset); var transformerFlags = getAndResetTransformerFlags(); assert(((_) => true)(debugPath.removeLast())); diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart index c81071904f9..892a72b0b31 100644 --- a/pkg/kernel/lib/binary/ast_to_binary.dart +++ b/pkg/kernel/lib/binary/ast_to_binary.dart @@ -203,7 +203,7 @@ class BinaryPrinter implements Visitor, BinarySink { writeStringReference(constant.value); } else if (constant is SymbolConstant) { writeByte(ConstantTag.SymbolConstant); - writeOptionalReference(constant.libraryReference); + writeNullAllowedReference(constant.libraryReference); writeStringReference(constant.name); } else if (constant is MapConstant) { writeByte(ConstantTag.MapConstant); @@ -459,15 +459,6 @@ class BinaryPrinter implements Visitor, BinarySink { } } - void writeOptionalReference(Reference ref) { - if (ref == null) { - writeByte(Tag.Nothing); - } else { - writeByte(Tag.Something); - writeNonNullReference(ref); - } - } - void writeLinkTable(Component component) { _binaryOffsetForLinkTable = getBufferOffset(); writeList(_canonicalNameList, writeCanonicalNameEntry); @@ -1107,8 +1098,8 @@ class BinaryPrinter implements Visitor, BinarySink { writeByte(node.flags); writeName(node.name ?? _emptyName); writeAnnotationList(node.annotations); - writeOptionalReference(node.forwardingStubSuperTargetReference); - writeOptionalReference(node.forwardingStubInterfaceTargetReference); + writeNullAllowedReference(node.forwardingStubSuperTargetReference); + writeNullAllowedReference(node.forwardingStubInterfaceTargetReference); writeOptionalFunctionNode(node.function); leaveScope(memberScope: true); diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart index 9ce8617c2ec..a53ccc70bf8 100644 --- a/pkg/kernel/lib/binary/tag.dart +++ b/pkg/kernel/lib/binary/tag.dart @@ -136,7 +136,7 @@ class Tag { /// Internal version of kernel binary format. /// Bump it when making incompatible changes in kernel binaries. /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md. - static const int BinaryFormatVersion = 14; + static const int BinaryFormatVersion = 15; } abstract class ConstantTag { diff --git a/runtime/vm/compiler/frontend/constant_evaluator.cc b/runtime/vm/compiler/frontend/constant_evaluator.cc index 8ca57ab6305..8d1c6da5888 100644 --- a/runtime/vm/compiler/frontend/constant_evaluator.cc +++ b/runtime/vm/compiler/frontend/constant_evaluator.cc @@ -1169,12 +1169,11 @@ const Array& ConstantHelper::ReadConstantTable() { break; } case kSymbolConstant: { - Tag initializer_tag = helper_.ReadTag(); - if (initializer_tag == kSomething) { - const NameIndex index = helper_.ReadCanonicalNameReference(); - temp_library_ = H.LookupLibraryByKernelLibrary(index); - } else { + const NameIndex index = helper_.ReadCanonicalNameReference(); + if (index == -1) { temp_library_ = Library::null(); + } else { + temp_library_ = H.LookupLibraryByKernelLibrary(index); } const String& symbol = H.DartIdentifier(temp_library_, helper_.ReadStringReference()); diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc index 2a2b8393b40..b6a21647fba 100644 --- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc +++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc @@ -1024,20 +1024,17 @@ void ProcedureHelper::ReadUntilExcluding(Field field) { } /* Falls through */ case kForwardingStubSuperTarget: - if (helper_->ReadTag() == kSomething) { - forwarding_stub_super_target_ = helper_->ReadCanonicalNameReference(); - } + forwarding_stub_super_target_ = helper_->ReadCanonicalNameReference(); if (++next_read_ == field) return; /* Falls through */ case kForwardingStubInterfaceTarget: - if (helper_->ReadTag() == kSomething) { - helper_->ReadCanonicalNameReference(); - } + helper_->ReadCanonicalNameReference(); if (++next_read_ == field) return; /* Falls through */ case kFunction: - if (helper_->ReadTag() == kSomething) + if (helper_->ReadTag() == kSomething) { helper_->SkipFunctionNode(); // read function node. + } if (++next_read_ == field) return; /* Falls through */ case kEnd: diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h index 89e9cc69e9d..ddc9884bbe3 100644 --- a/runtime/vm/kernel_binary.h +++ b/runtime/vm/kernel_binary.h @@ -17,7 +17,7 @@ namespace kernel { // package:kernel/binary.md. static const uint32_t kMagicProgramFile = 0x90ABCDEFu; -static const uint32_t kBinaryFormatVersion = 14; +static const uint32_t kBinaryFormatVersion = 15; // Keep in sync with package:kernel/lib/binary/tag.dart #define KERNEL_TAG_LIST(V) \