diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp index a815a6715a..00dcd1ccb3 100644 --- a/Libraries/LibJS/AST.cpp +++ b/Libraries/LibJS/AST.cpp @@ -100,10 +100,10 @@ Value WhileStatement::execute(Interpreter& interpreter) const Value ForStatement::execute(Interpreter& interpreter) const { - OwnPtr wrapper; + RefPtr wrapper; if (m_init->is_variable_declaration() && static_cast(m_init.ptr())->declaration_type() != DeclarationType::Var) { - wrapper = make(); + wrapper = create_ast_node(); interpreter.enter_scope(*wrapper, {}, ScopeType::Block); } diff --git a/Libraries/LibJS/AST.h b/Libraries/LibJS/AST.h index b71ed57732..404e376d30 100644 --- a/Libraries/LibJS/AST.h +++ b/Libraries/LibJS/AST.h @@ -26,8 +26,8 @@ #pragma once -#include -#include +#include +#include #include #include #include @@ -35,7 +35,14 @@ namespace JS { -class ASTNode { +template +static inline NonnullRefPtr +create_ast_node(Args&&... args) +{ + return adopt(*new T(forward(args)...)); +} + +class ASTNode : public RefCounted { public: virtual ~ASTNode() {} virtual const char* class_name() const = 0; @@ -62,7 +69,7 @@ public: class ExpressionStatement final : public Statement { public: - ExpressionStatement(NonnullOwnPtr expression) + ExpressionStatement(NonnullRefPtr expression) : m_expression(move(expression)) { } @@ -72,7 +79,7 @@ public: virtual void dump(int indent) const override; private: - NonnullOwnPtr m_expression; + NonnullRefPtr m_expression; }; class ScopeNode : public Statement { @@ -84,12 +91,12 @@ public: m_children.append(move(child)); return static_cast(m_children.last()); } - void append(NonnullOwnPtr child) + void append(NonnullRefPtr child) { m_children.append(move(child)); } - const NonnullOwnPtrVector& children() const { return m_children; } + const NonnullRefPtrVector& children() const { return m_children; } virtual Value execute(Interpreter&) const override; virtual void dump(int indent) const override; @@ -97,7 +104,7 @@ protected: ScopeNode() {} private: - NonnullOwnPtrVector m_children; + NonnullRefPtrVector m_children; }; class Program : public ScopeNode { @@ -118,7 +125,7 @@ private: class FunctionDeclaration : public Statement { public: - FunctionDeclaration(String name, NonnullOwnPtr body, Vector parameters = {}) + FunctionDeclaration(String name, NonnullRefPtr body, Vector parameters = {}) : m_name(move(name)) , m_body(move(body)) , m_parameters(move(parameters)) @@ -136,7 +143,7 @@ private: virtual const char* class_name() const override { return "FunctionDeclaration"; } String m_name; - NonnullOwnPtr m_body; + NonnullRefPtr m_body; const Vector m_parameters; }; @@ -153,7 +160,7 @@ public: class ReturnStatement : public Statement { public: - explicit ReturnStatement(OwnPtr argument) + explicit ReturnStatement(RefPtr argument) : m_argument(move(argument)) { } @@ -166,12 +173,12 @@ public: private: virtual const char* class_name() const override { return "ReturnStatement"; } - OwnPtr m_argument; + RefPtr m_argument; }; class IfStatement : public Statement { public: - IfStatement(NonnullOwnPtr predicate, NonnullOwnPtr consequent, NonnullOwnPtr alternate) + IfStatement(NonnullRefPtr predicate, NonnullRefPtr consequent, NonnullRefPtr alternate) : m_predicate(move(predicate)) , m_consequent(move(consequent)) , m_alternate(move(alternate)) @@ -188,14 +195,14 @@ public: private: virtual const char* class_name() const override { return "IfStatement"; } - NonnullOwnPtr m_predicate; - NonnullOwnPtr m_consequent; - NonnullOwnPtr m_alternate; + NonnullRefPtr m_predicate; + NonnullRefPtr m_consequent; + NonnullRefPtr m_alternate; }; class WhileStatement : public Statement { public: - WhileStatement(NonnullOwnPtr predicate, NonnullOwnPtr body) + WhileStatement(NonnullRefPtr predicate, NonnullRefPtr body) : m_predicate(move(predicate)) , m_body(move(body)) { @@ -210,13 +217,13 @@ public: private: virtual const char* class_name() const override { return "WhileStatement"; } - NonnullOwnPtr m_predicate; - NonnullOwnPtr m_body; + NonnullRefPtr m_predicate; + NonnullRefPtr m_body; }; class ForStatement : public Statement { public: - ForStatement(OwnPtr init, OwnPtr test, OwnPtr update, NonnullOwnPtr body) + ForStatement(RefPtr init, RefPtr test, RefPtr update, NonnullRefPtr body) : m_init(move(init)) , m_test(move(test)) , m_update(move(update)) @@ -235,10 +242,10 @@ public: private: virtual const char* class_name() const override { return "ForStatement"; } - OwnPtr m_init; - OwnPtr m_test; - OwnPtr m_update; - NonnullOwnPtr m_body; + RefPtr m_init; + RefPtr m_test; + RefPtr m_update; + NonnullRefPtr m_body; }; enum class BinaryOp { @@ -263,7 +270,7 @@ enum class BinaryOp { class BinaryExpression : public Expression { public: - BinaryExpression(BinaryOp op, NonnullOwnPtr lhs, NonnullOwnPtr rhs) + BinaryExpression(BinaryOp op, NonnullRefPtr lhs, NonnullRefPtr rhs) : m_op(op) , m_lhs(move(lhs)) , m_rhs(move(rhs)) @@ -277,8 +284,8 @@ private: virtual const char* class_name() const override { return "BinaryExpression"; } BinaryOp m_op; - NonnullOwnPtr m_lhs; - NonnullOwnPtr m_rhs; + NonnullRefPtr m_lhs; + NonnullRefPtr m_rhs; }; enum class LogicalOp { @@ -288,7 +295,7 @@ enum class LogicalOp { class LogicalExpression : public Expression { public: - LogicalExpression(LogicalOp op, NonnullOwnPtr lhs, NonnullOwnPtr rhs) + LogicalExpression(LogicalOp op, NonnullRefPtr lhs, NonnullRefPtr rhs) : m_op(op) , m_lhs(move(lhs)) , m_rhs(move(rhs)) @@ -302,8 +309,8 @@ private: virtual const char* class_name() const override { return "LogicalExpression"; } LogicalOp m_op; - NonnullOwnPtr m_lhs; - NonnullOwnPtr m_rhs; + NonnullRefPtr m_lhs; + NonnullRefPtr m_rhs; }; enum class UnaryOp { @@ -314,7 +321,7 @@ enum class UnaryOp { class UnaryExpression : public Expression { public: - UnaryExpression(UnaryOp op, NonnullOwnPtr lhs) + UnaryExpression(UnaryOp op, NonnullRefPtr lhs) : m_op(op) , m_lhs(move(lhs)) { @@ -327,7 +334,7 @@ private: virtual const char* class_name() const override { return "UnaryExpression"; } UnaryOp m_op; - NonnullOwnPtr m_lhs; + NonnullRefPtr m_lhs; }; class Literal : public Expression { @@ -432,7 +439,7 @@ private: class CallExpression : public Expression { public: - explicit CallExpression(NonnullOwnPtr callee, NonnullOwnPtrVector arguments = {}) + explicit CallExpression(NonnullRefPtr callee, NonnullRefPtrVector arguments = {}) : m_callee(move(callee)) , m_arguments(move(arguments)) { @@ -444,8 +451,8 @@ public: private: virtual const char* class_name() const override { return "CallExpression"; } - NonnullOwnPtr m_callee; - const NonnullOwnPtrVector m_arguments; + NonnullRefPtr m_callee; + const NonnullRefPtrVector m_arguments; }; enum class AssignmentOp { @@ -458,7 +465,7 @@ enum class AssignmentOp { class AssignmentExpression : public Expression { public: - AssignmentExpression(AssignmentOp op, NonnullOwnPtr lhs, NonnullOwnPtr rhs) + AssignmentExpression(AssignmentOp op, NonnullRefPtr lhs, NonnullRefPtr rhs) : m_op(op) , m_lhs(move(lhs)) , m_rhs(move(rhs)) @@ -472,8 +479,8 @@ private: virtual const char* class_name() const override { return "AssignmentExpression"; } AssignmentOp m_op; - NonnullOwnPtr m_lhs; - NonnullOwnPtr m_rhs; + NonnullRefPtr m_lhs; + NonnullRefPtr m_rhs; }; enum class UpdateOp { @@ -483,7 +490,7 @@ enum class UpdateOp { class UpdateExpression : public Expression { public: - UpdateExpression(UpdateOp op, NonnullOwnPtr argument, bool prefixed = false) + UpdateExpression(UpdateOp op, NonnullRefPtr argument, bool prefixed = false) : m_op(op) , m_argument(move(argument)) , m_prefixed(prefixed) @@ -497,7 +504,7 @@ private: virtual const char* class_name() const override { return "UpdateExpression"; } UpdateOp m_op; - NonnullOwnPtr m_argument; + NonnullRefPtr m_argument; bool m_prefixed; }; @@ -509,7 +516,7 @@ enum class DeclarationType { class VariableDeclaration : public Statement { public: - VariableDeclaration(NonnullOwnPtr name, OwnPtr initializer, DeclarationType declaration_type) + VariableDeclaration(NonnullRefPtr name, RefPtr initializer, DeclarationType declaration_type) : m_declaration_type(declaration_type) , m_name(move(name)) , m_initializer(move(initializer)) @@ -527,8 +534,8 @@ private: virtual const char* class_name() const override { return "VariableDeclaration"; } DeclarationType m_declaration_type; - NonnullOwnPtr m_name; - OwnPtr m_initializer; + NonnullRefPtr m_name; + RefPtr m_initializer; }; class ObjectExpression : public Expression { @@ -544,7 +551,7 @@ private: class MemberExpression final : public Expression { public: - MemberExpression(NonnullOwnPtr object, NonnullOwnPtr property) + MemberExpression(NonnullRefPtr object, NonnullRefPtr property) : m_object(move(object)) , m_property(move(property)) { @@ -559,8 +566,8 @@ private: virtual bool is_member_expression() const override { return true; } virtual const char* class_name() const override { return "MemberExpression"; } - NonnullOwnPtr m_object; - NonnullOwnPtr m_property; + NonnullRefPtr m_object; + NonnullRefPtr m_property; }; } diff --git a/Libraries/LibJS/Interpreter.cpp b/Libraries/LibJS/Interpreter.cpp index 97645092de..8f36fe58e2 100644 --- a/Libraries/LibJS/Interpreter.cpp +++ b/Libraries/LibJS/Interpreter.cpp @@ -72,7 +72,7 @@ void Interpreter::enter_scope(const ScopeNode& scope_node, Vector argu void Interpreter::exit_scope(const ScopeNode& scope_node) { - while (&m_scope_stack.last().scope_node != &scope_node) + while (m_scope_stack.last().scope_node.ptr() != &scope_node) m_scope_stack.take_last(); } diff --git a/Libraries/LibJS/Interpreter.h b/Libraries/LibJS/Interpreter.h index 897c210c32..727cc67629 100644 --- a/Libraries/LibJS/Interpreter.h +++ b/Libraries/LibJS/Interpreter.h @@ -47,7 +47,7 @@ struct Variable { struct ScopeFrame { ScopeType type; - const ScopeNode& scope_node; + NonnullRefPtr scope_node; HashMap variables; }; diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index dbc307ba4e..051fec8983 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -163,9 +163,9 @@ Associativity Parser::operator_associativity(TokenType type) const } } -NonnullOwnPtr Parser::parse_program() +NonnullRefPtr Parser::parse_program() { - auto program = make(); + auto program = adopt(*new Program); while (!done()) { if (match(TokenType::Semicolon)) { consume(); @@ -179,10 +179,10 @@ NonnullOwnPtr Parser::parse_program() return program; } -NonnullOwnPtr Parser::parse_statement() +NonnullRefPtr Parser::parse_statement() { if (match_expression()) { - return make(parse_expression(0)); + return adopt(*new ExpressionStatement(parse_expression(0))); } switch (m_current_token.type()) { @@ -202,11 +202,11 @@ NonnullOwnPtr Parser::parse_statement() m_has_errors = true; expected("statement (missing switch case)"); consume(); - return make(); + return create_ast_node(); } } -NonnullOwnPtr Parser::parse_primary_expression() +NonnullRefPtr Parser::parse_primary_expression() { switch (m_current_token.type()) { case TokenType::ParenOpen: { @@ -216,64 +216,64 @@ NonnullOwnPtr Parser::parse_primary_expression() return expression; } case TokenType::Identifier: - return make(consume().value()); + return create_ast_node(consume().value()); case TokenType::NumericLiteral: - return make(consume().double_value()); + return create_ast_node(consume().double_value()); case TokenType::BoolLiteral: - return make(consume().bool_value()); + return create_ast_node(consume().bool_value()); case TokenType::StringLiteral: - return make(consume().string_value()); + return create_ast_node(consume().string_value()); case TokenType::NullLiteral: consume(); - return make(); + return create_ast_node(); case TokenType::UndefinedLiteral: consume(); - return make(); + return create_ast_node(); case TokenType::CurlyOpen: return parse_object_expression(); default: m_has_errors = true; expected("primary expression (missing switch case)"); consume(); - return make(); + return create_ast_node(); } } -NonnullOwnPtr Parser::parse_unary_prefixed_expression() +NonnullRefPtr Parser::parse_unary_prefixed_expression() { switch (m_current_token.type()) { case TokenType::PlusPlus: consume(); - return make(UpdateOp::Increment, parse_primary_expression(), true); + return create_ast_node(UpdateOp::Increment, parse_primary_expression(), true); case TokenType::MinusMinus: consume(); - return make(UpdateOp::Decrement, parse_primary_expression(), true); + return create_ast_node(UpdateOp::Decrement, parse_primary_expression(), true); case TokenType::ExclamationMark: consume(); - return make(UnaryOp::Not, parse_primary_expression()); + return create_ast_node(UnaryOp::Not, parse_primary_expression()); case TokenType::Tilde: consume(); - return make(UnaryOp::BitwiseNot, parse_primary_expression()); + return create_ast_node(UnaryOp::BitwiseNot, parse_primary_expression()); case TokenType::Typeof: consume(); - return make(UnaryOp::Typeof, parse_primary_expression()); + return create_ast_node(UnaryOp::Typeof, parse_primary_expression()); default: m_has_errors = true; expected("primary expression (missing switch case)"); consume(); - return make(); + return create_ast_node(); } } -NonnullOwnPtr Parser::parse_object_expression() +NonnullRefPtr Parser::parse_object_expression() { // FIXME: Parse actual object expression consume(TokenType::CurlyOpen); consume(TokenType::CurlyClose); - return make(); + return create_ast_node(); } -NonnullOwnPtr Parser::parse_expression(int min_precedence, Associativity associativity) +NonnullRefPtr Parser::parse_expression(int min_precedence, Associativity associativity) { if (match_unary_prefixed_expression()) return parse_unary_prefixed_expression(); @@ -292,90 +292,90 @@ NonnullOwnPtr Parser::parse_expression(int min_precedence, Associati return expression; } -NonnullOwnPtr Parser::parse_secondary_expression(NonnullOwnPtr lhs, int min_precedence, Associativity associativity) +NonnullRefPtr Parser::parse_secondary_expression(NonnullRefPtr lhs, int min_precedence, Associativity associativity) { switch (m_current_token.type()) { case TokenType::Plus: consume(); - return make(BinaryOp::Plus, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(BinaryOp::Plus, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::PlusEquals: consume(); - return make(AssignmentOp::AdditionAssignment, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(AssignmentOp::AdditionAssignment, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::Minus: consume(); - return make(BinaryOp::Minus, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(BinaryOp::Minus, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::MinusEquals: consume(); - return make(AssignmentOp::SubtractionAssignment, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(AssignmentOp::SubtractionAssignment, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::Asterisk: consume(); - return make(BinaryOp::Asterisk, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(BinaryOp::Asterisk, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::AsteriskEquals: consume(); - return make(AssignmentOp::MultiplicationAssignment, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(AssignmentOp::MultiplicationAssignment, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::Slash: consume(); - return make(BinaryOp::Slash, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(BinaryOp::Slash, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::SlashEquals: consume(); - return make(AssignmentOp::DivisionAssignment, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(AssignmentOp::DivisionAssignment, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::GreaterThan: consume(); - return make(BinaryOp::GreaterThan, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(BinaryOp::GreaterThan, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::GreaterThanEquals: consume(); - return make(BinaryOp::GreaterThanEquals, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(BinaryOp::GreaterThanEquals, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::LessThan: consume(); - return make(BinaryOp::LessThan, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(BinaryOp::LessThan, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::LessThanEquals: consume(); - return make(BinaryOp::LessThanEquals, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(BinaryOp::LessThanEquals, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::EqualsEqualsEquals: consume(); - return make(BinaryOp::TypedEquals, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(BinaryOp::TypedEquals, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::ExclamationMarkEqualsEquals: consume(); - return make(BinaryOp::TypedInequals, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(BinaryOp::TypedInequals, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::EqualsEquals: consume(); - return make(BinaryOp::AbstractEquals, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(BinaryOp::AbstractEquals, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::ExclamationMarkEquals: consume(); - return make(BinaryOp::AbstractInequals, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(BinaryOp::AbstractInequals, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::ParenOpen: return parse_call_expression(move(lhs)); case TokenType::Equals: consume(); - return make(AssignmentOp::Assignment, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(AssignmentOp::Assignment, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::Period: consume(); - return make(move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(move(lhs), parse_expression(min_precedence, associativity)); case TokenType::PlusPlus: consume(); - return make(UpdateOp::Increment, move(lhs)); + return create_ast_node(UpdateOp::Increment, move(lhs)); case TokenType::MinusMinus: consume(); - return make(UpdateOp::Decrement, move(lhs)); + return create_ast_node(UpdateOp::Decrement, move(lhs)); case TokenType::DoubleAmpersand: consume(); - return make(LogicalOp::And, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(LogicalOp::And, move(lhs), parse_expression(min_precedence, associativity)); case TokenType::DoublePipe: consume(); - return make(LogicalOp::Or, move(lhs), parse_expression(min_precedence, associativity)); + return create_ast_node(LogicalOp::Or, move(lhs), parse_expression(min_precedence, associativity)); default: m_has_errors = true; expected("secondary expression (missing switch case)"); consume(); - return make(); + return create_ast_node(); } } -NonnullOwnPtr Parser::parse_call_expression(NonnullOwnPtr lhs) +NonnullRefPtr Parser::parse_call_expression(NonnullRefPtr lhs) { consume(TokenType::ParenOpen); - NonnullOwnPtrVector arguments; + NonnullRefPtrVector arguments; while (match_expression()) { arguments.append(parse_expression(0)); @@ -386,21 +386,21 @@ NonnullOwnPtr Parser::parse_call_expression(NonnullOwnPtr(move(lhs), move(arguments)); + return create_ast_node(move(lhs), move(arguments)); } -NonnullOwnPtr Parser::parse_return_statement() +NonnullRefPtr Parser::parse_return_statement() { consume(TokenType::Return); if (match_expression()) { - return make(parse_expression(0)); + return create_ast_node(parse_expression(0)); } - return make(nullptr); + return create_ast_node(nullptr); } -NonnullOwnPtr Parser::parse_block_statement() +NonnullRefPtr Parser::parse_block_statement() { - auto block = make(); + auto block = create_ast_node(); consume(TokenType::CurlyOpen); while (!done() && !match(TokenType::CurlyClose)) { if (match(TokenType::Semicolon)) { @@ -416,7 +416,7 @@ NonnullOwnPtr Parser::parse_block_statement() return block; } -NonnullOwnPtr Parser::parse_function_declaration() +NonnullRefPtr Parser::parse_function_declaration() { consume(TokenType::Function); auto name = consume(TokenType::Identifier).value(); @@ -432,10 +432,10 @@ NonnullOwnPtr Parser::parse_function_declaration() } consume(TokenType::ParenClose); auto body = parse_block_statement(); - return make(name, move(body), move(parameters)); + return create_ast_node(name, move(body), move(parameters)); } -NonnullOwnPtr Parser::parse_variable_declaration() +NonnullRefPtr Parser::parse_variable_declaration() { DeclarationType declaration_type; @@ -456,21 +456,21 @@ NonnullOwnPtr Parser::parse_variable_declaration() ASSERT_NOT_REACHED(); } auto name = consume(TokenType::Identifier).value(); - OwnPtr initializer; + RefPtr initializer; if (match(TokenType::Equals)) { consume(); initializer = parse_expression(0); } - return make(make(name), move(initializer), declaration_type); + return create_ast_node(create_ast_node(name), move(initializer), declaration_type); } -NonnullOwnPtr Parser::parse_for_statement() +NonnullRefPtr Parser::parse_for_statement() { consume(TokenType::For); consume(TokenType::ParenOpen); - OwnPtr init = nullptr; + RefPtr init; switch (m_current_token.type()) { case TokenType::Semicolon: break; @@ -481,7 +481,7 @@ NonnullOwnPtr Parser::parse_for_statement() consume(TokenType::Semicolon); - OwnPtr test = nullptr; + RefPtr test; switch (m_current_token.type()) { case TokenType::Semicolon: break; @@ -492,7 +492,7 @@ NonnullOwnPtr Parser::parse_for_statement() consume(TokenType::Semicolon); - OwnPtr update = nullptr; + RefPtr update; switch (m_current_token.type()) { case TokenType::Semicolon: break; @@ -505,7 +505,7 @@ NonnullOwnPtr Parser::parse_for_statement() auto body = parse_block_statement(); - return make(move(init), move(test), move(update), move(body)); + return create_ast_node(move(init), move(test), move(update), move(body)); } bool Parser::match(TokenType type) const diff --git a/Libraries/LibJS/Parser.h b/Libraries/LibJS/Parser.h index 003a4ea2fb..229c507e11 100644 --- a/Libraries/LibJS/Parser.h +++ b/Libraries/LibJS/Parser.h @@ -28,7 +28,7 @@ #include "AST.h" #include "Lexer.h" -#include +#include namespace JS { @@ -41,21 +41,21 @@ class Parser { public: explicit Parser(Lexer lexer); - NonnullOwnPtr parse_program(); + NonnullRefPtr parse_program(); - NonnullOwnPtr parse_statement(); - NonnullOwnPtr parse_block_statement(); - NonnullOwnPtr parse_return_statement(); - NonnullOwnPtr parse_function_declaration(); - NonnullOwnPtr parse_variable_declaration(); - NonnullOwnPtr parse_for_statement(); + NonnullRefPtr parse_statement(); + NonnullRefPtr parse_block_statement(); + NonnullRefPtr parse_return_statement(); + NonnullRefPtr parse_function_declaration(); + NonnullRefPtr parse_variable_declaration(); + NonnullRefPtr parse_for_statement(); - NonnullOwnPtr parse_expression(int min_precedence, Associativity associate = Associativity::Right); - NonnullOwnPtr parse_primary_expression(); - NonnullOwnPtr parse_unary_prefixed_expression(); - NonnullOwnPtr parse_object_expression(); - NonnullOwnPtr parse_secondary_expression(NonnullOwnPtr, int min_precedence, Associativity associate = Associativity::Right); - NonnullOwnPtr parse_call_expression(NonnullOwnPtr); + NonnullRefPtr parse_expression(int min_precedence, Associativity associate = Associativity::Right); + NonnullRefPtr parse_primary_expression(); + NonnullRefPtr parse_unary_prefixed_expression(); + NonnullRefPtr parse_object_expression(); + NonnullRefPtr parse_secondary_expression(NonnullRefPtr, int min_precedence, Associativity associate = Associativity::Right); + NonnullRefPtr parse_call_expression(NonnullRefPtr); bool has_errors() const { return m_has_errors; } diff --git a/Libraries/LibJS/Runtime/ScriptFunction.cpp b/Libraries/LibJS/Runtime/ScriptFunction.cpp index 62cb98f20e..b7a766bfe3 100644 --- a/Libraries/LibJS/Runtime/ScriptFunction.cpp +++ b/Libraries/LibJS/Runtime/ScriptFunction.cpp @@ -24,6 +24,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include diff --git a/Libraries/LibJS/Runtime/ScriptFunction.h b/Libraries/LibJS/Runtime/ScriptFunction.h index 6643cbbfb5..4d3fc4b2c1 100644 --- a/Libraries/LibJS/Runtime/ScriptFunction.h +++ b/Libraries/LibJS/Runtime/ScriptFunction.h @@ -44,7 +44,7 @@ private: virtual bool is_script_function() const final { return true; } virtual const char* class_name() const override { return "ScriptFunction"; } - const ScopeNode& m_body; + NonnullRefPtr m_body; const Vector m_parameters; };