Пример #1
0
        public override void GenerateCode(Emit.MethodBodyGenerator generator)
        {
            // Generate code for the start of the statement.
            var statementLocals = new StatementLocals()
            {
                NonDefaultBreakStatementBehavior = true, NonDefaultSourceSpanBehavior = true
            };

            GenerateStartOfStatement(generator, statementLocals);
            // Set up some labels.
            var continueTarget = generator.CreateLabel();
            var breakTarget    = generator.CreateLabel();

            // Emit the initialization statement.
            if (Initialization != null)
            {
                Initialization.GenerateCode(generator);
            }

            // The inner loop starts here.
            var startOfLoop      = generator.CreateLabel();
            var startOfCondition = generator.CreateLabel();

            if (CheckConditionAtEnd == false)
            {
                generator.Branch(startOfCondition);
            }
            //start of loop

            generator.DefineLabelPosition(startOfLoop);
            // Emit the loop body.
            generator.PushBreakOrContinueInfo(Labels, breakTarget, continueTarget, false);
            Body.GenerateCode(generator);
            generator.PopBreakOrContinueInfo();

            // The continue statement jumps here.
            generator.DefineLabelPosition(continueTarget);

            // Increment the loop variable.
            if (Increments != null)
            {
                Increments.ForEach(e => e.Accept(generator).GenerateCode(generator));
            }

            generator.DefineLabelPosition(startOfCondition);
            // Check the condition and jump to the end if it is false.
            if (Condition != null)
            {
                // generator.MarkSequencePoint(ConditionStatement.Span);
                Condition.Accept(generator).GenerateCode(generator);
                generator.CallStatic(Utils.ReflectionHelpers.BoooleanToBool);
                generator.BranchIfTrue(startOfLoop);
            }

            // Define the end of the loop (actually just after).
            generator.DefineLabelPosition(breakTarget);

            // Generate code for the end of the statement.
            GenerateEndOfStatement(generator, statementLocals);
        }
Пример #2
0
        public override void Accept(IVisitor v)
        {
            topLabel.Text  = v.GetNextLabel();
            exitLabel.Text = v.GetNextLabel();

            topLabel.Accept(v);

            Condition.Accept(v); //write code to compute result of expr
            v.Visit(this);       //write the test

            Body.Append(new Jump(topLabel.Text));
            Body.Accept(v);

            v.EndBody();
            Body.endBody.Accept(v);

            //           body.endBody.Text = v.GetNextLabel();
        }
Пример #3
0
        public override void Accept(IVisitor v)
        {
            exitLabel.Text    = v.GetNextLabel();
            Body.endBody.Text = v.GetNextLabel();

            Condition.Accept(v); //write code to compute result of expr
            v.Visit(this);       //write the test
            v.Visit(skipJump, Body.endBody.Text);

            Body.Accept(v);

            //jump out of body
            if (elseifs.Count > 0 || Else != null)
            {
                exitJump.Accept(v, exitLabel.Text);
            }

            v.EndBody();
            Body.endBody.Accept(v);
            //write out all the else-if and supply
            //them with the jump out label
            //foreach (IfStatement i in elseifs)
            for (int i = 0; i < this.elseifs.Count; i++)
            {
                //RPI NEEDS 'else'
                //Horrible Hack :(
                //    if (v is VisitorRPi)
                //    {
                //       (v as VisitorRPi).WriteElse ();
                //   }

                elseifs[i].Body.endBody.Text = v.GetNextLabel();

                elseifs[i].Condition.Accept(v); //push condition

                v.Visit(elseifs[i]);            //write compare

                v.Visit(skipJump, elseifs[i].Body.endBody.Text);

                elseifs[i].Body.Accept(v);

                //jump out of else-if
                exitJump.Accept(v, exitLabel.Text);

                elseifs[i].Body.endBody.Accept(v);
                v.EndBody();

                //RPi needs }

                //godawful hack
                //if (v is VisitorRPi)
                //{
                //    v.EndBody();
                // }

                /*
                 * //horrible hack. else needs to be attached to last else if
                 * if (Else != null && (v as VisitorRPi) != null &&
                 *  i == this.elseifs.Count -1)
                 * {
                 *  v.BeginElse();
                 *  Else.Accept(v);
                 *  v.EndBody();
                 * }
                 */
            } //end loop through else-ifs


            //horrible hack
            //case 1 - not C visitor - write else
            //case 2 - C visitor write else if not already written
            if (Else != null)
            {
                v.BeginElse();
                Else.Accept(v);
                v.EndBody();
            }

            //@exit
            exitLabel.Accept(v);
        }