diff --git a/protobuf/lib/protobuf.dart b/protobuf/lib/protobuf.dart index 67bfad99..f68e779a 100644 --- a/protobuf/lib/protobuf.dart +++ b/protobuf/lib/protobuf.dart @@ -17,6 +17,7 @@ export 'src/protobuf/internal.dart' FieldSetInternalExtension, GeneratedMessageInternalExtension, MapFieldInfoInternalExtension, + checkNotNull, mapKeyFieldNumber, mapValueFieldNumber, mergeFromProto3JsonAny, diff --git a/protobuf/lib/src/protobuf/builder_info.dart b/protobuf/lib/src/protobuf/builder_info.dart index c07877c3..5d1019e7 100644 --- a/protobuf/lib/src/protobuf/builder_info.dart +++ b/protobuf/lib/src/protobuf/builder_info.dart @@ -372,7 +372,7 @@ class BuilderInfo { tagNumber, name, fieldType, - _checkNotNull, + checkNotNull, subBuilder, valueOf, enumValues, @@ -398,7 +398,7 @@ class BuilderInfo { tagNumber, name, fieldType, - _checkNotNull, + checkNotNull, null, valueOf, enumValues, @@ -456,7 +456,7 @@ class BuilderInfo { tagNumber, name, PbFieldType.PM, - _checkNotNull, + checkNotNull, subBuilder, null, null, diff --git a/protobuf/lib/src/protobuf/coded_buffer.dart b/protobuf/lib/src/protobuf/coded_buffer.dart index 5c8fb082..2a97d51e 100644 --- a/protobuf/lib/src/protobuf/coded_buffer.dart +++ b/protobuf/lib/src/protobuf/coded_buffer.dart @@ -117,59 +117,59 @@ void _mergeFromCodedBufferReader( if (wireType == WIRETYPE_LENGTH_DELIMITED) { final limit = input.readInt32(); if (limit != 0) { - list._checkModifiable('add'); + list.checkModifiable('add'); // No need to check the element as for `bool` fields we only need to // check that the value is not null, and we know in `add` below that // the value isn't null (`readBool` doesn't return `null`). input._withLimit(limit, () { while (!input.isAtEnd()) { - list._addUnchecked(input.readBool()); + list.addUnchecked(input.readBool()); } }); } } else { - list._checkModifiable('add'); - list._addUnchecked(input.readBool()); + list.checkModifiable('add'); + list.addUnchecked(input.readBool()); } case PbFieldType.REPEATED_BYTES: final list = fs._ensureRepeatedField(meta, fi); - list._checkModifiable('add'); - list._addUnchecked(input.readBytes()); + list.checkModifiable('add'); + list.addUnchecked(input.readBytes()); case PbFieldType.REPEATED_STRING: final list = fs._ensureRepeatedField(meta, fi); - list._checkModifiable('add'); - list._addUnchecked(input.readString()); + list.checkModifiable('add'); + list.addUnchecked(input.readString()); case PbFieldType.REPEATED_FLOAT: final list = fs._ensureRepeatedField(meta, fi); if (wireType == WIRETYPE_LENGTH_DELIMITED) { final limit = input.readInt32(); if (limit != 0) { - list._checkModifiable('add'); + list.checkModifiable('add'); input._withLimit(limit, () { while (!input.isAtEnd()) { - list._addUnchecked(input.readFloat()); + list.addUnchecked(input.readFloat()); } }); } } else { - list._checkModifiable('add'); - list._addUnchecked(input.readFloat()); + list.checkModifiable('add'); + list.addUnchecked(input.readFloat()); } case PbFieldType.REPEATED_DOUBLE: final list = fs._ensureRepeatedField(meta, fi); if (wireType == WIRETYPE_LENGTH_DELIMITED) { final limit = input.readInt32(); if (limit != 0) { - list._checkModifiable('add'); + list.checkModifiable('add'); input._withLimit(limit, () { while (!input.isAtEnd()) { - list._addUnchecked(input.readDouble()); + list.addUnchecked(input.readDouble()); } }); } } else { - list._checkModifiable('add'); - list._addUnchecked(input.readDouble()); + list.checkModifiable('add'); + list.addUnchecked(input.readDouble()); } case PbFieldType.REPEATED_ENUM: final list = fs._ensureRepeatedField(meta, fi); @@ -192,160 +192,160 @@ void _mergeFromCodedBufferReader( if (wireType == WIRETYPE_LENGTH_DELIMITED) { final limit = input.readInt32(); if (limit != 0) { - list._checkModifiable('add'); + list.checkModifiable('add'); input._withLimit(limit, () { while (!input.isAtEnd()) { - list._addUnchecked(input.readInt32()); + list.addUnchecked(input.readInt32()); } }); } } else { - list._checkModifiable('add'); - list._addUnchecked(input.readInt32()); + list.checkModifiable('add'); + list.addUnchecked(input.readInt32()); } case PbFieldType.REPEATED_INT64: final list = fs._ensureRepeatedField(meta, fi); if (wireType == WIRETYPE_LENGTH_DELIMITED) { final limit = input.readInt32(); if (limit != 0) { - list._checkModifiable('add'); + list.checkModifiable('add'); input._withLimit(limit, () { while (!input.isAtEnd()) { - list._addUnchecked(input.readInt64()); + list.addUnchecked(input.readInt64()); } }); } } else { - list._checkModifiable('add'); - list._addUnchecked(input.readInt64()); + list.checkModifiable('add'); + list.addUnchecked(input.readInt64()); } case PbFieldType.REPEATED_SINT32: final list = fs._ensureRepeatedField(meta, fi); if (wireType == WIRETYPE_LENGTH_DELIMITED) { final limit = input.readInt32(); if (limit != 0) { - list._checkModifiable('add'); + list.checkModifiable('add'); input._withLimit(limit, () { while (!input.isAtEnd()) { - list._addUnchecked(input.readSint32()); + list.addUnchecked(input.readSint32()); } }); } } else { - list._checkModifiable('add'); - list._addUnchecked(input.readSint32()); + list.checkModifiable('add'); + list.addUnchecked(input.readSint32()); } case PbFieldType.REPEATED_SINT64: final list = fs._ensureRepeatedField(meta, fi); if (wireType == WIRETYPE_LENGTH_DELIMITED) { final limit = input.readInt32(); if (limit != 0) { - list._checkModifiable('add'); + list.checkModifiable('add'); input._withLimit(limit, () { while (!input.isAtEnd()) { - list._addUnchecked(input.readSint64()); + list.addUnchecked(input.readSint64()); } }); } } else { - list._checkModifiable('add'); - list._addUnchecked(input.readSint64()); + list.checkModifiable('add'); + list.addUnchecked(input.readSint64()); } case PbFieldType.REPEATED_UINT32: final list = fs._ensureRepeatedField(meta, fi); if (wireType == WIRETYPE_LENGTH_DELIMITED) { final limit = input.readInt32(); if (limit != 0) { - list._checkModifiable('add'); + list.checkModifiable('add'); input._withLimit(limit, () { while (!input.isAtEnd()) { - list._addUnchecked(input.readUint32()); + list.addUnchecked(input.readUint32()); } }); } } else { - list._checkModifiable('add'); - list._addUnchecked(input.readUint32()); + list.checkModifiable('add'); + list.addUnchecked(input.readUint32()); } case PbFieldType.REPEATED_UINT64: final list = fs._ensureRepeatedField(meta, fi); if (wireType == WIRETYPE_LENGTH_DELIMITED) { final limit = input.readInt32(); if (limit != 0) { - list._checkModifiable('add'); + list.checkModifiable('add'); input._withLimit(limit, () { while (!input.isAtEnd()) { - list._addUnchecked(input.readUint64()); + list.addUnchecked(input.readUint64()); } }); } } else { - list._checkModifiable('add'); - list._addUnchecked(input.readUint64()); + list.checkModifiable('add'); + list.addUnchecked(input.readUint64()); } case PbFieldType.REPEATED_FIXED32: final list = fs._ensureRepeatedField(meta, fi); if (wireType == WIRETYPE_LENGTH_DELIMITED) { final limit = input.readInt32(); if (limit != 0) { - list._checkModifiable('add'); + list.checkModifiable('add'); input._withLimit(limit, () { while (!input.isAtEnd()) { - list._addUnchecked(input.readFixed32()); + list.addUnchecked(input.readFixed32()); } }); } } else { - list._checkModifiable('add'); - list._addUnchecked(input.readFixed32()); + list.checkModifiable('add'); + list.addUnchecked(input.readFixed32()); } case PbFieldType.REPEATED_FIXED64: final list = fs._ensureRepeatedField(meta, fi); if (wireType == WIRETYPE_LENGTH_DELIMITED) { final limit = input.readInt32(); if (limit != 0) { - list._checkModifiable('add'); + list.checkModifiable('add'); input._withLimit(limit, () { while (!input.isAtEnd()) { - list._addUnchecked(input.readFixed64()); + list.addUnchecked(input.readFixed64()); } }); } } else { - list._checkModifiable('add'); - list._addUnchecked(input.readFixed64()); + list.checkModifiable('add'); + list.addUnchecked(input.readFixed64()); } case PbFieldType.REPEATED_SFIXED32: final list = fs._ensureRepeatedField(meta, fi); if (wireType == WIRETYPE_LENGTH_DELIMITED) { final limit = input.readInt32(); if (limit != 0) { - list._checkModifiable('add'); + list.checkModifiable('add'); input._withLimit(limit, () { while (!input.isAtEnd()) { - list._addUnchecked(input.readSfixed32()); + list.addUnchecked(input.readSfixed32()); } }); } } else { - list._checkModifiable('add'); - list._addUnchecked(input.readSfixed32()); + list.checkModifiable('add'); + list.addUnchecked(input.readSfixed32()); } case PbFieldType.REPEATED_SFIXED64: final list = fs._ensureRepeatedField(meta, fi); if (wireType == WIRETYPE_LENGTH_DELIMITED) { final limit = input.readInt32(); if (limit != 0) { - list._checkModifiable('add'); + list.checkModifiable('add'); input._withLimit(limit, () { while (!input.isAtEnd()) { - list._addUnchecked(input.readSfixed64()); + list.addUnchecked(input.readSfixed64()); } }); } } else { - list._checkModifiable('add'); - list._addUnchecked(input.readSfixed64()); + list.checkModifiable('add'); + list.addUnchecked(input.readSfixed64()); } case PbFieldType.REPEATED_MESSAGE: final subMessage = meta._makeEmptyMessage(tagNumber, registry); diff --git a/protobuf/lib/src/protobuf/extension_field_set.dart b/protobuf/lib/src/protobuf/extension_field_set.dart index c61a0ea0..fc73fc30 100644 --- a/protobuf/lib/src/protobuf/extension_field_set.dart +++ b/protobuf/lib/src/protobuf/extension_field_set.dart @@ -235,7 +235,7 @@ class ExtensionFieldSet { newValues[tag] = map?._deepCopy(); } else if (fieldInfo.isRepeated) { final PbList? list = value; - newValues[tag] = list?._deepCopy(); + newValues[tag] = list?.deepCopy(); } else if (fieldInfo.isGroupOrMessage) { final GeneratedMessage? message = value; newValues[tag] = message?.deepCopy(); diff --git a/protobuf/lib/src/protobuf/field_error.dart b/protobuf/lib/src/protobuf/field_error.dart index 0381cc75..c6d7e40c 100644 --- a/protobuf/lib/src/protobuf/field_error.dart +++ b/protobuf/lib/src/protobuf/field_error.dart @@ -89,7 +89,7 @@ CheckFunc getCheckFunction(int fieldType) { // We always use the full range of the same Dart type. // It's up to the caller to treat the Int64 as signed or unsigned. // See: https://github.com/google/protobuf.dart/issues/44 - return _checkNotNull; + return checkNotNull; case PbFieldType.FLOAT_BIT: return _checkFloat; @@ -108,7 +108,7 @@ CheckFunc getCheckFunction(int fieldType) { // check functions for repeated fields -void _checkNotNull(Object? val) { +void checkNotNull(Object? val) { if (val == null) { throw ArgumentError("Can't add a null to a repeated field"); } diff --git a/protobuf/lib/src/protobuf/field_set.dart b/protobuf/lib/src/protobuf/field_set.dart index 66cd91ac..eb90a79b 100644 --- a/protobuf/lib/src/protobuf/field_set.dart +++ b/protobuf/lib/src/protobuf/field_set.dart @@ -957,7 +957,7 @@ class FieldSet { } else if (fieldInfo.isRepeated) { final PbList? originalList = original._values[index]; if (originalList == null) continue; - _values[index] = originalList._deepCopy(); + _values[index] = originalList.deepCopy(); } else if (fieldInfo.isGroupOrMessage) { final GeneratedMessage? message = original._values[index]; _values[index] = message?.deepCopy(); diff --git a/protobuf/lib/src/protobuf/internal.dart b/protobuf/lib/src/protobuf/internal.dart index e0583621..f8e9eda7 100644 --- a/protobuf/lib/src/protobuf/internal.dart +++ b/protobuf/lib/src/protobuf/internal.dart @@ -7,7 +7,7 @@ /// [1]: https://developers.google.com/protocol-buffers library; -import 'dart:collection' show ListBase, MapBase; +import 'dart:collection' show MapBase; import 'dart:convert' show Utf8Decoder, Utf8Encoder, base64Decode, base64Encode; import 'dart:math' as math; import 'dart:typed_data' show ByteData, Endian, Uint8List; @@ -20,10 +20,12 @@ import 'consts.dart'; import 'json/json.dart' as json_lib; import 'json_parsing_context.dart'; import 'mixins/well_known.dart'; +import 'pb_list.dart'; import 'permissive_compare.dart'; import 'type_registry.dart'; import 'utils.dart'; +export 'pb_list.dart' show PbList; export 'type_registry.dart' show TypeRegistry; part 'annotations.dart'; @@ -42,7 +44,6 @@ part 'field_type.dart'; part 'generated_message.dart'; part 'generated_service.dart'; part 'message_set.dart'; -part 'pb_list.dart'; part 'pb_map.dart'; part 'proto3_json.dart'; part 'protobuf_enum.dart'; diff --git a/protobuf/lib/src/protobuf/pb_list.dart b/protobuf/lib/src/protobuf/pb_list.dart index 04712780..4736f6c3 100644 --- a/protobuf/lib/src/protobuf/pb_list.dart +++ b/protobuf/lib/src/protobuf/pb_list.dart @@ -2,7 +2,11 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -part of 'internal.dart'; +import 'dart:collection' show ListBase; +import 'dart:math' as math; + +import 'internal.dart'; +import 'utils.dart'; /// Type of a function that checks items added to a `PbList`. /// @@ -31,18 +35,18 @@ class PbList extends ListBase { bool get isFrozen => _isReadOnly; - PbList({CheckFunc check = _checkNotNull}) + PbList({CheckFunc check = checkNotNull}) : _wrappedList = [], _check = check; PbList.unmodifiable() : _wrappedList = _emptyList, - _check = _checkNotNull, + _check = checkNotNull, _isReadOnly = true; PbList.from(Iterable from) : _wrappedList = List.of(from), - _check = _checkNotNull; + _check = checkNotNull; @override @pragma('dart2js:never-inline') @@ -251,3 +255,20 @@ class PbList extends ListBase { return newList; } } + +extension PbListInternalExtension on PbList { + @pragma('dart2js:tryInline') + @pragma('vm:prefer-inline') + @pragma('wasm:prefer-inline') + void checkModifiable(String methodName) => _checkModifiable(methodName); + + @pragma('dart2js:tryInline') + @pragma('vm:prefer-inline') + @pragma('wasm:prefer-inline') + void addUnchecked(E element) => _addUnchecked(element); + + @pragma('dart2js:tryInline') + @pragma('vm:prefer-inline') + @pragma('wasm:prefer-inline') + PbList deepCopy() => _deepCopy(); +}