public ClepsMemberGeneratorParser(ClassManager classManager, CompileStatus status, LLVMContextRef context, LLVMModuleRef module, LLVMBuilderRef builder, ClepsLLVMTypeConvertor clepsLLVMTypeConvertor) { ClassManager = classManager; Status = status; Context = context; Module = module; Builder = builder; ClepsLLVMTypeConvertorInst = clepsLLVMTypeConvertor; }
public CompileStatus CompileFiles() { ClassManager classManager = new ClassManager(); CompileStatus status = new CompileStatus(false /* exit on first error */); LLVMContextRef context = LLVM.ContextCreate(); LLVMModuleRef module = LLVM.ModuleCreateWithNameInContext(OutputFileName, context); LLVMBuilderRef builder = LLVM.CreateBuilderInContext(context); try { //Byte code is generated in multiple passes so that all member variables and functions are stubbed out before they are referred to in function bodies //This allows functions on the top of a file to call functions on the bottom of a file as well Dictionary <string, LLVMTypeRef> classSkeletons; { ClepsClassNamesGeneratorParser classSkeletonGenerator = new ClepsClassNamesGeneratorParser(classManager, status, context, module, builder, out classSkeletons); ParseFilesWithGenerator(classSkeletonGenerator, status); } ClepsLLVMTypeConvertor clepsLLVMTypeConvertor = new ClepsLLVMTypeConvertor(classSkeletons, context); { ClepsMemberGeneratorParser memberGenerator = new ClepsMemberGeneratorParser(classManager, status, context, module, builder, clepsLLVMTypeConvertor); ParseFilesWithGenerator(memberGenerator, status); } { ClepsFunctionBodyGeneratorParser functionBodyGenerator = new ClepsFunctionBodyGeneratorParser(classManager, status, context, module, builder, clepsLLVMTypeConvertor); ParseFilesWithGenerator(functionBodyGenerator, status); } AddEntryPoint(classManager, status, context, module, builder); VerifyModule(module, status); PrintModuleToFile(module, status); } catch (CompilerErrorException) { //Supress compiler errors } finally { LLVM.DisposeBuilder(builder); LLVM.DisposeModule(module); LLVM.ContextDispose(context); } return(status); }