From 136451c3aff8785af23be7b000176bde4fd90755 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Fri, 24 Sep 2021 23:49:24 +0200 Subject: LibJS: Move [[HomeObject]] to ECMAScriptFunctionObject --- Userland/Libraries/LibJS/AST.cpp | 6 +++--- Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp | 3 ++- Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.h | 4 ++++ Userland/Libraries/LibJS/Runtime/FunctionEnvironment.h | 9 +++++---- Userland/Libraries/LibJS/Runtime/FunctionObject.cpp | 1 - Userland/Libraries/LibJS/Runtime/FunctionObject.h | 4 ---- 6 files changed, 14 insertions(+), 13 deletions(-) (limited to 'Userland') diff --git a/Userland/Libraries/LibJS/AST.cpp b/Userland/Libraries/LibJS/AST.cpp index 96302be146..baf6728167 100644 --- a/Userland/Libraries/LibJS/AST.cpp +++ b/Userland/Libraries/LibJS/AST.cpp @@ -924,7 +924,7 @@ Value ClassExpression::execute(Interpreter& interpreter, GlobalObject& global_ob if (interpreter.exception()) return {}; - auto& method_function = method_value.as_function(); + auto& method_function = static_cast(method_value.as_function()); auto key = method.key().execute(interpreter, global_object); if (interpreter.exception()) @@ -965,7 +965,7 @@ Value ClassExpression::execute(Interpreter& interpreter, GlobalObject& global_ob if (interpreter.exception()) return {}; - FunctionObject* initializer = nullptr; + ECMAScriptFunctionObject* initializer = nullptr; if (field.initializer()) { auto copy_initializer = field.initializer(); auto body = create_ast_node(field.initializer()->source_range(), copy_initializer.release_nonnull()); @@ -1923,7 +1923,7 @@ Value ObjectExpression::execute(Interpreter& interpreter, GlobalObject& global_o return {}; if (value.is_function() && property.is_method()) - value.as_function().set_home_object(object); + static_cast(value.as_function()).set_home_object(object); String name = get_function_name(global_object, key); if (property.type() == ObjectProperty::Type::Getter) { diff --git a/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp b/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp index 28deabee52..bebb6436bc 100644 --- a/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp @@ -99,6 +99,7 @@ void ECMAScriptFunctionObject::visit_edges(Visitor& visitor) Base::visit_edges(visitor); visitor.visit(m_environment); visitor.visit(m_realm); + visitor.visit(m_home_object); } FunctionEnvironment* ECMAScriptFunctionObject::create_environment(FunctionObject& function_being_invoked) @@ -131,7 +132,7 @@ FunctionEnvironment* ECMAScriptFunctionObject::create_environment(FunctionObject } auto* environment = heap().allocate(global_object(), m_environment, variables); - environment->set_function_object(function_being_invoked); + environment->set_function_object(static_cast(function_being_invoked)); if (m_is_arrow_function) { environment->set_this_binding_status(FunctionEnvironment::ThisBindingStatus::Lexical); if (is(m_environment)) diff --git a/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.h b/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.h index eb2abd32c3..5dd9fd5d1f 100644 --- a/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.h +++ b/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.h @@ -55,6 +55,9 @@ public: ThisMode this_mode() const { return m_this_mode; } + Object* home_object() const { return m_home_object; } + void set_home_object(Object* home_object) { m_home_object = home_object; } + protected: virtual bool is_strict_mode() const final { return m_strict; } @@ -73,6 +76,7 @@ private: Realm* m_realm { nullptr }; // [[Realm]] ThisMode m_this_mode { ThisMode::Global }; // [[ThisMode]] bool m_strict { false }; // [[Strict]] + Object* m_home_object { nullptr }; // [[HomeObject]] bool m_is_class_constructor { false }; // [[IsClassConstructor]] FlyString m_name; diff --git a/Userland/Libraries/LibJS/Runtime/FunctionEnvironment.h b/Userland/Libraries/LibJS/Runtime/FunctionEnvironment.h index 83f63b0173..dbf68df575 100644 --- a/Userland/Libraries/LibJS/Runtime/FunctionEnvironment.h +++ b/Userland/Libraries/LibJS/Runtime/FunctionEnvironment.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace JS { @@ -35,9 +36,9 @@ public: void set_this_binding_status(ThisBindingStatus status) { m_this_binding_status = status; } // [[FunctionObject]] - FunctionObject& function_object() { return *m_function_object; } - FunctionObject const& function_object() const { return *m_function_object; } - void set_function_object(FunctionObject& function) { m_function_object = &function; } + ECMAScriptFunctionObject& function_object() { return *m_function_object; } + ECMAScriptFunctionObject const& function_object() const { return *m_function_object; } + void set_function_object(ECMAScriptFunctionObject& function) { m_function_object = &function; } // [[NewTarget]] Value new_target() const { return m_new_target; } @@ -56,7 +57,7 @@ private: Value m_this_value; ThisBindingStatus m_this_binding_status { ThisBindingStatus::Uninitialized }; - FunctionObject* m_function_object { nullptr }; + ECMAScriptFunctionObject* m_function_object { nullptr }; Value m_new_target; }; diff --git a/Userland/Libraries/LibJS/Runtime/FunctionObject.cpp b/Userland/Libraries/LibJS/Runtime/FunctionObject.cpp index 872542be61..0bc775a0ca 100644 --- a/Userland/Libraries/LibJS/Runtime/FunctionObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/FunctionObject.cpp @@ -88,7 +88,6 @@ void FunctionObject::visit_edges(Visitor& visitor) { Base::visit_edges(visitor); - visitor.visit(m_home_object); visitor.visit(m_bound_this); for (auto argument : m_bound_arguments) diff --git a/Userland/Libraries/LibJS/Runtime/FunctionObject.h b/Userland/Libraries/LibJS/Runtime/FunctionObject.h index 5e2cb779e1..fbd3d3932e 100644 --- a/Userland/Libraries/LibJS/Runtime/FunctionObject.h +++ b/Userland/Libraries/LibJS/Runtime/FunctionObject.h @@ -29,9 +29,6 @@ public: const Vector& bound_arguments() const { return m_bound_arguments; } - Object* home_object() const { return m_home_object; } - void set_home_object(Object* home_object) { m_home_object = home_object; } - virtual bool is_strict_mode() const { return false; } // [[Environment]] @@ -68,7 +65,6 @@ private: virtual bool is_function() const override { return true; } Value m_bound_this; Vector m_bound_arguments; - Object* m_home_object { nullptr }; bool m_has_simple_parameter_list { false }; Vector m_fields; }; -- cgit v1.2.3