From f76fc366de08dc648af7377bc0eb7ccd2de4e448 Mon Sep 17 00:00:00 2001 From: "D.ildo" <34244107+Darkildo@users.noreply.github.com> Date: Wed, 25 Mar 2026 02:48:45 -0700 Subject: [PATCH] Fix #62883 String buffer clear() Closes https://github.com/dart-lang/sdk/pull/62931 GitOrigin-RevId: 00a2f30d0906758176575a615d57fdb6c517e23a Change-Id: I636770b919f3f2358136d05fc373cbd53e88e4ce Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/489040 Reviewed-by: Slava Egorov Commit-Queue: Slava Egorov Reviewed-by: Alexander Aprelev --- .../vm_shared/lib/string_buffer_patch.dart | 4 ++- ...ffer_clear_compaction_regression_test.dart | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 tests/corelib/string_buffer_clear_compaction_regression_test.dart 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()); +}