@@ -70,8 +70,8 @@ class _FieldSet {
7070 int ? get _memoizedHashCode =>
7171 _frozenState is int ? _frozenState as int : null ;
7272
73- // Maps a oneof decl index to the tag number which is currently set. If the
74- // index is not present, the oneof field is unset.
73+ /// Maps a ` oneof` field index to the tag number which is currently set. If
74+ /// the index is not present, the oneof field is unset.
7575 final Map <int , int >? _oneofCases;
7676
7777 _FieldSet (this ._message, BuilderInfo meta, this ._eventPlugin)
@@ -217,24 +217,26 @@ class _FieldSet {
217217 return _extensions? ._hasField (tagNumber) ?? false ;
218218 }
219219
220- void _clearField (int ? tagNumber) {
220+ void _clearField (int tagNumber) {
221221 _ensureWritable ();
222222 final meta = _meta;
223- var fi = _nonExtensionInfo (meta, tagNumber);
223+ final fi = _nonExtensionInfo (meta, tagNumber);
224+
224225 if (fi != null ) {
225- // clear a non-extension field
226+ assert (tagNumber == fi.tagNumber);
227+
228+ // Clear a non-extension field
226229 final eventPlugin = _eventPlugin;
227230 if (eventPlugin != null && eventPlugin.hasObservers) {
228231 eventPlugin.beforeClearField (fi);
229232 }
230233 _values[fi.index! ] = null ;
231234
232- if (meta.oneofs.containsKey (fi.tagNumber)) {
233- _oneofCases! .remove (meta.oneofs[fi.tagNumber]);
235+ final oneofIndex = meta.oneofs[tagNumber];
236+ if (oneofIndex != null ) {
237+ _oneofCases! [oneofIndex] = 0 ;
234238 }
235239
236- var oneofIndex = meta.oneofs[fi.tagNumber];
237- if (oneofIndex != null ) _oneofCases! [oneofIndex] = 0 ;
238240 return ;
239241 }
240242
@@ -328,10 +330,13 @@ class _FieldSet {
328330
329331 /// Sets a non-extended field and fires events.
330332 void _setNonExtensionFieldUnchecked (BuilderInfo meta, FieldInfo fi, value) {
331- var tag = fi.tagNumber;
332- var oneofIndex = meta.oneofs[tag];
333+ final tag = fi.tagNumber;
334+ final oneofIndex = meta.oneofs[tag];
333335 if (oneofIndex != null ) {
334- _clearField (_oneofCases! [oneofIndex]);
336+ final currentOneofTag = _oneofCases! [oneofIndex];
337+ if (currentOneofTag != null ) {
338+ _clearField (currentOneofTag);
339+ }
335340 _oneofCases! [oneofIndex] = tag;
336341 }
337342
@@ -488,7 +493,10 @@ class _FieldSet {
488493 var oneofIndex = meta.oneofs[tag];
489494
490495 if (oneofIndex != null ) {
491- _clearField (_oneofCases! [oneofIndex]);
496+ final currentOneofTag = _oneofCases! [oneofIndex];
497+ if (currentOneofTag != null ) {
498+ _clearField (currentOneofTag);
499+ }
492500 _oneofCases! [oneofIndex] = tag;
493501 }
494502 _values[index] = value;
0 commit comments