mirror of
https://github.com/RGBCube/serenity
synced 2025-05-15 09:14:58 +00:00

This change removes the mmap inside of Block in favor of a growing vector of bytes. This is favorable for two reasons: - We don't take more space than we need - There is no limit to the growth of the vector (previously, if the Block overstepped its 64kb boundary, it would just crash) However, if that vector happens to resize, any pointer pointing into that vector would become invalid. To avoid this, this commit adds an InstructionHandle<Op> class which just stores a block and an offset into that block.
62 lines
1.4 KiB
C++
62 lines
1.4 KiB
C++
/*
|
|
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Badge.h>
|
|
#include <AK/NonnullOwnPtrVector.h>
|
|
#include <LibJS/Bytecode/Register.h>
|
|
#include <LibJS/Forward.h>
|
|
|
|
namespace JS::Bytecode {
|
|
|
|
class InstructionStreamIterator {
|
|
public:
|
|
explicit InstructionStreamIterator(ReadonlyBytes bytes)
|
|
: m_bytes(bytes)
|
|
{
|
|
}
|
|
|
|
size_t offset() const { return m_offset; }
|
|
bool at_end() const { return m_offset >= m_bytes.size(); }
|
|
void jump(size_t offset)
|
|
{
|
|
VERIFY(offset <= m_bytes.size());
|
|
m_offset = offset;
|
|
}
|
|
|
|
Instruction const& operator*() const { return dereference(); }
|
|
void operator++();
|
|
|
|
private:
|
|
Instruction const& dereference() const { return *reinterpret_cast<Instruction const*>(m_bytes.data() + offset()); }
|
|
|
|
ReadonlyBytes m_bytes;
|
|
size_t m_offset { 0 };
|
|
};
|
|
|
|
class Block {
|
|
public:
|
|
static NonnullOwnPtr<Block> create();
|
|
~Block();
|
|
|
|
void dump() const;
|
|
ReadonlyBytes instruction_stream() const { return m_buffer.span(); }
|
|
|
|
size_t register_count() const { return m_register_count; }
|
|
|
|
void set_register_count(Badge<Bytecode::Generator>, size_t count) { m_register_count = count; }
|
|
|
|
Vector<u8>& buffer() { return m_buffer; }
|
|
|
|
private:
|
|
Block() = default;
|
|
|
|
size_t m_register_count { 0 };
|
|
Vector<u8> m_buffer;
|
|
};
|
|
|
|
}
|