mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 05:07:34 +00:00
LibJS: Implement Function.prototype.bind() according to the spec :^)
This commit is contained in:
parent
87b9fa2636
commit
898ad7c682
4 changed files with 66 additions and 20 deletions
|
@ -11,23 +11,37 @@
|
|||
|
||||
namespace JS {
|
||||
|
||||
BoundFunction::BoundFunction(GlobalObject& global_object, FunctionObject& bound_target_function, Value bound_this, Vector<Value> bound_arguments, i32 length)
|
||||
: FunctionObject(*global_object.function_prototype())
|
||||
// 10.4.1.3 BoundFunctionCreate ( targetFunction, boundThis, boundArgs ), https://tc39.es/ecma262/multipage/ordinary-and-exotic-objects-behaviours.html#sec-boundfunctioncreate
|
||||
ThrowCompletionOr<BoundFunction*> BoundFunction::create(GlobalObject& global_object, FunctionObject& target_function, Value bound_this, Vector<Value> bound_arguments)
|
||||
{
|
||||
// 1. Let proto be ? targetFunction.[[GetPrototypeOf]]().
|
||||
auto* prototype = TRY(target_function.internal_get_prototype_of());
|
||||
|
||||
// 2. Let internalSlotsList be the list-concatenation of « [[Prototype]], [[Extensible]] » and the internal slots listed in Table 33.
|
||||
// 3. Let obj be ! MakeBasicObject(internalSlotsList).
|
||||
// 4. Set obj.[[Prototype]] to proto.
|
||||
// 5. Set obj.[[Call]] as described in 10.4.1.1.
|
||||
// 6. If IsConstructor(targetFunction) is true, then
|
||||
// a. Set obj.[[Construct]] as described in 10.4.1.2.
|
||||
// 7. Set obj.[[BoundTargetFunction]] to targetFunction.
|
||||
// 8. Set obj.[[BoundThis]] to boundThis.
|
||||
// 9. Set obj.[[BoundArguments]] to boundArgs.
|
||||
auto* object = global_object.heap().allocate<BoundFunction>(global_object, global_object, target_function, bound_this, move(bound_arguments), prototype);
|
||||
|
||||
// 10. Return obj.
|
||||
return object;
|
||||
}
|
||||
|
||||
BoundFunction::BoundFunction(GlobalObject& global_object, FunctionObject& bound_target_function, Value bound_this, Vector<Value> bound_arguments, Object* prototype)
|
||||
: FunctionObject(global_object, prototype)
|
||||
, m_bound_target_function(&bound_target_function)
|
||||
, m_bound_this(bound_this)
|
||||
, m_bound_arguments(move(bound_arguments))
|
||||
// FIXME: Non-standard and redundant, remove.
|
||||
, m_name(String::formatted("bound {}", bound_target_function.name()))
|
||||
, m_length(length)
|
||||
{
|
||||
}
|
||||
|
||||
void BoundFunction::initialize(GlobalObject& global_object)
|
||||
{
|
||||
auto& vm = this->vm();
|
||||
Base::initialize(global_object);
|
||||
define_direct_property(vm.names.length, Value(m_length), Attribute::Configurable);
|
||||
}
|
||||
|
||||
BoundFunction::~BoundFunction()
|
||||
{
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue