From 87b9fa2636456c45d11d10583a3618e67de3408c Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Wed, 9 Feb 2022 19:35:36 +0000 Subject: [PATCH] LibJS: Add FunctionObject constructor allowing null prototype This just calls through to the Object constructor added in the previous commit. --- .../LibJS/Runtime/FunctionObject.cpp | 38 +++---------------- .../Libraries/LibJS/Runtime/FunctionObject.h | 2 +- 2 files changed, 6 insertions(+), 34 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/FunctionObject.cpp b/Userland/Libraries/LibJS/Runtime/FunctionObject.cpp index f7a448b5a4..e8fe5847fb 100644 --- a/Userland/Libraries/LibJS/Runtime/FunctionObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/FunctionObject.cpp @@ -12,6 +12,11 @@ namespace JS { +FunctionObject::FunctionObject(GlobalObject& global_object, Object* prototype) + : Object(global_object, prototype) +{ +} + FunctionObject::FunctionObject(Object& prototype) : Object(prototype) { @@ -92,37 +97,4 @@ void FunctionObject::set_function_length(double length) MUST(define_property_or_throw(vm.names.length, PropertyDescriptor { .value = Value { length }, .writable = false, .enumerable = false, .configurable = true })); } -ThrowCompletionOr FunctionObject::bind(Value bound_this_value, Vector arguments) -{ - auto& vm = this->vm(); - FunctionObject& target_function = is(*this) ? static_cast(*this).bound_target_function() : *this; - - auto get_bound_this_object = [&vm, bound_this_value, this]() -> ThrowCompletionOr { - if (is(*this) && !static_cast(*this).bound_this().is_empty()) - return static_cast(*this).bound_this(); - switch (bound_this_value.type()) { - case Value::Type::Undefined: - case Value::Type::Null: - if (vm.in_strict_mode()) - return bound_this_value; - return &global_object(); - default: - return TRY(bound_this_value.to_object(global_object())); - } - }; - auto bound_this_object = TRY(get_bound_this_object()); - - i32 computed_length = 0; - auto length_property = TRY(get(vm.names.length)); - if (length_property.is_number()) - computed_length = max(0, length_property.as_i32() - static_cast(arguments.size())); - - Vector all_bound_arguments; - if (is(*this)) - all_bound_arguments.extend(static_cast(*this).bound_arguments()); - all_bound_arguments.extend(move(arguments)); - - return heap().allocate(global_object(), global_object(), target_function, bound_this_object, move(all_bound_arguments), computed_length); -} - } diff --git a/Userland/Libraries/LibJS/Runtime/FunctionObject.h b/Userland/Libraries/LibJS/Runtime/FunctionObject.h index 7bc7a0ac80..0691ac36f6 100644 --- a/Userland/Libraries/LibJS/Runtime/FunctionObject.h +++ b/Userland/Libraries/LibJS/Runtime/FunctionObject.h @@ -31,7 +31,6 @@ public: void set_function_name(Variant const& name_arg, Optional const& prefix = {}); void set_function_length(double length); - ThrowCompletionOr bind(Value bound_this_value, Vector arguments); virtual bool is_strict_mode() const { return false; } @@ -41,6 +40,7 @@ public: virtual Realm* realm() const { return nullptr; } protected: + explicit FunctionObject(GlobalObject&, Object* prototype); explicit FunctionObject(Object& prototype); private: