Skip to content

Commit 27730db

Browse files
authored
Move PbMap to its own library (#1066)
Continuation to #1063. apitool reports no changes with this PR. Map decoding code moved from `pb_map.dart` to `coded_buffer.dart` to avoid accessing `CodedBufferReader` internals in `PbMap`. It's also more consistent to have all decoding code in `coded_buffer.dart`. We don't have repeated field decoding code in `pb_list.dart`, and `pb_list.dart` and `pb_map.dart` don't have decoders for other formats. Static members `_keyFieldNumber` and `_valueFieldNumber` are removed as they were duplicates of top-level members `mapKeyFieldNumber` and `mapValueFieldNumber`. `deepCopy` is exported as an internal extension to avoid expanding the public API without consideration.
1 parent 9b4c46f commit 27730db

File tree

10 files changed

+40
-40
lines changed

10 files changed

+40
-40
lines changed

protobuf/lib/protobuf.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,5 @@ export 'src/protobuf/internal.dart'
1818
GeneratedMessageInternalExtension,
1919
MapFieldInfoInternalExtension,
2020
checkNotNull,
21-
mapKeyFieldNumber,
22-
mapValueFieldNumber,
2321
mergeFromProto3JsonAny,
2422
writeToProto3JsonAny;

protobuf/lib/src/protobuf/coded_buffer.dart

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -355,15 +355,32 @@ void _mergeFromCodedBufferReader(
355355
case PbFieldType.MAP:
356356
final mapFieldInfo = fi as MapFieldInfo;
357357
final mapEntryMeta = mapFieldInfo.mapEntryBuilderInfo;
358-
fs
359-
._ensureMapField(meta, mapFieldInfo)
360-
._mergeEntry(mapEntryMeta, input, registry);
358+
final map = fs._ensureMapField(meta, mapFieldInfo);
359+
_readMapEntry(map, mapEntryMeta, input, registry);
361360
default:
362361
throw UnsupportedError('Unknown field type $fieldType');
363362
}
364363
}
365364
}
366365

