summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Libraries/LibJS/AST.cpp18
-rw-r--r--Libraries/LibJS/AST.h16
2 files changed, 34 insertions, 0 deletions
diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp
index 5f96c5f6d9..d11d6a6295 100644
--- a/Libraries/LibJS/AST.cpp
+++ b/Libraries/LibJS/AST.cpp
@@ -1133,4 +1133,22 @@ void ConditionalExpression::dump(int indent) const
m_test->dump(indent + 1);
}
+void SequenceExpression::dump(int indent) const
+{
+ ASTNode::dump(indent);
+ for (auto& expression : m_expressions)
+ expression.dump(indent + 1);
+}
+
+Value SequenceExpression::execute(Interpreter& interpreter) const
+{
+ Value last_value;
+ for (auto& expression : m_expressions) {
+ last_value = expression.execute(interpreter);
+ if (interpreter.exception())
+ return {};
+ }
+ return last_value;
+}
+
}
diff --git a/Libraries/LibJS/AST.h b/Libraries/LibJS/AST.h
index 2770d9af77..1f58b4c4c0 100644
--- a/Libraries/LibJS/AST.h
+++ b/Libraries/LibJS/AST.h
@@ -403,6 +403,22 @@ private:
NonnullRefPtr<Expression> m_lhs;
};
+class SequenceExpression final : public Expression {
+public:
+ SequenceExpression(NonnullRefPtrVector<Expression> expressions)
+ : m_expressions(move(expressions))
+ {
+ }
+
+ virtual void dump(int indent) const override;
+ virtual Value execute(Interpreter&) const override;
+
+private:
+ virtual const char* class_name() const override { return "SequenceExpression"; }
+
+ NonnullRefPtrVector<Expression> m_expressions;
+};
+
class Literal : public Expression {
protected:
explicit Literal() {}