/* * Copyright (c) 2021, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include namespace JS::Bytecode { Generator::Generator() : m_string_table(make()) { } Generator::~Generator() { } Executable Generator::generate(ASTNode const& node) { Generator generator; generator.switch_to_basic_block(generator.make_block()); node.generate_bytecode(generator); return { move(generator.m_root_basic_blocks), move(generator.m_string_table), generator.m_next_register }; } void Generator::grow(size_t additional_size) { VERIFY(m_current_basic_block); m_current_basic_block->grow(additional_size); } void* Generator::next_slot() { VERIFY(m_current_basic_block); return m_current_basic_block->next_slot(); } Register Generator::allocate_register() { VERIFY(m_next_register != NumericLimits::max()); return Register { m_next_register++ }; } Label Generator::nearest_continuable_scope() const { return m_continuable_scopes.last(); } void Generator::begin_continuable_scope(Label continue_target) { m_continuable_scopes.append(continue_target); } void Generator::end_continuable_scope() { m_continuable_scopes.take_last(); } }