diff --git a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp index 4c875fe5fc..a8d0948969 100644 --- a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp @@ -1580,8 +1580,27 @@ ThrowCompletionOr PutByValue::execute_impl(Bytecode::Interpreter& interpre auto value = interpreter.accumulator(); auto base = interpreter.reg(m_base); + auto property_key_value = interpreter.reg(m_property); - auto property_key = m_kind != PropertyKind::Spread ? TRY(interpreter.reg(m_property).to_property_key(vm)) : PropertyKey {}; + // OPTIMIZATION: Fast path for simple Int32 indexes in array-like objects. + if (base.is_object() && property_key_value.is_int32() && property_key_value.as_i32() >= 0) { + auto& object = base.as_object(); + auto* storage = object.indexed_properties().storage(); + auto index = static_cast(property_key_value.as_i32()); + if (storage + && storage->is_simple_storage() + && !object.may_interfere_with_indexed_property_access() + && storage->has_index(index)) { + auto existing_value = storage->get(index)->value; + if (!existing_value.is_accessor()) { + storage->put(index, value); + interpreter.accumulator() = value; + return {}; + } + } + } + + auto property_key = m_kind != PropertyKind::Spread ? TRY(property_key_value.to_property_key(vm)) : PropertyKey {}; TRY(put_by_property_key(vm, base, base, value, property_key, m_kind)); interpreter.accumulator() = value; return {};