浏览代码

LibJS: Add FunctionObject constructor allowing null prototype

This just calls through to the Object constructor added in the previous
commit.
Linus Groh 3 年之前
父节点
当前提交
87b9fa2636

+ 5 - 33
Userland/Libraries/LibJS/Runtime/FunctionObject.cpp

@@ -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);
-}
-
 }
 }

+ 1 - 1
Userland/Libraries/LibJS/Runtime/FunctionObject.h

@@ -31,7 +31,6 @@ public:
 
 
     void set_function_name(Variant<PropertyKey, PrivateName> const& name_arg, Optional<StringView> const& prefix = {});
     void set_function_name(Variant<PropertyKey, PrivateName> const& name_arg, Optional<StringView> const& prefix = {});
     void set_function_length(double length);
     void set_function_length(double length);
-    ThrowCompletionOr<BoundFunction*> bind(Value bound_this_value, Vector<Value> arguments);
 
 
     virtual bool is_strict_mode() const { return false; }
     virtual bool is_strict_mode() const { return false; }
 
 
@@ -41,6 +40,7 @@ public:
     virtual Realm* realm() const { return nullptr; }
     virtual Realm* realm() const { return nullptr; }
 
 
 protected:
 protected:
+    explicit FunctionObject(GlobalObject&, Object* prototype);
     explicit FunctionObject(Object& prototype);
     explicit FunctionObject(Object& prototype);
 
 
 private:
 private: