diff --git a/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp b/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp index 2d9f6eef35..7a0c6e6067 100644 --- a/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.cpp @@ -58,7 +58,7 @@ ECMAScriptFunctionObject::ECMAScriptFunctionObject(GlobalObject& global_object, m_this_mode = ThisMode::Global; // 15.1.3 Static Semantics: IsSimpleParameterList, https://tc39.es/ecma262/#sec-static-semantics-issimpleparameterlist - set_has_simple_parameter_list(all_of(m_formal_parameters, [&](auto& parameter) { + m_has_simple_parameter_list = all_of(m_formal_parameters, [&](auto& parameter) { if (parameter.is_rest) return false; if (parameter.default_value) @@ -66,7 +66,7 @@ ECMAScriptFunctionObject::ECMAScriptFunctionObject(GlobalObject& global_object, if (!parameter.binding.template has()) return false; return true; - })); + }); } void ECMAScriptFunctionObject::initialize(GlobalObject& global_object) diff --git a/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.h b/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.h index a620e67aa7..efca06b076 100644 --- a/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.h +++ b/Userland/Libraries/LibJS/Runtime/ECMAScriptFunctionObject.h @@ -68,6 +68,9 @@ public: Vector const& fields() const { return m_fields; } void add_field(StringOrSymbol property_key, ECMAScriptFunctionObject* initializer) { m_fields.empend(property_key, initializer); } + // This is for IsSimpleParameterList (static semantics) + bool has_simple_parameter_list() const { return m_has_simple_parameter_list; } + protected: virtual bool is_strict_mode() const final { return m_strict; } @@ -95,6 +98,7 @@ private: i32 m_function_length { 0 }; FunctionKind m_kind { FunctionKind::Regular }; bool m_is_arrow_function { false }; + bool m_has_simple_parameter_list { false }; }; } diff --git a/Userland/Libraries/LibJS/Runtime/FunctionObject.h b/Userland/Libraries/LibJS/Runtime/FunctionObject.h index ca41124d64..ec8bedf665 100644 --- a/Userland/Libraries/LibJS/Runtime/FunctionObject.h +++ b/Userland/Libraries/LibJS/Runtime/FunctionObject.h @@ -39,22 +39,16 @@ public: // [[Realm]] virtual Realm* realm() const { return nullptr; } - // This is for IsSimpleParameterList (static semantics) - bool has_simple_parameter_list() const { return m_has_simple_parameter_list; } - protected: virtual void visit_edges(Visitor&) override; explicit FunctionObject(Object& prototype); FunctionObject(Value bound_this, Vector bound_arguments, Object& prototype); - void set_has_simple_parameter_list(bool b) { m_has_simple_parameter_list = b; } - private: virtual bool is_function() const override { return true; } Value m_bound_this; Vector m_bound_arguments; - bool m_has_simple_parameter_list { false }; }; } diff --git a/Userland/Libraries/LibJS/Runtime/VM.cpp b/Userland/Libraries/LibJS/Runtime/VM.cpp index 4622e60859..08ae93bbb3 100644 --- a/Userland/Libraries/LibJS/Runtime/VM.cpp +++ b/Userland/Libraries/LibJS/Runtime/VM.cpp @@ -374,7 +374,7 @@ Value VM::get_variable(const FlyString& name, GlobalObject& global_object) if (possible_match.has_value()) return possible_match.value().value; if (!context.arguments_object) { - if (context.function->is_strict_mode() || !context.function->has_simple_parameter_list()) { + if (context.function->is_strict_mode() || (is(context.function) && !static_cast(context.function)->has_simple_parameter_list())) { context.arguments_object = create_unmapped_arguments_object(global_object, context.arguments.span()); } else { context.arguments_object = create_mapped_arguments_object(global_object, *context.function, verify_cast(context.function)->formal_parameters(), context.arguments.span(), *lexical_environment());