1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 11:37:34 +00:00

LibJS: Update AST to use completions :^)

This is another major milestone on our journey towards removing global
VM exception state :^)
Does pretty much exactly what it says on the tin: updating
ASTNode::execute() to return a Completion instead of a plain value. This
will *also* allow us to eventually remove the non-standard unwinding
mechanism and purely rely on the various completion types.
This commit is contained in:
Linus Groh 2022-01-02 21:37:50 +01:00
parent 95acb1ce88
commit da856d7742
11 changed files with 507 additions and 692 deletions

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2020, Linus Groh <linusg@serenityos.org>
* Copyright (c) 2020-2022, Linus Groh <linusg@serenityos.org>
* Copyright (c) 2021, David Tuin <davidot@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
@ -17,6 +17,7 @@
#include <AK/Variant.h>
#include <AK/Vector.h>
#include <LibJS/Forward.h>
#include <LibJS/Runtime/Completion.h>
#include <LibJS/Runtime/EnvironmentCoordinate.h>
#include <LibJS/Runtime/FunctionKind.h>
#include <LibJS/Runtime/PropertyKey.h>
@ -44,7 +45,7 @@ create_ast_node(SourceRange range, Args&&... args)
class ASTNode : public RefCounted<ASTNode> {
public:
virtual ~ASTNode() { }
virtual Value execute(Interpreter&, GlobalObject&) const = 0;
virtual Completion execute(Interpreter&, GlobalObject&) const = 0;
virtual void generate_bytecode(Bytecode::Generator&) const;
virtual void dump(int indent) const;
@ -107,7 +108,7 @@ public:
: Statement(source_range)
{
}
Value execute(Interpreter&, GlobalObject&) const override { return {}; }
Completion execute(Interpreter&, GlobalObject&) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
};
@ -117,7 +118,7 @@ public:
: Statement(source_range)
{
}
Value execute(Interpreter&, GlobalObject&) const override { return {}; }
Completion execute(Interpreter&, GlobalObject&) const override { return {}; }
};
class ExpressionStatement final : public Statement {
@ -128,7 +129,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -177,7 +178,7 @@ public:
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
Value evaluate_statements(Interpreter& interpreter, GlobalObject& global_object) const;
Completion evaluate_statements(Interpreter& interpreter, GlobalObject& global_object) const;
void add_var_scoped_declaration(NonnullRefPtr<Declaration> variables);
void add_lexical_declaration(NonnullRefPtr<Declaration> variables);
@ -254,7 +255,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
@ -296,7 +297,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
@ -323,7 +324,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
bool is_strict_mode() const { return m_is_strict_mode; }
void set_strict_mode() { m_is_strict_mode = true; }
@ -363,7 +364,7 @@ public:
: ScopeNode(source_range)
{
}
Value execute(Interpreter& interpreter, GlobalObject& object) const override;
Completion execute(Interpreter& interpreter, GlobalObject& object) const override;
};
class FunctionBody final : public ScopeNode {
@ -377,7 +378,7 @@ public:
bool in_strict_mode() const { return m_in_strict_mode; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
private:
bool m_in_strict_mode { false };
@ -413,7 +414,7 @@ public:
: Declaration(source_range)
{
}
Value execute(Interpreter&, GlobalObject&) const override { return {}; }
Completion execute(Interpreter&, GlobalObject&) const override { return {}; }
void for_each_bound_name(IteratorOrVoidFunction<FlyString const&>) const override
{
@ -516,7 +517,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -542,7 +543,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -562,7 +563,7 @@ public:
{
}
Value execute(Interpreter&, GlobalObject&) const override { return {}; }
Completion execute(Interpreter&, GlobalObject&) const override { return {}; }
};
class YieldExpression final : public Expression {
@ -577,7 +578,7 @@ public:
Expression const* argument() const { return m_argument; }
bool is_yield_from() const { return m_is_yield_from; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -594,7 +595,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -612,7 +613,7 @@ public:
Expression const* argument() const { return m_argument; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -634,7 +635,7 @@ public:
Statement const& consequent() const { return *m_consequent; }
Statement const* alternate() const { return m_alternate; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -656,7 +657,7 @@ public:
Expression const& test() const { return *m_test; }
Statement const& body() const { return *m_body; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -677,7 +678,7 @@ public:
Expression const& test() const { return *m_test; }
Statement const& body() const { return *m_body; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -698,7 +699,7 @@ public:
Expression const& object() const { return *m_object; }
Statement const& body() const { return *m_body; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
private:
@ -722,7 +723,7 @@ public:
Expression const* update() const { return m_update; }
Statement const& body() const { return *m_body; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -747,7 +748,7 @@ public:
Expression const& rhs() const { return *m_rhs; }
Statement const& body() const { return *m_body; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
private:
@ -770,7 +771,7 @@ public:
Expression const& rhs() const { return *m_rhs; }
Statement const& body() const { return *m_body; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
private:
@ -789,7 +790,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
private:
@ -833,7 +834,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -859,7 +860,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -888,7 +889,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -907,7 +908,7 @@ public:
}
virtual void dump(int indent) const override;
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
private:
@ -930,7 +931,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -946,7 +947,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -962,7 +963,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -979,7 +980,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -998,7 +999,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
};
@ -1015,7 +1016,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -1044,7 +1045,7 @@ public:
FlyString const& string() const { return m_string; }
void set_lexically_bound_function_argument_index(size_t index) { m_lexically_bound_function_argument = index; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual ThrowCompletionOr<Reference> to_reference(Interpreter&, GlobalObject&) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -1067,7 +1068,7 @@ public:
FlyString const& string() const { return m_string; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
private:
@ -1082,7 +1083,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
enum class ElementKind {
Method,
@ -1192,7 +1193,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual bool is_super_expression() const override { return true; }
@ -1212,7 +1213,7 @@ public:
StringView name() const { return m_name; }
RefPtr<FunctionExpression> constructor() const { return m_constructor; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
bool has_name() const { return !m_name.is_empty(); }
@ -1236,7 +1237,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -1246,6 +1247,8 @@ public:
StringView name() const { return m_class_expression->name(); }
ThrowCompletionOr<Value> binding_class_declaration_evaluation(Interpreter& interpreter, GlobalObject& global_object) const;
private:
NonnullRefPtr<ClassExpression> m_class_expression;
};
@ -1258,7 +1261,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
private:
@ -1271,7 +1274,7 @@ public:
: Expression(source_range)
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
};
@ -1290,14 +1293,14 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
Expression const& callee() const { return m_callee; }
protected:
void throw_type_error_for_callee(Interpreter&, GlobalObject&, Value callee_value, StringView call_type) const;
Completion throw_type_error_for_callee(Interpreter&, GlobalObject&, Value callee_value, StringView call_type) const;
NonnullRefPtr<Expression> m_callee;
Vector<Argument> const m_arguments;
@ -1307,8 +1310,7 @@ private:
Value this_value;
Value callee;
};
ThisAndCallee compute_this_and_callee(Interpreter&, GlobalObject&, Reference const&) const;
ThrowCompletionOr<ThisAndCallee> compute_this_and_callee(Interpreter&, GlobalObject&, Reference const&) const;
};
class NewExpression final : public CallExpression {
@ -1318,7 +1320,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual bool is_new_expression() const override { return true; }
};
@ -1331,7 +1333,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
private:
@ -1375,7 +1377,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -1400,7 +1402,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -1441,7 +1443,7 @@ public:
auto& target() const { return m_target; }
Expression const* init() const { return m_init; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
private:
@ -1460,7 +1462,7 @@ public:
DeclarationKind declaration_kind() const { return m_declaration_kind; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -1506,7 +1508,7 @@ public:
bool is_method() const { return m_is_method; }
virtual void dump(int indent) const override;
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
private:
NonnullRefPtr<Expression> m_key;
@ -1524,7 +1526,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -1545,7 +1547,7 @@ public:
Vector<RefPtr<Expression>> const& elements() const { return m_elements; }
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -1568,7 +1570,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -1589,7 +1591,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -1608,7 +1610,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
virtual ThrowCompletionOr<Reference> to_reference(Interpreter&, GlobalObject&) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -1662,7 +1664,7 @@ public:
{
}
virtual Value execute(Interpreter& interpreter, GlobalObject& global_object) const override;
virtual Completion execute(Interpreter& interpreter, GlobalObject& global_object) const override;
virtual ThrowCompletionOr<JS::Reference> to_reference(Interpreter& interpreter, GlobalObject& global_object) const override;
virtual void dump(int indent) const override;
@ -1671,7 +1673,7 @@ private:
JS::Reference reference;
Value value;
};
Optional<ReferenceAndValue> to_reference_and_value(Interpreter&, GlobalObject&) const;
ThrowCompletionOr<ReferenceAndValue> to_reference_and_value(Interpreter&, GlobalObject&) const;
NonnullRefPtr<Expression> m_base;
Vector<Reference> m_references;
@ -1690,7 +1692,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void dump(int indent) const override;
private:
@ -1707,7 +1709,7 @@ public:
}
virtual void dump(int indent) const override;
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
private:
NonnullRefPtr<Expression> m_specifier;
@ -1725,7 +1727,7 @@ public:
}
virtual void dump(int indent) const override;
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
private:
@ -1754,7 +1756,7 @@ public:
BlockStatement const& body() const { return m_body; }
virtual void dump(int indent) const override;
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
private:
Variant<FlyString, NonnullRefPtr<BindingPattern>> m_parameter;
@ -1776,7 +1778,7 @@ public:
BlockStatement const* finalizer() const { return m_finalizer; }
virtual void dump(int indent) const override;
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
void add_label(FlyString string) override;
@ -1797,7 +1799,7 @@ public:
Expression const& argument() const { return m_argument; }
virtual void dump(int indent) const override;
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
private:
@ -1815,7 +1817,7 @@ public:
Expression const* test() const { return m_test; }
virtual void dump(int indent) const override;
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
private:
RefPtr<Expression> m_test;
@ -1830,7 +1832,7 @@ public:
}
virtual void dump(int indent) const override;
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
void add_case(NonnullRefPtr<SwitchCase> switch_case) { m_cases.append(move(switch_case)); }
@ -1848,7 +1850,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
FlyString const& target_label() const { return m_target_label; }
virtual void generate_bytecode(Bytecode::Generator&) const override;
@ -1865,7 +1867,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
FlyString const& target_label() const { return m_target_label; }
@ -1881,7 +1883,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override;
virtual Completion execute(Interpreter&, GlobalObject&) const override;
virtual void generate_bytecode(Bytecode::Generator&) const override;
};
@ -1894,7 +1896,7 @@ public:
{
}
virtual Value execute(Interpreter&, GlobalObject&) const override { return m_value; }
virtual Completion execute(Interpreter&, GlobalObject&) const override { return m_value; }
virtual ThrowCompletionOr<Reference> to_reference(Interpreter&, GlobalObject&) const override { return m_reference; }
private: