Commit a584d9c4 authored by Michael Lippautz's avatar Michael Lippautz Committed by Chromium LUCI CQ

custom elements: Avoid dynamic allocation of HeapVector

Bug: 1154667
Change-Id: I8a838150309b3ebab3b41fe9d07cb6ab1fd7114c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2571282
Auto-Submit: Michael Lippautz <mlippautz@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Commit-Queue: Kentaro Hara <haraken@chromium.org>
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#833311}
parent 4e93f078
...@@ -34,12 +34,11 @@ TEST(CustomElementDefinitionTest, upgrade_clearsReactionQueueOnFailure) { ...@@ -34,12 +34,11 @@ TEST(CustomElementDefinitionTest, upgrade_clearsReactionQueueOnFailure) {
<< "sanity check: this element should be ready to upgrade"; << "sanity check: this element should be ready to upgrade";
{ {
CEReactionsScope reactions; CEReactionsScope reactions;
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Unreached>(
commands->push_back(MakeGarbageCollected<Unreached>(
"upgrade failure should clear the reaction queue")); "upgrade failure should clear the reaction queue"));
reactions.EnqueueToCurrentQueue( reactions.EnqueueToCurrentQueue(
element, *MakeGarbageCollected<TestReaction>(commands)); element, *MakeGarbageCollected<TestReaction>(std::move(commands)));
ConstructorFails definition(CustomElementDescriptor("a-a", "a-a")); ConstructorFails definition(CustomElementDescriptor("a-a", "a-a"));
definition.Upgrade(element); definition.Upgrade(element);
} }
...@@ -53,12 +52,11 @@ TEST(CustomElementDefinitionTest, ...@@ -53,12 +52,11 @@ TEST(CustomElementDefinitionTest,
EXPECT_EQ(CustomElementState::kUndefined, element.GetCustomElementState()) EXPECT_EQ(CustomElementState::kUndefined, element.GetCustomElementState())
<< "sanity check: this element should be ready to upgrade"; << "sanity check: this element should be ready to upgrade";
ResetCustomElementReactionStackForTest reset_reaction_stack; ResetCustomElementReactionStackForTest reset_reaction_stack;
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Unreached>(
commands->push_back(MakeGarbageCollected<Unreached>(
"upgrade failure should clear the reaction queue")); "upgrade failure should clear the reaction queue"));
reset_reaction_stack.Stack().EnqueueToBackupQueue( reset_reaction_stack.Stack().EnqueueToBackupQueue(
element, *MakeGarbageCollected<TestReaction>(commands)); element, *MakeGarbageCollected<TestReaction>(std::move(commands)));
ConstructorFails definition(CustomElementDescriptor("a-a", "a-a")); ConstructorFails definition(CustomElementDescriptor("a-a", "a-a"));
definition.Upgrade(element); definition.Upgrade(element);
EXPECT_EQ(CustomElementState::kFailed, element.GetCustomElementState()) EXPECT_EQ(CustomElementState::kFailed, element.GetCustomElementState())
......
...@@ -18,10 +18,9 @@ TEST(CustomElementReactionQueueTest, invokeReactions_one) { ...@@ -18,10 +18,9 @@ TEST(CustomElementReactionQueueTest, invokeReactions_one) {
Vector<char> log; Vector<char> log;
CustomElementReactionQueue* queue = CustomElementReactionQueue* queue =
MakeGarbageCollected<CustomElementReactionQueue>(); MakeGarbageCollected<CustomElementReactionQueue>();
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('a', log));
commands->push_back(MakeGarbageCollected<Log>('a', log)); queue->Add(*MakeGarbageCollected<TestReaction>(std::move(commands)));
queue->Add(*MakeGarbageCollected<TestReaction>(commands));
Element* test_element = CreateElement(AtomicString("my-element")); Element* test_element = CreateElement(AtomicString("my-element"));
queue->InvokeReactions(*test_element); queue->InvokeReactions(*test_element);
EXPECT_EQ(log, Vector<char>({'a'})) EXPECT_EQ(log, Vector<char>({'a'}))
...@@ -33,22 +32,19 @@ TEST(CustomElementReactionQueueTest, invokeReactions_many) { ...@@ -33,22 +32,19 @@ TEST(CustomElementReactionQueueTest, invokeReactions_many) {
CustomElementReactionQueue* queue = CustomElementReactionQueue* queue =
MakeGarbageCollected<CustomElementReactionQueue>(); MakeGarbageCollected<CustomElementReactionQueue>();
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('a', log));
commands->push_back(MakeGarbageCollected<Log>('a', log)); queue->Add(*MakeGarbageCollected<TestReaction>(std::move(commands)));
queue->Add(*MakeGarbageCollected<TestReaction>(commands));
} }
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('b', log));
commands->push_back(MakeGarbageCollected<Log>('b', log)); queue->Add(*MakeGarbageCollected<TestReaction>(std::move(commands)));
queue->Add(*MakeGarbageCollected<TestReaction>(commands));
} }
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('c', log));
commands->push_back(MakeGarbageCollected<Log>('c', log)); queue->Add(*MakeGarbageCollected<TestReaction>(std::move(commands)));
queue->Add(*MakeGarbageCollected<TestReaction>(commands));
} }
Element* test_element = CreateElement(AtomicString("my-element")); Element* test_element = CreateElement(AtomicString("my-element"));
queue->InvokeReactions(*test_element); queue->InvokeReactions(*test_element);
...@@ -61,27 +57,24 @@ TEST(CustomElementReactionQueueTest, invokeReactions_recursive) { ...@@ -61,27 +57,24 @@ TEST(CustomElementReactionQueueTest, invokeReactions_recursive) {
CustomElementReactionQueue* queue = CustomElementReactionQueue* queue =
MakeGarbageCollected<CustomElementReactionQueue>(); MakeGarbageCollected<CustomElementReactionQueue>();
HeapVector<Member<Command>>* third_commands = HeapVector<Member<Command>> third_commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); third_commands.push_back(MakeGarbageCollected<Log>('c', log));
third_commands->push_back(MakeGarbageCollected<Log>('c', log)); third_commands.push_back(MakeGarbageCollected<Recurse>(queue));
third_commands->push_back(MakeGarbageCollected<Recurse>(queue)); CustomElementReaction* third = MakeGarbageCollected<TestReaction>(
CustomElementReaction* third = std::move(third_commands)); // "Empty" recursion
MakeGarbageCollected<TestReaction>(third_commands); // "Empty" recursion
HeapVector<Member<Command>>* second_commands = HeapVector<Member<Command>> second_commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); second_commands.push_back(MakeGarbageCollected<Log>('b', log));
second_commands->push_back(MakeGarbageCollected<Log>('b', log)); second_commands.push_back(MakeGarbageCollected<Enqueue>(queue, third));
second_commands->push_back(MakeGarbageCollected<Enqueue>(queue, third));
CustomElementReaction* second = MakeGarbageCollected<TestReaction>( CustomElementReaction* second = MakeGarbageCollected<TestReaction>(
second_commands); // Unwinds one level of recursion std::move(second_commands)); // Unwinds one level of recursion
HeapVector<Member<Command>>* first_commands = HeapVector<Member<Command>> first_commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); first_commands.push_back(MakeGarbageCollected<Log>('a', log));
first_commands->push_back(MakeGarbageCollected<Log>('a', log)); first_commands.push_back(MakeGarbageCollected<Enqueue>(queue, second));
first_commands->push_back(MakeGarbageCollected<Enqueue>(queue, second)); first_commands.push_back(MakeGarbageCollected<Recurse>(queue));
first_commands->push_back(MakeGarbageCollected<Recurse>(queue));
CustomElementReaction* first = MakeGarbageCollected<TestReaction>( CustomElementReaction* first = MakeGarbageCollected<TestReaction>(
first_commands); // Non-empty recursion std::move(first_commands)); // Non-empty recursion
queue->Add(*first); queue->Add(*first);
Element* test_element = CreateElement(AtomicString("my-element")); Element* test_element = CreateElement(AtomicString("my-element"));
...@@ -96,24 +89,21 @@ TEST(CustomElementReactionQueueTest, clear_duringInvoke) { ...@@ -96,24 +89,21 @@ TEST(CustomElementReactionQueueTest, clear_duringInvoke) {
MakeGarbageCollected<CustomElementReactionQueue>(); MakeGarbageCollected<CustomElementReactionQueue>();
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('a', log));
commands->push_back(MakeGarbageCollected<Log>('a', log)); queue->Add(*MakeGarbageCollected<TestReaction>(std::move(commands)));
queue->Add(*MakeGarbageCollected<TestReaction>(commands));
} }
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Call>(WTF::Bind(
commands->push_back(MakeGarbageCollected<Call>(WTF::Bind(
[](CustomElementReactionQueue* queue, Element&) { queue->Clear(); }, [](CustomElementReactionQueue* queue, Element&) { queue->Clear(); },
WrapPersistent(queue)))); WrapPersistent(queue))));
queue->Add(*MakeGarbageCollected<TestReaction>(commands)); queue->Add(*MakeGarbageCollected<TestReaction>(std::move(commands)));
} }
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('b', log));
commands->push_back(MakeGarbageCollected<Log>('b', log)); queue->Add(*MakeGarbageCollected<TestReaction>(std::move(commands)));
queue->Add(*MakeGarbageCollected<TestReaction>(commands));
} }
Element* test_element = CreateElement(AtomicString("my-element")); Element* test_element = CreateElement(AtomicString("my-element"));
......
...@@ -21,11 +21,11 @@ TEST(CustomElementReactionStackTest, one) { ...@@ -21,11 +21,11 @@ TEST(CustomElementReactionStackTest, one) {
CustomElementReactionStack* stack = CustomElementReactionStack* stack =
MakeGarbageCollected<CustomElementReactionStack>(); MakeGarbageCollected<CustomElementReactionStack>();
stack->Push(); stack->Push();
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('a', log));
commands->push_back(MakeGarbageCollected<Log>('a', log)); stack->EnqueueToCurrentQueue(
stack->EnqueueToCurrentQueue(*CreateElement("a"), *CreateElement("a"),
*MakeGarbageCollected<TestReaction>(commands)); *MakeGarbageCollected<TestReaction>(std::move(commands)));
stack->PopInvokingReactions(); stack->PopInvokingReactions();
EXPECT_EQ(log, Vector<char>({'a'})) EXPECT_EQ(log, Vector<char>({'a'}))
...@@ -39,18 +39,18 @@ TEST(CustomElementReactionStackTest, multipleElements) { ...@@ -39,18 +39,18 @@ TEST(CustomElementReactionStackTest, multipleElements) {
MakeGarbageCollected<CustomElementReactionStack>(); MakeGarbageCollected<CustomElementReactionStack>();
stack->Push(); stack->Push();
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('a', log));
commands->push_back(MakeGarbageCollected<Log>('a', log)); stack->EnqueueToCurrentQueue(
stack->EnqueueToCurrentQueue(*CreateElement("a"), *CreateElement("a"),
*MakeGarbageCollected<TestReaction>(commands)); *MakeGarbageCollected<TestReaction>(std::move(commands)));
} }
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('b', log));
commands->push_back(MakeGarbageCollected<Log>('b', log)); stack->EnqueueToCurrentQueue(
stack->EnqueueToCurrentQueue(*CreateElement("a"), *CreateElement("a"),
*MakeGarbageCollected<TestReaction>(commands)); *MakeGarbageCollected<TestReaction>(std::move(commands)));
} }
stack->PopInvokingReactions(); stack->PopInvokingReactions();
...@@ -64,11 +64,11 @@ TEST(CustomElementReactionStackTest, popTopEmpty) { ...@@ -64,11 +64,11 @@ TEST(CustomElementReactionStackTest, popTopEmpty) {
CustomElementReactionStack* stack = CustomElementReactionStack* stack =
MakeGarbageCollected<CustomElementReactionStack>(); MakeGarbageCollected<CustomElementReactionStack>();
stack->Push(); stack->Push();
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('a', log));
commands->push_back(MakeGarbageCollected<Log>('a', log)); stack->EnqueueToCurrentQueue(
stack->EnqueueToCurrentQueue(*CreateElement("a"), *CreateElement("a"),
*MakeGarbageCollected<TestReaction>(commands)); *MakeGarbageCollected<TestReaction>(std::move(commands)));
stack->Push(); stack->Push();
stack->PopInvokingReactions(); stack->PopInvokingReactions();
...@@ -83,19 +83,19 @@ TEST(CustomElementReactionStackTest, popTop) { ...@@ -83,19 +83,19 @@ TEST(CustomElementReactionStackTest, popTop) {
MakeGarbageCollected<CustomElementReactionStack>(); MakeGarbageCollected<CustomElementReactionStack>();
stack->Push(); stack->Push();
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('a', log));
commands->push_back(MakeGarbageCollected<Log>('a', log)); stack->EnqueueToCurrentQueue(
stack->EnqueueToCurrentQueue(*CreateElement("a"), *CreateElement("a"),
*MakeGarbageCollected<TestReaction>(commands)); *MakeGarbageCollected<TestReaction>(std::move(commands)));
} }
stack->Push(); stack->Push();
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('b', log));
commands->push_back(MakeGarbageCollected<Log>('b', log)); stack->EnqueueToCurrentQueue(
stack->EnqueueToCurrentQueue(*CreateElement("a"), *CreateElement("a"),
*MakeGarbageCollected<TestReaction>(commands)); *MakeGarbageCollected<TestReaction>(std::move(commands)));
} }
stack->PopInvokingReactions(); stack->PopInvokingReactions();
...@@ -112,25 +112,23 @@ TEST(CustomElementReactionStackTest, requeueingDoesNotReorderElements) { ...@@ -112,25 +112,23 @@ TEST(CustomElementReactionStackTest, requeueingDoesNotReorderElements) {
MakeGarbageCollected<CustomElementReactionStack>(); MakeGarbageCollected<CustomElementReactionStack>();
stack->Push(); stack->Push();
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('a', log));
commands->push_back(MakeGarbageCollected<Log>('a', log)); stack->EnqueueToCurrentQueue(
stack->EnqueueToCurrentQueue(element, element, *MakeGarbageCollected<TestReaction>(std::move(commands)));
*MakeGarbageCollected<TestReaction>(commands));
} }
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('z', log));
commands->push_back(MakeGarbageCollected<Log>('z', log)); stack->EnqueueToCurrentQueue(
stack->EnqueueToCurrentQueue(*CreateElement("a"), *CreateElement("a"),
*MakeGarbageCollected<TestReaction>(commands)); *MakeGarbageCollected<TestReaction>(std::move(commands)));
} }
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('b', log));
commands->push_back(MakeGarbageCollected<Log>('b', log)); stack->EnqueueToCurrentQueue(
stack->EnqueueToCurrentQueue(element, element, *MakeGarbageCollected<TestReaction>(std::move(commands)));
*MakeGarbageCollected<TestReaction>(commands));
} }
stack->PopInvokingReactions(); stack->PopInvokingReactions();
...@@ -147,33 +145,31 @@ TEST(CustomElementReactionStackTest, oneReactionQueuePerElement) { ...@@ -147,33 +145,31 @@ TEST(CustomElementReactionStackTest, oneReactionQueuePerElement) {
MakeGarbageCollected<CustomElementReactionStack>(); MakeGarbageCollected<CustomElementReactionStack>();
stack->Push(); stack->Push();
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('a', log));
commands->push_back(MakeGarbageCollected<Log>('a', log)); stack->EnqueueToCurrentQueue(
stack->EnqueueToCurrentQueue(element, element, *MakeGarbageCollected<TestReaction>(std::move(commands)));
*MakeGarbageCollected<TestReaction>(commands));
} }
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('z', log));
commands->push_back(MakeGarbageCollected<Log>('z', log)); stack->EnqueueToCurrentQueue(
stack->EnqueueToCurrentQueue(*CreateElement("a"), *CreateElement("a"),
*MakeGarbageCollected<TestReaction>(commands)); *MakeGarbageCollected<TestReaction>(std::move(commands)));
} }
stack->Push(); stack->Push();
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('y', log));
commands->push_back(MakeGarbageCollected<Log>('y', log)); stack->EnqueueToCurrentQueue(
stack->EnqueueToCurrentQueue(*CreateElement("a"), *CreateElement("a"),
*MakeGarbageCollected<TestReaction>(commands)); *MakeGarbageCollected<TestReaction>(std::move(commands)));
} }
{ {
HeapVector<Member<Command>>* commands = HeapVector<Member<Command>> commands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); commands.push_back(MakeGarbageCollected<Log>('b', log));
commands->push_back(MakeGarbageCollected<Log>('b', log)); stack->EnqueueToCurrentQueue(
stack->EnqueueToCurrentQueue(element, element, *MakeGarbageCollected<TestReaction>(std::move(commands)));
*MakeGarbageCollected<TestReaction>(commands));
} }
stack->PopInvokingReactions(); stack->PopInvokingReactions();
...@@ -219,15 +215,14 @@ TEST(CustomElementReactionStackTest, enqueueFromReaction) { ...@@ -219,15 +215,14 @@ TEST(CustomElementReactionStackTest, enqueueFromReaction) {
MakeGarbageCollected<CustomElementReactionStack>(); MakeGarbageCollected<CustomElementReactionStack>();
stack->Push(); stack->Push();
{ {
HeapVector<Member<Command>>* subcommands = HeapVector<Member<Command>> subcommands;
MakeGarbageCollected<HeapVector<Member<Command>>>(); subcommands.push_back(MakeGarbageCollected<Log>('a', log));
subcommands->push_back(MakeGarbageCollected<Log>('a', log)); HeapVector<Member<Command>> commands;
HeapVector<Member<Command>>* commands = commands.push_back(MakeGarbageCollected<EnqueueToStack>(
MakeGarbageCollected<HeapVector<Member<Command>>>(); stack, element,
commands->push_back(MakeGarbageCollected<EnqueueToStack>( MakeGarbageCollected<TestReaction>(std::move(subcommands))));
stack, element, MakeGarbageCollected<TestReaction>(subcommands))); stack->EnqueueToCurrentQueue(
stack->EnqueueToCurrentQueue(element, element, *MakeGarbageCollected<TestReaction>(std::move(commands)));
*MakeGarbageCollected<TestReaction>(commands));
} }
stack->PopInvokingReactions(); stack->PopInvokingReactions();
......
...@@ -107,23 +107,23 @@ class Enqueue : public Command { ...@@ -107,23 +107,23 @@ class Enqueue : public Command {
class TestReaction : public CustomElementReaction { class TestReaction : public CustomElementReaction {
public: public:
TestReaction(HeapVector<Member<Command>>* commands) explicit TestReaction(HeapVector<Member<Command>>&& commands)
: CustomElementReaction( : CustomElementReaction(
*MakeGarbageCollected<TestCustomElementDefinition>( *MakeGarbageCollected<TestCustomElementDefinition>(
CustomElementDescriptor("mock-element", "mock-element"))), CustomElementDescriptor("mock-element", "mock-element"))),
commands_(commands) {} commands_(std::move(commands)) {}
~TestReaction() override = default; ~TestReaction() override = default;
void Trace(Visitor* visitor) const override { void Trace(Visitor* visitor) const override {
CustomElementReaction::Trace(visitor); CustomElementReaction::Trace(visitor);
visitor->Trace(commands_); visitor->Trace(commands_);
} }
void Invoke(Element& element) override { void Invoke(Element& element) override {
for (auto& command : *commands_) for (auto& command : commands_)
command->Run(element); command->Run(element);
} }
private: private:
Member<HeapVector<Member<Command>>> commands_; HeapVector<Member<Command>> commands_;
DISALLOW_COPY_AND_ASSIGN(TestReaction); DISALLOW_COPY_AND_ASSIGN(TestReaction);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment