diff --git a/sdk/lib/_internal/vm_shared/lib/string_buffer_patch.dart b/sdk/lib/_internal/vm_shared/lib/string_buffer_patch.dart index c4ec5a8bb81..0e654b31c63 100644 --- a/sdk/lib/_internal/vm_shared/lib/string_buffer_patch.dart +++ b/sdk/lib/_internal/vm_shared/lib/string_buffer_patch.dart @@ -123,7 +123,8 @@ class StringBuffer { @patch void clear() { _parts = null; - _partsCodeUnits = _bufferPosition = _bufferCodeUnitMagnitude = 0; + _partsCodeUnits = _bufferPosition = _bufferCodeUnitMagnitude = + _partsCompactionIndex = _partsCodeUnitsSinceCompaction = 0; } /** Returns the contents of buffer as a string. */ @@ -175,6 +176,7 @@ class StringBuffer { } else { localParts.add(str); int partsSinceCompaction = localParts.length - _partsCompactionIndex; + assert(partsSinceCompaction > 0); if (partsSinceCompaction == _PARTS_TO_COMPACT) { _compact(); } diff --git a/tests/corelib/string_buffer_clear_compaction_regression_test.dart b/tests/corelib/string_buffer_clear_compaction_regression_test.dart new file mode 100644 index 00000000000..7f272847adf --- /dev/null +++ b/tests/corelib/string_buffer_clear_compaction_regression_test.dart @@ -0,0 +1,30 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// VMOptions=--enable-asserts + +import "package:expect/expect.dart"; + +const int _iterations = 10000; +final String _expected = List.generate( + _iterations, + (int i) => i.isEven ? "foo " : "bar ", +).join(); + +void writeFooBar(StringBuffer buffer) { + for (int i = 0; i < _iterations; i++) { + buffer.write(i.isEven ? "foo" : "bar"); + buffer.write(" "); + } +} + +void main() { + final buffer = StringBuffer(); + + writeFooBar(buffer); + buffer.clear(); + writeFooBar(buffer); + + Expect.equals(_expected.length, buffer.length); + Expect.equals(_expected, buffer.toString()); +}