@@ -127,6 +127,18 @@ class _FieldSet {
127127 return value;
128128 }
129129
130+ List <T > _getDefaultList <T >(FieldInfo <T > fi) {
131+ assert (fi.isRepeated);
132+ if (_isReadOnly) return const [];
133+
134+ // TODO(skybrian) we could avoid this by generating another
135+ // method for repeated fields:
136+ // msg.mutableFoo().add(123);
137+ var value = fi._createRepeatedFieldWithType <T >(_message);
138+ _setNonExtensionFieldUnchecked (fi, value);
139+ return value;
140+ }
141+
130142 _getFieldOrNullByTag (int tagNumber) {
131143 var fi = _getFieldInfoOrNull (tagNumber);
132144 if (fi == null ) return null ;
@@ -256,6 +268,13 @@ class _FieldSet {
256268 return _getDefault (_nonExtensionInfoByIndex (index)) as T ;
257269 }
258270
271+ /// The implementation of a generated getter for repeated fields.
272+ List <T > _$getList <T >(int index) {
273+ var value = _values[index];
274+ if (value != null ) return value as List <T >;
275+ return _getDefaultList <T >(_nonExtensionInfoByIndex (index));
276+ }
277+
259278 /// The implementation of a generated getter for String fields.
260279 String _$getS (int index, String defaultValue) {
261280 var value = _values[index];
@@ -520,14 +539,14 @@ class _FieldSet {
520539 if (mustClone) {
521540 // fieldValue must be a PbList of GeneratedMessage.
522541 PbList <GeneratedMessage > pbList = fieldValue;
523- // Copy the mapped values to a List to avoid redundant cloning (since
524- // PbList.addAll iterates over its argument twice).
525- _ensureRepeatedField (fi)
526- . addAll ( new List . from (pbList. map (_cloneMessage)));
542+ var repeatedFields = fi. _ensureRepeatedField ( this );
543+ for ( int i = 0 ; i < pbList.length; ++ i) {
544+ repeatedFields. add ( _cloneMessage (pbList[i]));
545+ }
527546 } else {
528547 // fieldValue must be at least a PbList.
529548 PbList pbList = fieldValue;
530- _ensureRepeatedField (fi ).addAll (pbList);
549+ fi. _ensureRepeatedField (this ).addAll (pbList);
531550 }
532551 return ;
533552 }
0 commit comments