Bläddra i källkod

LibJS: Allow Function objects to be constructed with a bound |this|
value and bound arguments

This allows Function objects produced by Function.prototype.bind, as well
as arrow functions to track their |this| values and bound arguments.

Jack Karamanian 5 år sedan
förälder
incheckning
5750edd859
2 ändrade filer med 35 tillägg och 0 borttagningar
  1. 20 0
      Libraries/LibJS/Runtime/Function.cpp
  2. 15 0
      Libraries/LibJS/Runtime/Function.h

+ 20 - 0
Libraries/LibJS/Runtime/Function.cpp

@@ -30,8 +30,28 @@
 namespace JS {
 
 Function::Function(Object& prototype)
+    : Function(prototype, {}, {})
+{
+}
+
+Function::Function(Object& prototype, Optional<Value> bound_this, Vector<Value> bound_arguments)
     : Object(&prototype)
+    , m_bound_this(bound_this)
+    , m_bound_arguments(move(bound_arguments))
+{
+}
+
+void Function::visit_children(Visitor& visitor)
 {
+    Object::visit_children(visitor);
+
+    if (m_bound_this.has_value()) {
+        visitor.visit(m_bound_this.value());
+    }
+
+    for (auto argument : m_bound_arguments) {
+        visitor.visit(argument);
+    }
 }
 
 Function::~Function()

+ 15 - 0
Libraries/LibJS/Runtime/Function.h

@@ -40,12 +40,27 @@ public:
     virtual const FlyString& name() const = 0;
     virtual LexicalEnvironment* create_environment() = 0;
 
+    virtual void visit_children(Visitor&) override;
+
+    Optional<Value> bound_this() const
+    {
+        return m_bound_this;
+    }
+
+    const Vector<Value>& bound_arguments() const
+    {
+        return m_bound_arguments;
+    }
+
 protected:
     explicit Function(Object& prototype);
+    explicit Function(Object& prototype, Optional<Value> bound_this, Vector<Value> bound_arguments);
     virtual const char* class_name() const override { return "Function"; }
 
 private:
     virtual bool is_function() const final { return true; }
+    Optional<Value> m_bound_this;
+    Vector<Value> m_bound_arguments;
 };
 
 }