ladybird/Userland/Libraries/LibJS/Bytecode/BasicBlock.cpp
Hendiadyoin1 73f347b75c LibJS: Create static unwind mappings for BasicBlocks
This is currently only used in the bytecode dump to annotate to where
unwinds lead per block, but will be hooked up to the virtual machine in
the next commit.
2023-10-30 13:10:08 +01:00

60 lines
1.4 KiB
C++

/*
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/DeprecatedString.h>
#include <LibJS/Bytecode/BasicBlock.h>
#include <LibJS/Bytecode/Op.h>
namespace JS::Bytecode {
NonnullOwnPtr<BasicBlock> BasicBlock::create(DeprecatedString name)
{
return adopt_own(*new BasicBlock(move(name)));
}
BasicBlock::BasicBlock(DeprecatedString name)
: m_name(move(name))
{
}
BasicBlock::~BasicBlock()
{
Bytecode::InstructionStreamIterator it(instruction_stream());
while (!it.at_end()) {
auto& to_destroy = (*it);
++it;
Instruction::destroy(const_cast<Instruction&>(to_destroy));
}
}
void BasicBlock::dump(Bytecode::Executable const& executable) const
{
Bytecode::InstructionStreamIterator it(instruction_stream());
if (!m_name.is_empty())
warn("{}", m_name);
if (m_handler || m_finalizer) {
warn(" [");
if (m_handler)
warn(" Handler: {}", Label { *m_handler });
if (m_finalizer)
warn(" Finalizer: {}", Label { *m_finalizer });
warn(" ]");
}
warnln(":");
while (!it.at_end()) {
warnln("[{:4x}] {}", it.offset(), (*it).to_deprecated_string(executable));
++it;
}
}
void BasicBlock::grow(size_t additional_size)
{
m_buffer.grow_capacity(m_buffer.size() + additional_size);
m_buffer.resize(m_buffer.size() + additional_size);
}
}