1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 13:48:12 +00:00

LibJS: Remove Interpreter& argument to Function::construct()

This is no longer needed, we can get everything we need from the VM.
This commit is contained in:
Andreas Kling 2020-09-27 18:45:21 +02:00
parent 340a115dfe
commit f79d4c7347
36 changed files with 73 additions and 61 deletions

View file

@ -81,7 +81,7 @@ Value ArrayConstructor::call()
return array; return array;
} }
Value ArrayConstructor::construct(Interpreter&, Function&) Value ArrayConstructor::construct(Function&)
{ {
return call(); return call();
} }

View file

@ -39,7 +39,7 @@ public:
virtual ~ArrayConstructor() override; virtual ~ArrayConstructor() override;
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
private: private:
virtual bool has_constructor() const override { return true; } virtual bool has_constructor() const override { return true; }

View file

@ -72,9 +72,9 @@ Value BigIntConstructor::call()
return bigint; return bigint;
} }
Value BigIntConstructor::construct(Interpreter& interpreter, Function&) Value BigIntConstructor::construct(Function&)
{ {
interpreter.vm().throw_exception<TypeError>(global_object(), ErrorType::NotAConstructor, "BigInt"); vm().throw_exception<TypeError>(global_object(), ErrorType::NotAConstructor, "BigInt");
return {}; return {};
} }

View file

@ -39,7 +39,7 @@ public:
virtual ~BigIntConstructor() override; virtual ~BigIntConstructor() override;
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
private: private:
virtual bool has_constructor() const override { return true; } virtual bool has_constructor() const override { return true; }

View file

@ -54,9 +54,9 @@ Value BooleanConstructor::call()
return Value(vm().argument(0).to_boolean()); return Value(vm().argument(0).to_boolean());
} }
Value BooleanConstructor::construct(Interpreter& interpreter, Function&) Value BooleanConstructor::construct(Function&)
{ {
return BooleanObject::create(global_object(), interpreter.argument(0).to_boolean()); return BooleanObject::create(global_object(), vm().argument(0).to_boolean());
} }
} }

View file

@ -39,7 +39,7 @@ public:
virtual ~BooleanConstructor() override; virtual ~BooleanConstructor() override;
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
private: private:
virtual bool has_constructor() const override { return true; } virtual bool has_constructor() const override { return true; }

View file

@ -54,14 +54,14 @@ Value BoundFunction::call()
return m_target_function->call(); return m_target_function->call();
} }
Value BoundFunction::construct(Interpreter& interpreter, Function& new_target) Value BoundFunction::construct(Function& new_target)
{ {
if (auto this_value = vm().this_value(global_object()); m_constructor_prototype && this_value.is_object()) { if (auto this_value = vm().this_value(global_object()); m_constructor_prototype && this_value.is_object()) {
this_value.as_object().set_prototype(m_constructor_prototype); this_value.as_object().set_prototype(m_constructor_prototype);
if (interpreter.exception()) if (vm().exception())
return {}; return {};
} }
return m_target_function->construct(interpreter, new_target); return m_target_function->construct(new_target);
} }
LexicalEnvironment* BoundFunction::create_environment() LexicalEnvironment* BoundFunction::create_environment()

View file

@ -40,7 +40,7 @@ public:
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
virtual LexicalEnvironment* create_environment() override; virtual LexicalEnvironment* create_environment() override;

View file

