1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 15:28:11 +00:00

JSSpecCompiler: Add if branch merging pass

It merges standalone IfBranch/ElseIfBranch nodes into IfElseIfChain
nodes. This will ease CFG generation later.
This commit is contained in:
Dan Klishch 2023-08-18 21:16:53 -04:00 committed by Andrew Kaster
parent 092ed1cc8a
commit 4c4e1e1aed
8 changed files with 184 additions and 0 deletions

View file

@ -71,6 +71,18 @@ Vector<NodeSubtreePointer> ElseIfBranch::subtrees()
return { { &m_branch } };
}
Vector<NodeSubtreePointer> IfElseIfChain::subtrees()
{
Vector<NodeSubtreePointer> result;
for (size_t i = 0; i < branches_count(); ++i) {
result.append({ &m_conditions[i] });
result.append({ &m_branches[i] });
}
if (m_else_branch)
result.append({ &m_else_branch });
return result;
}
Vector<NodeSubtreePointer> TreeList::subtrees()
{
Vector<NodeSubtreePointer> result;

View file

@ -277,6 +277,29 @@ protected:
void dump_tree(StringBuilder& builder) override;
};
class IfElseIfChain : public Node {
public:
IfElseIfChain(Vector<Tree>&& conditions, Vector<Tree>&& branches, NullableTree else_branch)
: m_conditions(move(conditions))
, m_branches(move(branches))
, m_else_branch(else_branch)
{
VERIFY(m_branches.size() == m_conditions.size());
}
Vector<NodeSubtreePointer> subtrees() override;
// Excluding else branch, if one is present
size_t branches_count() { return m_branches.size(); }
Vector<Tree> m_conditions;
Vector<Tree> m_branches;
NullableTree m_else_branch;
protected:
void dump_tree(StringBuilder& builder) override;
};
class TreeList : public Node {
public:
TreeList(Vector<Tree>&& expressions_)

View file

@ -97,6 +97,18 @@ void ElseIfBranch::dump_tree(StringBuilder& builder)
m_branch->format_tree(builder);
}
void IfElseIfChain::dump_tree(StringBuilder& builder)
{
dump_node(builder, "IfElseIfChain");
for (size_t i = 0; i < branches_count(); ++i) {
m_conditions[i]->format_tree(builder);
m_branches[i]->format_tree(builder);
}
if (m_else_branch)
m_else_branch->format_tree(builder);
}
void TreeList::dump_tree(StringBuilder& builder)
{
dump_node(builder, "TreeList");