Skip to content

Commit

Permalink
Remove cached list
Browse files Browse the repository at this point in the history
It doesn't improve much in AOT, and slows down JS.
  • Loading branch information
osa1 committed Feb 22, 2024
1 parent 7ac5864 commit c5ecd3d
Showing 1 changed file with 18 additions and 29 deletions.
47 changes: 18 additions & 29 deletions protobuf/lib/src/protobuf/coded_buffer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,8 @@ void _mergeFromCodedBufferReader(BuilderInfo meta, _FieldSet fs,
CodedBufferReader input, ExtensionRegistry registry) {
ArgumentError.checkNotNull(registry);
fs._ensureWritable();

// Micro-optimization: cache the storage lookup for repeated fields.
var prevTag = -1;
List? cachedList;

while (true) {
final tag = input.readTag();
// If the current field's tag is different from previous, invalidate cache.
if (tag != prevTag) {
cachedList = null;
prevTag = tag;
}

if (tag == 0) return;
final wireType = tag & 0x7;
final tagNumber = tag >> 3;
Expand Down Expand Up @@ -139,122 +128,122 @@ void _mergeFromCodedBufferReader(BuilderInfo meta, _FieldSet fs,
}
break;
case PbFieldType._REPEATED_BOOL:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
if (wireType == WIRETYPE_LENGTH_DELIMITED) {
_readPacked(input, () => list.add(input.readBool()));
} else {
list.add(input.readBool());
}
break;
case PbFieldType._REPEATED_BYTES:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
list.add(input.readBytes());
break;
case PbFieldType._REPEATED_STRING:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
list.add(input.readString());
break;
case PbFieldType._REPEATED_FLOAT:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
if (wireType == WIRETYPE_LENGTH_DELIMITED) {
_readPacked(input, () => list.add(input.readFloat()));
} else {
list.add(input.readFloat());
}
break;
case PbFieldType._REPEATED_DOUBLE:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
if (wireType == WIRETYPE_LENGTH_DELIMITED) {
_readPacked(input, () => list.add(input.readDouble()));
} else {
list.add(input.readDouble());
}
break;
case PbFieldType._REPEATED_ENUM:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
_readPackableToListEnum(
list, meta, fs, input, wireType, tagNumber, registry);
break;
case PbFieldType._REPEATED_GROUP:
final subMessage = meta._makeEmptyMessage(tagNumber, registry);
input.readGroup(tagNumber, subMessage, registry);
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
list.add(subMessage);
break;
case PbFieldType._REPEATED_INT32:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
if (wireType == WIRETYPE_LENGTH_DELIMITED) {
_readPacked(input, () => list.add(input.readInt32()));
} else {
list.add(input.readInt32());
}
break;
case PbFieldType._REPEATED_INT64:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
if (wireType == WIRETYPE_LENGTH_DELIMITED) {
_readPacked(input, () => list.add(input.readInt64()));
} else {
list.add(input.readInt64());
}
break;
case PbFieldType._REPEATED_SINT32:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
if (wireType == WIRETYPE_LENGTH_DELIMITED) {
_readPacked(input, () => list.add(input.readSint32()));
} else {
list.add(input.readSint32());
}
break;
case PbFieldType._REPEATED_SINT64:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
if (wireType == WIRETYPE_LENGTH_DELIMITED) {
_readPacked(input, () => list.add(input.readSint64()));
} else {
list.add(input.readSint64());
}
break;
case PbFieldType._REPEATED_UINT32:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
if (wireType == WIRETYPE_LENGTH_DELIMITED) {
_readPacked(input, () => list.add(input.readUint32()));
} else {
list.add(input.readUint32());
}
break;
case PbFieldType._REPEATED_UINT64:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
if (wireType == WIRETYPE_LENGTH_DELIMITED) {
_readPacked(input, () => list.add(input.readUint64()));
} else {
list.add(input.readUint64());
}
break;
case PbFieldType._REPEATED_FIXED32:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
if (wireType == WIRETYPE_LENGTH_DELIMITED) {
_readPacked(input, () => list.add(input.readFixed32()));
} else {
list.add(input.readFixed32());
}
break;
case PbFieldType._REPEATED_FIXED64:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
if (wireType == WIRETYPE_LENGTH_DELIMITED) {
_readPacked(input, () => list.add(input.readFixed64()));
} else {
list.add(input.readFixed64());
}
break;
case PbFieldType._REPEATED_SFIXED32:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
if (wireType == WIRETYPE_LENGTH_DELIMITED) {
_readPacked(input, () => list.add(input.readSfixed32()));
} else {
list.add(input.readSfixed32());
}
break;
case PbFieldType._REPEATED_SFIXED64:
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
if (wireType == WIRETYPE_LENGTH_DELIMITED) {
_readPacked(input, () => list.add(input.readSfixed64()));
} else {
Expand All @@ -264,7 +253,7 @@ void _mergeFromCodedBufferReader(BuilderInfo meta, _FieldSet fs,
case PbFieldType._REPEATED_MESSAGE:
final subMessage = meta._makeEmptyMessage(tagNumber, registry);
input.readMessage(subMessage, registry);
final list = cachedList ??= fs._ensureRepeatedField(meta, fi);
final list = fs._ensureRepeatedField(meta, fi);
list.add(subMessage);
break;
case PbFieldType._MAP:
Expand Down

0 comments on commit c5ecd3d

Please sign in to comment.