mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-12-02 12:30:31 +00:00
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:
parent
368af9ad6e
commit
87b9fa2636
Notes:
sideshowbarker
2024-07-18 02:13:10 +09:00
2 changed files with 6 additions and 34 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue