Ejemplo n.º 1
0
        /// <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();
        }