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:
parent
092ed1cc8a
commit
4c4e1e1aed
8 changed files with 184 additions and 0 deletions
|
@ -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;
|
||||
|
|
|
@ -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_)
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue