1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 15:17:36 +00:00

JSSpecCompiler: Elide nested TreeList nodes

This commit is contained in:
Dan Klishch 2023-09-13 01:28:11 -04:00 committed by Jelle Raaijmakers
parent f30815b534
commit 14a86c8fd6
4 changed files with 23 additions and 12 deletions

View file

@ -83,10 +83,22 @@ Vector<NodeSubtreePointer> IfElseIfChain::subtrees()
return result; return result;
} }
TreeList::TreeList(Vector<Tree>&& trees)
{
for (auto const& tree : trees) {
if (tree->is_list()) {
for (auto const& nested_tree : as<TreeList>(tree)->m_trees)
m_trees.append(nested_tree);
} else {
m_trees.append(tree);
}
}
}
Vector<NodeSubtreePointer> TreeList::subtrees() Vector<NodeSubtreePointer> TreeList::subtrees()
{ {
Vector<NodeSubtreePointer> result; Vector<NodeSubtreePointer> result;
for (auto& expression : m_expressions) for (auto& expression : m_trees)
result.append({ &expression }); result.append({ &expression });
return result; return result;
} }

View file

@ -59,7 +59,7 @@ public:
// For expressions, order must be the same as the evaluation order. // For expressions, order must be the same as the evaluation order.
virtual Vector<NodeSubtreePointer> subtrees() { return {}; } virtual Vector<NodeSubtreePointer> subtrees() { return {}; }
virtual bool is_type() { return false; } virtual bool is_list() const { return false; }
protected: protected:
template<typename... Parameters> template<typename... Parameters>
@ -372,14 +372,13 @@ protected:
class TreeList : public Statement { class TreeList : public Statement {
public: public:
TreeList(Vector<Tree>&& expressions_) TreeList(Vector<Tree>&& trees);
: m_expressions(move(expressions_))
{
}
Vector<NodeSubtreePointer> subtrees() override; Vector<NodeSubtreePointer> subtrees() override;
Vector<Tree> m_expressions; bool is_list() const override { return true; }
Vector<Tree> m_trees;
protected: protected:
void dump_tree(StringBuilder& builder) override; void dump_tree(StringBuilder& builder) override;

View file

@ -129,7 +129,7 @@ void IfElseIfChain::dump_tree(StringBuilder& builder)
void TreeList::dump_tree(StringBuilder& builder) void TreeList::dump_tree(StringBuilder& builder)
{ {
dump_node(builder, "TreeList"); dump_node(builder, "TreeList");
for (auto const& expression : m_expressions) for (auto const& expression : m_trees)
expression->format_tree(builder); expression->format_tree(builder);
} }

View file

@ -24,7 +24,7 @@ RecursionDecision IfBranchMergingPass::on_entry(Tree tree)
} }
}; };
for (auto const& node : list->m_expressions) { for (auto const& node : list->m_trees) {
if (is<IfBranch>(node.ptr())) { if (is<IfBranch>(node.ptr())) {
merge_if_needed(); merge_if_needed();
unmerged_branches.append(node); unmerged_branches.append(node);
@ -37,7 +37,7 @@ RecursionDecision IfBranchMergingPass::on_entry(Tree tree)
} }
merge_if_needed(); merge_if_needed();
list->m_expressions = move(result); list->m_trees = move(result);
} }
return RecursionDecision::Recurse; return RecursionDecision::Recurse;
} }
@ -75,8 +75,8 @@ Tree IfBranchMergingPass::merge_branches(Vector<Tree> const& unmerged_branches)
// 3. Else, // 3. Else,
// ... // ...
auto substep_list = as<TreeList>(branch->m_branch); auto substep_list = as<TreeList>(branch->m_branch);
if (substep_list && substep_list->m_expressions.size() == 1) { if (substep_list && substep_list->m_trees.size() == 1) {
if (auto nested_if = as<IfBranch>(substep_list->m_expressions[0]); nested_if) if (auto nested_if = as<IfBranch>(substep_list->m_trees[0]); nested_if)
branch = make_ref_counted<ElseIfBranch>(nested_if->m_condition, nested_if->m_branch); branch = make_ref_counted<ElseIfBranch>(nested_if->m_condition, nested_if->m_branch);
} }
} }