/* * Copyright (c) 2021, 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: enum class SurroundingScopeKind { Global, Function, Block, }; static CodeGenerationErrorOr> generate(VM&, ASTNode const&, FunctionKind = FunctionKind::Normal); Register allocate_register(); 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