|
@@ -12,6 +12,11 @@
|
|
|
|
|
|
namespace JS {
|
|
namespace JS {
|
|
|
|
|
|
|
|
+FunctionObject::FunctionObject(GlobalObject& global_object, Object* prototype)
|
|
|
|
+ : Object(global_object, prototype)
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+
|
|
FunctionObject::FunctionObject(Object& prototype)
|
|
FunctionObject::FunctionObject(Object& prototype)
|
|
: 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 }));
|
|
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);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
}
|
|
}
|