LibJS: Use a local variable for arguments object when possible

This allows us to skip allocating a function environment in cases where
it was previously impossible because the arguments object needed a
binding.

This change does not bring visible improvement in Kraken or Octane
benchmarks but seems useful to have anyway.
This commit is contained in:
Aliaksandr Kalenik 2024-05-21 09:32:51 +01:00 committed by Andreas Kling
parent 777e84b09b
commit 210a5d77dc
Notes: sideshowbarker 2024-07-17 02:55:44 +09:00
5 changed files with 39 additions and 11 deletions

View file

@ -1373,6 +1373,11 @@ ThrowCompletionOr<void> CreateArguments::execute_impl(Bytecode::Interpreter& int
arguments_object = create_unmapped_arguments_object(interpreter.vm(), passed_arguments);
}
if (m_dst.has_value()) {
interpreter.set(*m_dst, arguments_object);
return {};
}
if (m_is_immutable) {
MUST(environment->create_immutable_binding(interpreter.vm(), interpreter.vm().names.arguments.as_string(), false));
} else {
@ -2110,9 +2115,14 @@ ByteString CreateRestParams::to_byte_string_impl(Bytecode::Executable const& exe
return ByteString::formatted("CreateRestParams {}, rest_index:{}", format_operand("dst"sv, m_dst, executable), m_rest_index);
}
ByteString CreateArguments::to_byte_string_impl(Bytecode::Executable const&) const
ByteString CreateArguments::to_byte_string_impl(Bytecode::Executable const& executable) const
{
return ByteString::formatted("CreateArguments {} immutable:{}", m_kind == Kind::Mapped ? "mapped"sv : "unmapped"sv, m_is_immutable);
StringBuilder builder;
builder.appendff("CreateArguments");
if (m_dst.has_value())
builder.appendff(" {}", format_operand("dst"sv, *m_dst, executable));
builder.appendff(" {} immutable:{}", m_kind == Kind::Mapped ? "mapped"sv : "unmapped"sv, m_is_immutable);
return builder.to_byte_string();
}
ByteString EnterObjectEnvironment::to_byte_string_impl(Executable const& executable) const