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.
This commit is contained in:
Jack Karamanian 2020-04-19 14:42:00 -05:00 committed by Andreas Kling
parent 6a66207efa
commit 5750edd859
Notes: sideshowbarker 2024-07-19 07:25:25 +09:00
2 changed files with 36 additions and 1 deletions

View file

@ -30,10 +30,30 @@
namespace JS {
Function::Function(Object& prototype)
: 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()
{
}

View file

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