@ -159,13 +159,13 @@ DateConstructor::~DateConstructor()
Value DateConstructor::call() Value DateConstructor::call()
{ {
auto date = construct(interpreter(), *this); auto date = construct(*this);
if (!date.is_object()) if (!date.is_object())
return {}; return {};
return js_string(heap(), static_cast<Date&>(date.as_object()).string()); return js_string(heap(), static_cast<Date&>(date.as_object()).string());
} }
Value DateConstructor::construct(Interpreter&, Function&) Value DateConstructor::construct(Function&)
{ {
if (vm().argument_count() == 0) { if (vm().argument_count() == 0) {
struct timeval tv; struct timeval tv;

View file

@ -39,7 +39,7 @@ public:
virtual ~DateConstructor() override; virtual ~DateConstructor() override;
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
private: private:
virtual bool has_constructor() const override { return true; } virtual bool has_constructor() const override { return true; }

View file

@ -49,15 +49,16 @@ ErrorConstructor::~ErrorConstructor()
Value ErrorConstructor::call() Value ErrorConstructor::call()
{ {
return construct(interpreter(), *this); return construct(*this);
} }
Value ErrorConstructor::construct(Interpreter& interpreter, Function&) Value ErrorConstructor::construct(Function&)
{ {
auto& vm = this->vm();
String message = ""; String message = "";
if (!interpreter.call_frame().arguments.is_empty() && !interpreter.call_frame().arguments[0].is_undefined()) { if (!vm.call_frame().arguments.is_empty() && !vm.call_frame().arguments[0].is_undefined()) {
message = interpreter.call_frame().arguments[0].to_string(global_object()); message = vm.call_frame().arguments[0].to_string(global_object());
if (interpreter.exception()) if (vm.exception())
return {}; return {};
} }
return Error::create(global_object(), "Error", message); return Error::create(global_object(), "Error", message);
@ -77,9 +78,9 @@ Value ErrorConstructor::construct(Interpreter& interpreter, Function&)
ConstructorName::~ConstructorName() { } \ ConstructorName::~ConstructorName() { } \
Value ConstructorName::call() \ Value ConstructorName::call() \
{ \ { \
return construct(interpreter(), *this); \ return construct(*this); \
} \ } \
Value ConstructorName::construct(Interpreter&, Function&) \ Value ConstructorName::construct(Function&) \
{ \ { \
String message = ""; \ String message = ""; \
if (!vm().call_frame().arguments.is_empty() && !vm().call_frame().arguments[0].is_undefined()) { \ if (!vm().call_frame().arguments.is_empty() && !vm().call_frame().arguments[0].is_undefined()) { \

View file

@ -40,7 +40,7 @@ public:
virtual ~ErrorConstructor() override; virtual ~ErrorConstructor() override;
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
private: private:
virtual bool has_constructor() const override { return true; } virtual bool has_constructor() const override { return true; }
@ -55,7 +55,7 @@ private:
virtual void initialize(GlobalObject&) override; \ virtual void initialize(GlobalObject&) override; \
virtual ~ConstructorName() override; \ virtual ~ConstructorName() override; \
virtual Value call() override; \ virtual Value call() override; \
virtual Value construct(Interpreter&, Function& new_target) override; \ virtual Value construct(Function& new_target) override; \
\ \
private: \ private: \
virtual bool has_constructor() const override { return true; } \ virtual bool has_constructor() const override { return true; } \

View file

@ -44,7 +44,7 @@ public:
virtual void initialize(GlobalObject&) override { } virtual void initialize(GlobalObject&) override { }
virtual Value call() = 0; virtual Value call() = 0;
virtual Value construct(Interpreter&, Function& new_target) = 0; virtual Value construct(Function& new_target) = 0;
virtual const FlyString& name() const = 0; virtual const FlyString& name() const = 0;
virtual LexicalEnvironment* create_environment() = 0; virtual LexicalEnvironment* create_environment() = 0;

View file

@ -53,10 +53,10 @@ FunctionConstructor::~FunctionConstructor()
Value FunctionConstructor::call() Value FunctionConstructor::call()
{ {
return construct(interpreter(), *this); return construct(*this);
} }
Value FunctionConstructor::construct(Interpreter& interpreter, Function&) Value FunctionConstructor::construct(Function&)
{ {
auto& vm = this->vm(); auto& vm = this->vm();
String parameters_source = ""; String parameters_source = "";
@ -88,7 +88,17 @@ Value FunctionConstructor::construct(Interpreter& interpreter, Function&)
vm.throw_exception<SyntaxError>(global_object(), error.to_string()); vm.throw_exception<SyntaxError>(global_object(), error.to_string());
return {}; return {};
} }
return function_expression->execute(interpreter, global_object());
OwnPtr<Interpreter> local_interpreter;
Interpreter* interpreter = vm.interpreter_if_exists();
if (!interpreter) {
local_interpreter = Interpreter::create_with_existing_global_object(global_object());
interpreter = local_interpreter.ptr();
}
VM::InterpreterExecutionScope scope(*interpreter);
return function_expression->execute(*interpreter, global_object());
} }
} }

View file

@ -39,7 +39,7 @@ public:
virtual ~FunctionConstructor() override; virtual ~FunctionConstructor() override;
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
private: private:
virtual bool has_constructor() const override { return true; } virtual bool has_constructor() const override { return true; }

View file

@ -63,7 +63,7 @@ Value NativeFunction::call()
return m_native_function(vm(), global_object()); return m_native_function(vm(), global_object());
} }
Value NativeFunction::construct(Interpreter&, Function&) Value NativeFunction::construct(Function&)
{ {
return {}; return {};
} }

View file

@ -42,7 +42,7 @@ public:
virtual ~NativeFunction() override; virtual ~NativeFunction() override;
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
virtual const FlyString& name() const override { return m_name; }; virtual const FlyString& name() const override { return m_name; };
virtual bool has_constructor() const { return false; } virtual bool has_constructor() const { return false; }

View file

@ -72,7 +72,7 @@ Value NumberConstructor::call()
return vm().argument(0).to_number(global_object()); return vm().argument(0).to_number(global_object());
} }
Value NumberConstructor::construct(Interpreter&, Function&) Value NumberConstructor::construct(Function&)
{ {
double number = 0; double number = 0;
if (vm().argument_count()) { if (vm().argument_count()) {

View file

@ -39,7 +39,7 @@ public:
virtual ~NumberConstructor() override; virtual ~NumberConstructor() override;
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
private: private:
virtual bool has_constructor() const override { return true; } virtual bool has_constructor() const override { return true; }

View file

@ -69,7 +69,7 @@ Value ObjectConstructor::call()
return Object::create_empty(global_object()); return Object::create_empty(global_object());
} }
Value ObjectConstructor::construct(Interpreter&, Function&) Value ObjectConstructor::construct(Function&)
{ {
return call(); return call();
} }

View file

@ -39,7 +39,7 @@ public:
virtual ~ObjectConstructor() override; virtual ~ObjectConstructor() override;
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
private: private:
virtual bool has_constructor() const override { return true; } virtual bool has_constructor() const override { return true; }

View file

@ -55,22 +55,23 @@ Value ProxyConstructor::call()
return {}; return {};
} }
Value ProxyConstructor::construct(Interpreter& interpreter, Function&) Value ProxyConstructor::construct(Function&)
{ {
if (interpreter.argument_count() < 2) { auto& vm = this->vm();
interpreter.vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyTwoArguments); if (vm.argument_count() < 2) {
vm.throw_exception<TypeError>(global_object(), ErrorType::ProxyTwoArguments);
return {}; return {};
} }
auto target = interpreter.argument(0); auto target = vm.argument(0);
auto handler = interpreter.argument(1); auto handler = vm.argument(1);
if (!target.is_object()) { if (!target.is_object()) {
interpreter.vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyConstructorBadType, "target", target.to_string_without_side_effects().characters()); vm.throw_exception<TypeError>(global_object(), ErrorType::ProxyConstructorBadType, "target", target.to_string_without_side_effects().characters());
return {}; return {};
} }
if (!handler.is_object()) { if (!handler.is_object()) {
interpreter.vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyConstructorBadType, "handler", handler.to_string_without_side_effects().characters()); vm.throw_exception<TypeError>(global_object(), ErrorType::ProxyConstructorBadType, "handler", handler.to_string_without_side_effects().characters());
return {}; return {};
} }
return ProxyObject::create(global_object(), target.as_object(), handler.as_object()); return ProxyObject::create(global_object(), target.as_object(), handler.as_object());

View file

@ -39,7 +39,7 @@ public:
virtual ~ProxyConstructor() override; virtual ~ProxyConstructor() override;
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
private: private:
virtual bool has_constructor() const override { return true; } virtual bool has_constructor() const override { return true; }

View file

@ -492,7 +492,7 @@ Value ProxyObject::call()
return vm().call(trap.as_function(), Value(&m_handler), move(arguments)); return vm().call(trap.as_function(), Value(&m_handler), move(arguments));
} }
Value ProxyObject::construct(Interpreter& interpreter, Function& new_target) Value ProxyObject::construct(Function& new_target)
{ {
auto& vm = this->vm(); auto& vm = this->vm();
if (!is_function()) { if (!is_function()) {
@ -507,7 +507,7 @@ Value ProxyObject::construct(Interpreter& interpreter, Function& new_target)
if (vm.exception()) if (vm.exception())
return {}; return {};
if (trap.is_empty() || trap.is_undefined() || trap.is_null()) if (trap.is_empty() || trap.is_undefined() || trap.is_null())
return static_cast<Function&>(m_target).construct(interpreter, new_target); return static_cast<Function&>(m_target).construct(new_target);
if (!trap.is_function()) { if (!trap.is_function()) {
vm.throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "construct"); vm.throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "construct");
return {}; return {};

View file

@ -40,7 +40,7 @@ public:
virtual ~ProxyObject() override; virtual ~ProxyObject() override;
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
virtual const FlyString& name() const override; virtual const FlyString& name() const override;
virtual LexicalEnvironment* create_environment() override; virtual LexicalEnvironment* create_environment() override;

View file

@ -50,10 +50,10 @@ RegExpConstructor::~RegExpConstructor()
Value RegExpConstructor::call() Value RegExpConstructor::call()
{ {
return construct(interpreter(), *this); return construct(*this);
} }
Value RegExpConstructor::construct(Interpreter&, Function&) Value RegExpConstructor::construct(Function&)
{ {
auto& vm = this->vm(); auto& vm = this->vm();
if (!vm.argument_count()) if (!vm.argument_count())

View file

@ -39,7 +39,7 @@ public:
virtual ~RegExpConstructor() override; virtual ~RegExpConstructor() override;
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
private: private:
virtual bool has_constructor() const override { return true; } virtual bool has_constructor() const override { return true; }

View file

@ -143,7 +143,7 @@ Value ScriptFunction::call()
return interpreter->execute_statement(global_object(), m_body, arguments, ScopeType::Function); return interpreter->execute_statement(global_object(), m_body, arguments, ScopeType::Function);
} }
Value ScriptFunction::construct(Interpreter&, Function&) Value ScriptFunction::construct(Function&)
{ {
if (m_is_arrow_function) { if (m_is_arrow_function) {
vm().throw_exception<TypeError>(global_object(), ErrorType::NotAConstructor, m_name.characters()); vm().throw_exception<TypeError>(global_object(), ErrorType::NotAConstructor, m_name.characters());

View file

@ -45,7 +45,7 @@ public:
const Vector<FunctionNode::Parameter>& parameters() const { return m_parameters; }; const Vector<FunctionNode::Parameter>& parameters() const { return m_parameters; };
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
virtual const FlyString& name() const override { return m_name; }; virtual const FlyString& name() const override { return m_name; };
void set_name(const FlyString& name) { m_name = name; }; void set_name(const FlyString& name) { m_name = name; };

View file

@ -67,7 +67,7 @@ Value StringConstructor::call()
return string; return string;
} }
Value StringConstructor::construct(Interpreter&, Function&) Value StringConstructor::construct(Function&)
{ {
PrimitiveString* primitive_string = nullptr; PrimitiveString* primitive_string = nullptr;
if (!vm().argument_count()) if (!vm().argument_count())

View file

@ -39,7 +39,7 @@ public:
virtual ~StringConstructor() override; virtual ~StringConstructor() override;
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
private: private:
virtual bool has_constructor() const override { return true; } virtual bool has_constructor() const override { return true; }

View file

@ -63,9 +63,9 @@ Value SymbolConstructor::call()
return js_symbol(heap(), vm().argument(0).to_string(global_object()), false); return js_symbol(heap(), vm().argument(0).to_string(global_object()), false);
} }
Value SymbolConstructor::construct(Interpreter& interpreter, Function&) Value SymbolConstructor::construct(Function&)
{ {
interpreter.vm().throw_exception<TypeError>(global_object(), ErrorType::NotAConstructor, "Symbol"); vm().throw_exception<TypeError>(global_object(), ErrorType::NotAConstructor, "Symbol");
return {}; return {};
} }

View file

@ -39,7 +39,7 @@ public:
virtual ~SymbolConstructor() override; virtual ~SymbolConstructor() override;
virtual Value call() override; virtual Value call() override;
virtual Value construct(Interpreter&, Function& new_target) override; virtual Value construct(Function& new_target) override;
private: private:
virtual bool has_constructor() const override { return true; } virtual bool has_constructor() const override { return true; }

View file

@ -220,7 +220,7 @@ Value VM::construct(Function& function, Function& new_target, Optional<MarkedVal
// If we are a Derived constructor, |this| has not been constructed before super is called. // If we are a Derived constructor, |this| has not been constructed before super is called.
Value this_value = function.constructor_kind() == Function::ConstructorKind::Base ? new_object : Value {}; Value this_value = function.constructor_kind() == Function::ConstructorKind::Base ? new_object : Value {};
call_frame.this_value = this_value; call_frame.this_value = this_value;
auto result = function.construct(interpreter(), new_target); auto result = function.construct(new_target);
this_value = current_environment()->get_this_binding(); this_value = current_environment()->get_this_binding();
pop_call_frame(); pop_call_frame();

View file

@ -58,13 +58,13 @@ XMLHttpRequestConstructor::~XMLHttpRequestConstructor()
JS::Value XMLHttpRequestConstructor::call() JS::Value XMLHttpRequestConstructor::call()
{ {
return construct(interpreter(), *this); return construct(*this);
} }
JS::Value XMLHttpRequestConstructor::construct(JS::Interpreter& interpreter, Function&) JS::Value XMLHttpRequestConstructor::construct(Function&)
{ {
auto& window = static_cast<WindowObject&>(global_object()); auto& window = static_cast<WindowObject&>(global_object());
return interpreter.heap().allocate<XMLHttpRequestWrapper>(window, window, XMLHttpRequest::create(window.impl())); return heap().allocate<XMLHttpRequestWrapper>(window, window, XMLHttpRequest::create(window.impl()));
} }
} }

View file

@ -37,7 +37,7 @@ public:
virtual ~XMLHttpRequestConstructor() override; virtual ~XMLHttpRequestConstructor() override;
virtual JS::Value call() override; virtual JS::Value call() override;
virtual JS::Value construct(JS::Interpreter& interpreter, Function& new_target) override; virtual JS::Value construct(JS::Function& new_target) override;
private: private:
virtual bool has_constructor() const override { return true; } virtual bool has_constructor() const override { return true; }