366+
void _readMapEntry(
367+
PbMap map,
368+
BuilderInfo meta,
369+
CodedBufferReader input,
370+
ExtensionRegistry registry,
371+
) {
372+
final length = input.readInt32();
373+
final oldLimit = input._currentLimit;
374+
input._currentLimit = input._bufferPos + length;
375+
final entryFieldSet = FieldSet(null, meta);
376+
_mergeFromCodedBufferReader(meta, entryFieldSet, input, registry);
377+
input.checkLastTagWas(0);
378+
input._currentLimit = oldLimit;
379+
final key = entryFieldSet._values[0] ?? meta.byIndex[0].makeDefault!();
380+
final value = entryFieldSet._values[1] ?? meta.byIndex[1].makeDefault!();
381+
map[key] = value;
382+
}
383+
367384
void _readPackableToListEnum(
368385
List list,
369386
BuilderInfo meta,

protobuf/lib/src/protobuf/coded_buffer_writer.dart

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,9 @@ class CodedBufferWriter {
8888
map.forEach((key, value) {
8989
_writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
9090
final mark = _startLengthDelimited();
91+
_writeValue(mapKeyFieldNumber, map.keyFieldType, key, keyWireFormat);
9192
_writeValue(
92-
PbMap._keyFieldNumber,
93-
map.keyFieldType,
94-
key,
95-
keyWireFormat,
96-
);
97-
_writeValue(
98-
PbMap._valueFieldNumber,
93+
mapValueFieldNumber,
9994
map.valueFieldType,
10095
value,
10196
valueWireFormat,

protobuf/lib/src/protobuf/extension_field_set.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ class ExtensionFieldSet {
232232
final fieldInfo = _info[tag]!;
233233
if (fieldInfo.isMapField) {
234234
final PbMap? map = value;
235-
newValues[tag] = map?._deepCopy();
235+
newValues[tag] = map?.deepCopy();
236236
} else if (fieldInfo.isRepeated) {
237237
final PbList? list = value;
238238
newValues[tag] = list?.deepCopy();

protobuf/lib/src/protobuf/field_info.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ class MapFieldInfo<K, V> extends FieldInfo<PbMap<K, V>?> {
311311
}
312312

313313
FieldInfo get valueFieldInfo =>
314-
mapEntryBuilderInfo.fieldInfo[PbMap._valueFieldNumber]!;
314+
mapEntryBuilderInfo.fieldInfo[mapValueFieldNumber]!;
315315

316316
PbMap<K, V> _ensureMapField(BuilderInfo meta, FieldSet fs) {
317317
return fs._ensureMapField<K, V>(meta, this);

protobuf/lib/src/protobuf/field_set.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -953,7 +953,7 @@ class FieldSet {
953953
if (fieldInfo.isMapField) {
954954
final PbMap? originalMap = original._values[index];
955955
if (originalMap == null) continue;
956-
_values[index] = originalMap._deepCopy();
956+
_values[index] = originalMap.deepCopy();
957957
} else if (fieldInfo.isRepeated) {
958958
final PbList? originalList = original._values[index];
959959
if (originalList == null) continue;

protobuf/lib/src/protobuf/internal.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
/// [1]: https://developers.google.com/protocol-buffers
88
library;
99

10-
import 'dart:collection' show MapBase;
1110
import 'dart:convert' show Utf8Decoder, Utf8Encoder, base64Decode, base64Encode;
1211
import 'dart:math' as math;
1312
import 'dart:typed_data' show ByteData, Endian, Uint8List;
@@ -21,11 +20,13 @@ import 'json/json.dart' as json_lib;
2120
import 'json_parsing_context.dart';
2221
import 'mixins/well_known.dart';
2322
import 'pb_list.dart';
23+
import 'pb_map.dart';
2424
import 'permissive_compare.dart';
2525
import 'type_registry.dart';
2626
import 'utils.dart';
2727

2828
export 'pb_list.dart' show PbList;
29+
export 'pb_map.dart' show PbMap;
2930
export 'type_registry.dart' show TypeRegistry;
3031

3132
part 'annotations.dart';
@@ -44,7 +45,6 @@ part 'field_type.dart';
4445
part 'generated_message.dart';
4546
part 'generated_service.dart';
4647
part 'message_set.dart';
47-
part 'pb_map.dart';
4848
part 'proto3_json.dart';
4949
part 'protobuf_enum.dart';
5050
part 'rpc_client.dart';

protobuf/lib/src/protobuf/json/json.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:fixnum/fixnum.dart' show Int64;
88

99
import '../consts.dart';
1010
import '../internal.dart';
11+
import '../pb_map.dart';
1112
import '../utils.dart';
1213

1314
// Use json_vm.dart with VM and dart2wasm, json_web.dart with dart2js.

protobuf/lib/src/protobuf/json/json_web.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:fixnum/fixnum.dart' show Int64;
1010

1111
import '../consts.dart';
1212
import '../internal.dart';
13+
import '../pb_map.dart';
1314
import '../utils.dart';
1415

1516
@JS('JSON')

protobuf/lib/src/protobuf/pb_map.dart

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
part of 'internal.dart';
5+
import 'dart:collection' show MapBase;
6+
7+
import 'internal.dart';
8+
import 'utils.dart';
69

710
const mapKeyFieldNumber = 1;
811
const mapValueFieldNumber = 2;
@@ -21,9 +24,6 @@ class PbMap<K, V> extends MapBase<K, V> {
2124
/// The `int` value is interpreted the same way as [FieldInfo.type].
2225
final int valueFieldType;
2326

24-
static const int _keyFieldNumber = 1;
25-
static const int _valueFieldNumber = 2;
26-
2727
/// The actual list storing the elements.
2828
///
2929
/// Note: We want only one [Map] implementation class to be stored here to
@@ -103,25 +103,6 @@ class PbMap<K, V> extends MapBase<K, V> {
103103
return _wrappedMap.remove(key);
104104
}
105105

106-
void _mergeEntry(
107-
BuilderInfo mapEntryMeta,
108-
CodedBufferReader input,
109-
ExtensionRegistry registry,
110-
) {
111-
final length = input.readInt32();
112-
final oldLimit = input._currentLimit;
113-
input._currentLimit = input._bufferPos + length;
114-
final entryFieldSet = FieldSet(null, mapEntryMeta);
115-
_mergeFromCodedBufferReader(mapEntryMeta, entryFieldSet, input, registry);
116-
input.checkLastTagWas(0);
117-
input._currentLimit = oldLimit;
118-
final key =
119-
entryFieldSet._values[0] ?? mapEntryMeta.byIndex[0].makeDefault!();
120-
final value =
121-
entryFieldSet._values[1] ?? mapEntryMeta.byIndex[1].makeDefault!();
122-
_wrappedMap[key] = value;
123-
}
124-
125106
PbMap freeze() {
126107
_isReadOnly = true;
127108
if (PbFieldType.isGroupOrMessage(valueFieldType)) {
@@ -147,3 +128,10 @@ class PbMap<K, V> extends MapBase<K, V> {
147128
return newMap;
148129
}
149130
}
131+
132+
extension PbMapInternalExtension<K, V> on PbMap<K, V> {
133+
@pragma('dart2js:tryInline')
134+
@pragma('vm:prefer-inline')
135+
@pragma('wasm:prefer-inline')
136+
PbMap<K, V> deepCopy() => _deepCopy();
137+
}

0 commit comments

Comments
 (0)