mirror of
https://github.com/RGBCube/serenity
synced 2025-05-24 00:55:06 +00:00
LibJS: Remove dedicated iterator result instructions in favor of GetById
When iterating over an iterable, we get back a JS object with the fields "value" and "done". Before this change, we've had two dedicated instructions for retrieving the two fields: IteratorResultValue and IteratorResultDone. These had no fast path whatsoever and just did a generic [[Get]] access to fetch the corresponding property values. By replacing the instructions with GetById("value") and GetById("done"), they instantly get caching and JIT fast paths for free, making iterating over iterables much faster. :^) 26% speed-up on this microbenchmark: function go(a) { for (const p of a) { } } const a = []; a.length = 1_000_000; go(a);
This commit is contained in:
parent
8d68f94282
commit
350e6c54d7
8 changed files with 26 additions and 96 deletions
|
@ -1287,25 +1287,6 @@ ThrowCompletionOr<void> IteratorNext::execute_impl(Bytecode::Interpreter& interp
|
|||
return {};
|
||||
}
|
||||
|
||||
ThrowCompletionOr<void> IteratorResultDone::execute_impl(Bytecode::Interpreter& interpreter) const
|
||||
{
|
||||
auto& vm = interpreter.vm();
|
||||
auto iterator_result = TRY(interpreter.accumulator().to_object(vm));
|
||||
|
||||
auto complete = TRY(iterator_complete(vm, iterator_result));
|
||||
interpreter.accumulator() = Value(complete);
|
||||
return {};
|
||||
}
|
||||
|
||||
ThrowCompletionOr<void> IteratorResultValue::execute_impl(Bytecode::Interpreter& interpreter) const
|
||||
{
|
||||
auto& vm = interpreter.vm();
|
||||
auto iterator_result = TRY(interpreter.accumulator().to_object(vm));
|
||||
|
||||
interpreter.accumulator() = TRY(iterator_value(vm, iterator_result));
|
||||
return {};
|
||||
}
|
||||
|
||||
ThrowCompletionOr<void> NewClass::execute_impl(Bytecode::Interpreter& interpreter) const
|
||||
{
|
||||
interpreter.accumulator() = TRY(new_class(interpreter.vm(), interpreter.accumulator(), m_class_expression, m_lhs_name));
|
||||
|
@ -1768,16 +1749,6 @@ DeprecatedString IteratorNext::to_deprecated_string_impl(Executable const&) cons
|
|||
return "IteratorNext";
|
||||
}
|
||||
|
||||
DeprecatedString IteratorResultDone::to_deprecated_string_impl(Executable const&) const
|
||||
{
|
||||
return "IteratorResultDone";
|
||||
}
|
||||
|
||||
DeprecatedString IteratorResultValue::to_deprecated_string_impl(Executable const&) const
|
||||
{
|
||||
return "IteratorResultValue";
|
||||
}
|
||||
|
||||
DeprecatedString ResolveThisBinding::to_deprecated_string_impl(Bytecode::Executable const&) const
|
||||
{
|
||||
return "ResolveThisBinding"sv;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue