/// <summary> /// Generate the code to emit a procedure. /// </summary> /// <param name="cg">A CodeGenerator object</param> public override void Generate(CodeGenerator cg) { if (cg == null) { throw new ArgumentNullException("cg"); } // Create the emitter for this method cg.Emitter = new Emitter((MethodBuilder)ProcedureSymbol.Info); cg.CurrentProcedure = this; // Generate all locals for this method cg.GenerateSymbols(LocalSymbols); // Generate all the initialisation code foreach (ParseNode initNode in InitList.Nodes) { initNode.Generate(cg); } bool needTryBlock = ProcedureSymbol.Modifier.HasFlag(SymModifier.ENTRYPOINT); // Generate the body of the procedure if (needTryBlock) { cg.Emitter.SetupTryBlock(); } foreach (ParseNode statement in Nodes) { statement.Generate(cg); } if (needTryBlock) { cg.Emitter.CloseTryBlock(); } cg.Emitter.Save(); }