LibJS: Add FunctionObject constructor allowing null prototype

This just calls through to the Object constructor added in the previous
commit.
This commit is contained in:
Linus Groh 2022-02-09 19:35:36 +00:00
parent 368af9ad6e
commit 87b9fa2636
Notes: sideshowbarker 2024-07-18 02:13:10 +09:00
2 changed files with 6 additions and 34 deletions

View file

@ -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<BoundFunction*> FunctionObject::bind(Value bound_this_value, Vector<Value> arguments)
{
auto& vm = this->vm();
FunctionObject& target_function = is<BoundFunction>(*this) ? static_cast<BoundFunction&>(*this).bound_target_function() : *this;
auto get_bound_this_object = [&vm, bound_this_value, this]() -> ThrowCompletionOr<Value> {
if (is<BoundFunction>(*this) && !static_cast<BoundFunction&>(*this).bound_this().is_empty())
return static_cast<BoundFunction&>(*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<i32>(arguments.size()));
Vector<Value> all_bound_arguments;
if (is<BoundFunction>(*this))
all_bound_arguments.extend(static_cast<BoundFunction&>(*this).bound_arguments());
all_bound_arguments.extend(move(arguments));
return heap().allocate<BoundFunction>(global_object(), global_object(), target_function, bound_this_object, move(all_bound_arguments), computed_length);
}
}

View file

@ -31,7 +31,6 @@ public:
void set_function_name(Variant<PropertyKey, PrivateName> const& name_arg, Optional<StringView> const& prefix = {});
void set_function_length(double length);
ThrowCompletionOr<BoundFunction*> bind(Value bound_this_value, Vector<Value> 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: