1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-30 15:18:11 +00:00

LibJS: Convert resolve_this_binding() to ThrowCompletionOr

Also add spec comments.
This commit is contained in:
davidot 2021-12-30 23:00:37 +01:00 committed by Linus Groh
parent dc03529ffd
commit a24df37713
4 changed files with 13 additions and 5 deletions

View file

@ -2252,7 +2252,7 @@ Value SpreadExpression::execute(Interpreter& interpreter, GlobalObject& global_o
Value ThisExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const Value ThisExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
{ {
InterpreterNodeScope node_scope { interpreter, *this }; InterpreterNodeScope node_scope { interpreter, *this };
return interpreter.vm().resolve_this_binding(global_object); return TRY_OR_DISCARD(interpreter.vm().resolve_this_binding(global_object));
} }
void ThisExpression::dump(int indent) const void ThisExpression::dump(int indent) const

View file

@ -315,7 +315,13 @@ void Jump::execute_impl(Bytecode::Interpreter& interpreter) const
void ResolveThisBinding::execute_impl(Bytecode::Interpreter& interpreter) const void ResolveThisBinding::execute_impl(Bytecode::Interpreter& interpreter) const
{ {
interpreter.accumulator() = interpreter.vm().resolve_this_binding(interpreter.global_object()); auto this_binding_or_error = interpreter.vm().resolve_this_binding(interpreter.global_object());
if (this_binding_or_error.is_throw_completion()) {
interpreter.vm().throw_exception(interpreter.global_object(), this_binding_or_error.release_error().value());
return;
}
interpreter.accumulator() = this_binding_or_error.release_value();
} }
void Jump::replace_references_impl(BasicBlock const& from, BasicBlock const& to) void Jump::replace_references_impl(BasicBlock const& from, BasicBlock const& to)

View file

@ -503,10 +503,12 @@ void VM::throw_exception(Exception& exception)
} }
// 9.4.4 ResolveThisBinding ( ), https://tc39.es/ecma262/#sec-resolvethisbinding // 9.4.4 ResolveThisBinding ( ), https://tc39.es/ecma262/#sec-resolvethisbinding
Value VM::resolve_this_binding(GlobalObject& global_object) ThrowCompletionOr<Value> VM::resolve_this_binding(GlobalObject& global_object)
{ {
// 1. Let envRec be GetThisEnvironment().
auto& environment = get_this_environment(*this); auto& environment = get_this_environment(*this);
return TRY_OR_DISCARD(environment.get_this_binding(global_object)); // 2. Return ? envRec.GetThisBinding().
return TRY(environment.get_this_binding(global_object));
} }
String VM::join_arguments(size_t start_index) const String VM::join_arguments(size_t start_index) const

View file

@ -155,7 +155,7 @@ public:
return running_execution_context().this_value; return running_execution_context().this_value;
} }
Value resolve_this_binding(GlobalObject&); ThrowCompletionOr<Value> resolve_this_binding(GlobalObject&);
Value last_value() const { return m_last_value; } Value last_value() const { return m_last_value; }
void set_last_value(Badge<Bytecode::Interpreter>, Value value) { m_last_value = value; } void set_last_value(Badge<Bytecode::Interpreter>, Value value) { m_last_value = value; }