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); }
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(); }
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); }