1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-28 17:25:06 +00:00

LibJS: Devirtualize and pack the bytecode stream :^)

This patch changes the LibJS bytecode to be a stream of instructions
packed one-after-the-other in contiguous memory, instead of a vector
of OwnPtr<Instruction>. This should be a lot more cache-friendly. :^)

Instructions are also devirtualized and instead have a type field
using a new Instruction::Type enum.

To iterate over a bytecode stream, one must now use
Bytecode::InstructionStreamIterator.
This commit is contained in:
Andreas Kling 2021-06-07 15:12:43 +02:00
parent 845f2826aa
commit e7d69c5d3c
11 changed files with 284 additions and 110 deletions

View file

@ -52,12 +52,12 @@ Value Interpreter::run(Bytecode::Block const& block)
m_register_windows.append(make<RegisterWindow>());
registers().resize(block.register_count());
size_t pc = 0;
while (pc < block.instructions().size()) {
auto& instruction = block.instructions()[pc];
Bytecode::InstructionStreamIterator pc(block.instruction_stream());
while (!pc.at_end()) {
auto& instruction = *pc;
instruction.execute(*this);
if (m_pending_jump.has_value()) {
pc = m_pending_jump.release_value();
pc.jump(m_pending_jump.release_value());
continue;
}
if (!m_return_value.is_empty())