diff options
-rw-r--r-- | Userland/Libraries/LibJS/Runtime/OrdinaryFunctionObject.cpp | 35 | ||||
-rw-r--r-- | Userland/Libraries/LibJS/Runtime/OrdinaryFunctionObject.h | 5 |
2 files changed, 9 insertions, 31 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/OrdinaryFunctionObject.cpp b/Userland/Libraries/LibJS/Runtime/OrdinaryFunctionObject.cpp index 02a5c06df2..0ed95fdf9d 100644 --- a/Userland/Libraries/LibJS/Runtime/OrdinaryFunctionObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/OrdinaryFunctionObject.cpp @@ -24,18 +24,6 @@ namespace JS { -static OrdinaryFunctionObject* typed_this(VM& vm, GlobalObject& global_object) -{ - auto* this_object = vm.this_value(global_object).to_object(global_object); - if (!this_object) - return nullptr; - if (!this_object->is_function()) { - vm.throw_exception<TypeError>(global_object, ErrorType::NotAFunctionNoParam); - return nullptr; - } - return static_cast<OrdinaryFunctionObject*>(this_object); -} - OrdinaryFunctionObject* OrdinaryFunctionObject::create(GlobalObject& global_object, const FlyString& name, const Statement& body, Vector<FunctionNode::Parameter> parameters, i32 m_function_length, Environment* parent_scope, FunctionKind kind, bool is_strict, bool is_arrow_function) { Object* prototype = nullptr; @@ -99,8 +87,8 @@ void OrdinaryFunctionObject::initialize(GlobalObject& global_object) } define_property(vm.names.prototype, prototype, Attribute::Writable); } - define_native_property(vm.names.length, length_getter, {}, Attribute::Configurable); - define_native_property(vm.names.name, name_getter, {}, Attribute::Configurable); + define_property_or_throw(vm.names.length, { .value = Value(m_function_length), .writable = false, .enumerable = false, .configurable = true }); + define_property_or_throw(vm.names.name, { .value = js_string(vm, m_name.is_null() ? "" : m_name), .writable = false, .enumerable = false, .configurable = true }); } OrdinaryFunctionObject::~OrdinaryFunctionObject() @@ -246,20 +234,13 @@ Value OrdinaryFunctionObject::construct(FunctionObject&) return execute_function_body(); } -JS_DEFINE_NATIVE_GETTER(OrdinaryFunctionObject::length_getter) -{ - auto* function = typed_this(vm, global_object); - if (!function) - return {}; - return Value(static_cast<i32>(function->m_function_length)); -} - -JS_DEFINE_NATIVE_GETTER(OrdinaryFunctionObject::name_getter) +void OrdinaryFunctionObject::set_name(const FlyString& name) { - auto* function = typed_this(vm, global_object); - if (!function) - return {}; - return js_string(vm, function->name().is_null() ? "" : function->name()); + VERIFY(!name.is_null()); + auto& vm = this->vm(); + m_name = name; + auto success = define_property_or_throw(vm.names.name, { .value = js_string(vm, m_name), .writable = false, .enumerable = false, .configurable = true }); + VERIFY(success); } } diff --git a/Userland/Libraries/LibJS/Runtime/OrdinaryFunctionObject.h b/Userland/Libraries/LibJS/Runtime/OrdinaryFunctionObject.h index 721c404c6e..b310d5697a 100644 --- a/Userland/Libraries/LibJS/Runtime/OrdinaryFunctionObject.h +++ b/Userland/Libraries/LibJS/Runtime/OrdinaryFunctionObject.h @@ -29,7 +29,7 @@ public: virtual Value construct(FunctionObject& new_target) override; virtual const FlyString& name() const override { return m_name; }; - void set_name(const FlyString& name) { m_name = name; }; + void set_name(const FlyString& name); void set_is_class_constructor() { m_is_class_constructor = true; }; @@ -49,9 +49,6 @@ private: Value execute_function_body(); - JS_DECLARE_NATIVE_GETTER(length_getter); - JS_DECLARE_NATIVE_GETTER(name_getter); - FlyString m_name; NonnullRefPtr<Statement> m_body; const Vector<FunctionNode::Parameter> m_parameters; |