From 3bbfa658adf6042cb1ecc583874bb28f3a5c28cf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 21 Apr 2026 21:04:34 +0000 Subject: [PATCH 1/3] Initial plan From 6665c8069f0c2c1fd5c48266471674a5cac53a66 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 21 Apr 2026 21:30:56 +0000 Subject: [PATCH 2/3] Fix BlobBuilder.LinkSuffix when destination is empty and suffix is pre-linked Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/31683964-9cee-4d89-b561-87c8f1509e4b Co-authored-by: jkoritzinsky <1571408+jkoritzinsky@users.noreply.github.com> --- .../System/Reflection/Metadata/BlobBuilder.cs | 7 ++++++- .../tests/Metadata/BlobTests.cs | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) 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..017894f868d4ef 100644 --- a/src/libraries/System.Reflection.Metadata/tests/Metadata/BlobTests.cs +++ b/src/libraries/System.Reflection.Metadata/tests/Metadata/BlobTests.cs @@ -514,6 +514,25 @@ 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 LinkPrefix1() { From 9b7f3294d6ddae1a97b6f1fb84a78c97a723e3d1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Apr 2026 03:34:47 +0000 Subject: [PATCH 3/3] Add 3-chunk suffix-chain regression test for empty LinkSuffix destination Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/b69da8b3-ca72-4bb1-bcd7-b8c7ed3ff26c Co-authored-by: jkoritzinsky <1571408+jkoritzinsky@users.noreply.github.com> --- .../tests/Metadata/BlobTests.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/libraries/System.Reflection.Metadata/tests/Metadata/BlobTests.cs b/src/libraries/System.Reflection.Metadata/tests/Metadata/BlobTests.cs index 017894f868d4ef..2fbffd52e25c04 100644 --- a/src/libraries/System.Reflection.Metadata/tests/Metadata/BlobTests.cs +++ b/src/libraries/System.Reflection.Metadata/tests/Metadata/BlobTests.cs @@ -533,6 +533,29 @@ public void LinkSuffix_EmptyDestination_SuffixAlreadyLinked() 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() {