Stop using ArrayStack for the cleanup stack. (#7505)

Because we merge cleanups across scopes in various cases, and want to
use linear indexes into the complete stack, the ArrayStack abstraction
is getting in the way more than it's helping. Switch to just a
SmallVector.

This loses the unit testing of the MergeIntoGrandparent logic. This is
covered indirectly by check tests still, but direct testing of it is a
bit tricky given that ScopeStack isn't set up for use without a Context.
This commit is contained in:
Richard Smith
2026-07-15 00:47:47 +00:00
committed by GitHub
parent 5b48274e58
commit 45d1c74df8
5 changed files with 31 additions and 162 deletions
-118
View File
@@ -103,123 +103,5 @@ TEST(ArrayStack, PeekArrayAt) {
EXPECT_THAT(stack.PeekArrayAt(2), ElementsAre(3));
}
TEST(ArrayStack, MergeTopArrayIntoGrandparent) {
ArrayStack<int> stack;
// Basic case with 3 arrays.
stack.PushArray();
stack.AppendToTop(1);
stack.AppendToTop(2);
stack.PushArray();
stack.AppendToTop(3);
stack.AppendToTop(4);
stack.AppendToTop(5);
stack.PushArray();
stack.AppendToTop(6);
stack.AppendToTop(7);
stack.MergeTopArrayIntoGrandparent();
EXPECT_THAT(stack.PeekArrayAt(0), ElementsAre(1, 2, 6, 7));
EXPECT_THAT(stack.PeekArrayAt(1), ElementsAre(3, 4, 5));
EXPECT_THAT(stack.PeekArrayAt(2), IsEmpty());
EXPECT_THAT(stack.PeekArray(), IsEmpty());
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(1, 2, 6, 7, 3, 4, 5));
// Appending to the now-empty top array and popping works as expected.
stack.AppendToTop(8);
EXPECT_THAT(stack.PeekArray(), ElementsAre(8));
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(1, 2, 6, 7, 3, 4, 5, 8));
stack.PopArray();
EXPECT_THAT(stack.PeekArray(), ElementsAre(3, 4, 5));
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(1, 2, 6, 7, 3, 4, 5));
stack.PopArray();
EXPECT_THAT(stack.PeekArray(), ElementsAre(1, 2, 6, 7));
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(1, 2, 6, 7));
}
TEST(ArrayStack, MergeTopArrayIntoGrandparentDeeperStack) {
ArrayStack<int> stack;
// Verify behavior when there are more than 3 arrays on the stack.
stack.PushArray();
stack.AppendToTop(10);
stack.PushArray();
stack.AppendToTop(20);
stack.PushArray();
stack.AppendToTop(30);
stack.PushArray();
stack.AppendToTop(40);
stack.AppendToTop(50);
stack.MergeTopArrayIntoGrandparent();
EXPECT_THAT(stack.PeekArrayAt(0), ElementsAre(10));
EXPECT_THAT(stack.PeekArrayAt(1), ElementsAre(20, 40, 50));
EXPECT_THAT(stack.PeekArrayAt(2), ElementsAre(30));
EXPECT_THAT(stack.PeekArrayAt(3), IsEmpty());
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(10, 20, 40, 50, 30));
}
TEST(ArrayStack, MergeTopArrayIntoGrandparentEmptyArrays) {
// Test when the parent array is initially empty.
{
ArrayStack<int> stack;
stack.PushArray();
stack.AppendToTop(1);
stack.PushArray();
stack.PushArray();
stack.AppendToTop(2);
stack.AppendToTop(3);
stack.MergeTopArrayIntoGrandparent();
EXPECT_THAT(stack.PeekArrayAt(0), ElementsAre(1, 2, 3));
EXPECT_THAT(stack.PeekArrayAt(1), IsEmpty());
EXPECT_THAT(stack.PeekArrayAt(2), IsEmpty());
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(1, 2, 3));
}
// Test when the top array is initially empty.
{
ArrayStack<int> stack;
stack.PushArray();
stack.AppendToTop(1);
stack.PushArray();
stack.AppendToTop(2);
stack.PushArray();
stack.MergeTopArrayIntoGrandparent();
EXPECT_THAT(stack.PeekArrayAt(0), ElementsAre(1));
EXPECT_THAT(stack.PeekArrayAt(1), ElementsAre(2));
EXPECT_THAT(stack.PeekArrayAt(2), IsEmpty());
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(1, 2));
}
// Test when the grandparent array is initially empty.
{
ArrayStack<int> stack;
stack.PushArray();
stack.PushArray();
stack.AppendToTop(1);
stack.AppendToTop(2);
stack.PushArray();
stack.AppendToTop(3);
stack.AppendToTop(4);
stack.MergeTopArrayIntoGrandparent();
EXPECT_THAT(stack.PeekArrayAt(0), ElementsAre(3, 4));
EXPECT_THAT(stack.PeekArrayAt(1), ElementsAre(1, 2));
EXPECT_THAT(stack.PeekArrayAt(2), IsEmpty());
EXPECT_THAT(stack.PeekAllValues(), ElementsAre(3, 4, 1, 2));
}
}
} // namespace
} // namespace Carbon::Testing