#include "CodeGenerator.h" #include #include "StoredToken.h" #include "compiler/ast/TopLevelStatements.h" #include "compiler/codegen/InstructionEmitter.h" #include "compiler/codegen/InstructionGenerator.h" #include "compiler/file/SourceFileIdentifier.h" #include "compiler/model/CompilerWorkspace.h" #include "compiler/representation/CompiledScript.h" #include "compiler/representation/ExportedFunction.h" #include "compiler/representation/ModuleDescriptor.h" #include "compiler/representation/ModuleFunctionDescriptor.h" namespace Pol::Bscript::Compiler { std::unique_ptr CodeGenerator::generate( std::unique_ptr workspace, const LegacyFunctionOrder* ) { auto program_info = std::unique_ptr(); CodeSection code; DataSection data; ExportedFunctions exported_functions; std::vector module_descriptors; InstructionEmitter instruction_emitter( code, data ); CodeGenerator generator( instruction_emitter ); generator.generate_instructions( *workspace ); return std::make_unique( std::move( code ), std::move( data ), std::move( exported_functions ), std::move( workspace->global_variable_names ), std::move( module_descriptors ), std::move( program_info ), std::move( workspace->referenced_source_file_identifiers ) ); } CodeGenerator::CodeGenerator( InstructionEmitter& emitter ) : emitter( emitter ), emit( emitter ) { } void CodeGenerator::generate_instructions( CompilerWorkspace& workspace ) { InstructionGenerator top_level_instruction_generator( emitter ); workspace.top_level_statements->accept( top_level_instruction_generator ); emit.progend(); } } // namespace Pol::Bscript::Compiler