Remove writeOptionalReference
References can be null --- it's written as the byte [0].
Thus in the null case it would before be [0] and now be [0].
In the non-null case it would before be [1, xyz] (1 for Tag.Something
and xyz for the actual, now positive, uint30). Now it would be [xyz].
Change-Id: Ibc08d3afb7275b0429a4d6c5e667fbd381121489
Reviewed-on: https://dart-review.googlesource.com/c/85394
Reviewed-by: Kevin Millikin <kmillikin@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index dc2228c..865beb6 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -131,7 +131,7 @@
type ComponentFile {
UInt32 magic = 0x90ABCDEF;
- UInt32 formatVersion = 14;
+ UInt32 formatVersion = 15;
Library[] libraries;
UriSource sourceMap;
List<CanonicalName> canonicalNames;
@@ -373,8 +373,8 @@
Name name;
List<Expression> annotations;
// Only present if the 'isForwardingStub' flag is set.
- Option<MemberReference> forwardingStubSuperTarget;
- Option<MemberReference> forwardingStubInterfaceTarget;
+ MemberReference forwardingStubSuperTarget; // May be NullReference.
+ MemberReference forwardingStubInterfaceTarget; // May be NullReference.
// Can only be absent if abstract, but tag is there anyway.
Option<FunctionNode> function;
}
@@ -886,7 +886,7 @@
type SymbolConstant extends Constant {
Byte tag = 5;
- Option<LibraryReference> 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 219bd73..0c9b61b 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -216,10 +216,7 @@
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 @@
(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 c810719..892a72b 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -203,7 +203,7 @@
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 @@
}
}
- 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 @@
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 9ce8617..a53ccc7 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -136,7 +136,7 @@
/// 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 8ca57ab..8d1c6da 100644
--- a/runtime/vm/compiler/frontend/constant_evaluator.cc
+++ b/runtime/vm/compiler/frontend/constant_evaluator.cc
@@ -1169,12 +1169,11 @@
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 2a2b839..b6a2164 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -1024,20 +1024,17 @@
}
/* 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 89e9cc6..ddc9884 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -17,7 +17,7 @@
// 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) \