/* * Copyright (c) 2021-2024, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace JS::Bytecode { class Generator { public: VM& vm() { return m_vm; } enum class SurroundingScopeKind { Global, Function, Block, }; static CodeGenerationErrorOr> generate(VM&, ASTNode const&, ReadonlySpan parameters, FunctionKind = FunctionKind::Normal); Register allocate_register(); void set_local_initialized(u32 local_index); [[nodiscard]] bool is_local_initialized(u32 local_index) const; class SourceLocationScope { public: SourceLocationScope(Generator&, ASTNode const& node); ~SourceLocationScope(); private: Generator& m_generator; ASTNode const* m_previous_node { nullptr }; }; class UnwindContext { public: UnwindContext(Generator&, Optional