diff --git a/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/BlobBuilder.cs b/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/BlobBuilder.cs index 21628b52aa48f1..c0adde048c093e 100644 --- a/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/BlobBuilder.cs +++ b/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/BlobBuilder.cs @@ -479,7 +479,12 @@ public void LinkSuffix(BlobBuilder suffix) // The value is not used, other than for calculating the value of Count property. suffix._previousLengthOrFrozenSuffixLengthDelta = suffixPreviousLength + oldSuffixLength - suffix.Length; - if (!isEmpty) + if (isEmpty) + { + var suffixLast = suffix._nextOrPrevious; + _nextOrPrevious = (suffixLast != suffix) ? suffixLast : this; + } + else { // First and last chunks: // diff --git a/src/libraries/System.Reflection.Metadata/tests/Metadata/BlobTests.cs b/src/libraries/System.Reflection.Metadata/tests/Metadata/BlobTests.cs index e0dc3d055c5f0e..2fbffd52e25c04 100644 --- a/src/libraries/System.Reflection.Metadata/tests/Metadata/BlobTests.cs +++ b/src/libraries/System.Reflection.Metadata/tests/Metadata/BlobTests.cs @@ -514,6 +514,48 @@ public void LinkSuffix_Empty3() Assert.Equal(16, builder2.Count); } + [Fact] + public void LinkSuffix_EmptyDestination_SuffixAlreadyLinked() + { + var emptyPrefix = new BlobBuilder(16); + var element = new BlobBuilder(16); + var tail = new BlobBuilder(16); + + element.WriteByte(0x11); + tail.WriteByte(0x22); + + element.LinkSuffix(tail); + emptyPrefix.LinkSuffix(element); + + AssertEx.Equal(new byte[] { 0x11, 0x22 }, emptyPrefix.ToArray()); + Assert.Equal(2, emptyPrefix.Count); + Assert.Equal(2, element.Count); + Assert.Equal(1, tail.Count); + } + + [Fact] + public void LinkSuffix_EmptyDestination_SuffixThreeChunkChain() + { + var emptyPrefix = new BlobBuilder(16); + var first = new BlobBuilder(16); + var second = new BlobBuilder(16); + var third = new BlobBuilder(16); + + first.WriteByte(0x11); + second.WriteByte(0x22); + third.WriteByte(0x33); + + first.LinkSuffix(second); + first.LinkSuffix(third); + emptyPrefix.LinkSuffix(first); + + AssertEx.Equal(new byte[] { 0x11, 0x22, 0x33 }, emptyPrefix.ToArray()); + Assert.Equal(3, emptyPrefix.Count); + Assert.Equal(3, first.Count); + Assert.Equal(1, second.Count); + Assert.Equal(1, third.Count); + } + [Fact] public void LinkPrefix1() {