internal override void EmitStmt(ILGenerator ilg) { if (IterDecl != null) { IterDecl.Emit(ilg); } else { IterInit.Emit(ilg, false); } Begin = ilg.DefineLabel(); End = ilg.DefineLabel(); ilg.MarkLabel(Begin); WhileExpr.Emit(ilg, true); ilg.Emit(OpCodes.Brfalse, End); InnerDecl?.Emit(ilg); Stmt.Emit(ilg); if (Cont != null) { ilg.MarkLabel(Cont.Value); } IncrExpr?.Emit(ilg, false); ilg.Emit(OpCodes.Br, Begin); ilg.MarkLabel(End); if (Dispose) { FinallyClauses.Add(() => { var loc = IterDecl.Symbol as LocalSymbol; ilg.Emit(OpCodes.Ldloc, loc.Index); ilg.Emit(OpCodes.Isinst, Compilation.Get(WellKnownTypes.System_IDisposable).Type); ilg.Emit(OpCodes.Callvirt, (Compilation.Get(WellKnownMembers.System_IDisposable_Dispose) as MethodSymbol).Method); }); } }
/// <summary> /// Parses either the for or for x in statements. /// </summary> /// <returns></returns> public override Expr Parse() { var stmt = new WhileExpr(); // While ( condition expression ) _tokenIt.Expect(Tokens.While); ParseConditionalBlock(stmt); return stmt; }
/// <summary> /// Visits the while statement tree. /// </summary> /// <param name="whileExpr"></param> public void While(WhileExpr whileExpr) { _callBack(whileExpr); Visit(whileExpr.Condition); foreach (var stmt in whileExpr.Statements) { Visit(stmt); } }
public override Expression Clone(Scope scope) { var whileExpr = new WhileExpr(scope); whileExpr.Condition = Condition.Clone(scope); whileExpr.WhileScope = WhileScope.Clone(scope) as Scope; return(whileExpr); }
/// <summary> /// Visits the while statement tree. /// </summary> /// <param name="whileExpr"></param> public object VisitWhile(WhileExpr expr) { _callBackOnNodeStart(expr); expr.Condition.Visit(this); foreach (var stmt in expr.Statements) { stmt.Visit(this); } return(null); }
public Expr OnParseWhile() { var tokenIt = this._parser.TokenIt; var initiatorToken = tokenIt.NextToken; var expr = new WhileExpr(); // <codeWhile> tokenIt.Expect(Tokens.While); ParseConditionalBlock(expr); // </codeWhile> this._parser.SetupContext(expr, initiatorToken); return(expr); }
/// <summary> /// Execute /// </summary> public object VisitWhile(WhileExpr expr) { expr.DoContinueRunning = true; expr.DoBreakLoop = false; expr.DoContinueLoop = false; var result = expr.Condition.Evaluate(this) as LObject; expr.DoContinueRunning = EvalHelper.IsTrue(result); while (expr.DoContinueRunning) { if (expr.Statements != null && expr.Statements.Count > 0) { foreach (var stmt in expr.Statements) { stmt.Evaluate(this); this.Ctx.Limits.CheckLoop(expr); // If Break statment executed. if (expr.DoBreakLoop) { expr.DoContinueRunning = false; break; } // Continue statement. else if (expr.DoContinueLoop) { break; } } } else { break; } // Break loop here. if (expr.DoContinueRunning == false) { break; } result = expr.Condition.Evaluate(this) as LObject; expr.DoContinueRunning = EvalHelper.IsTrue(result); } return(LObjects.Null); }
/// <summary> /// Visits the while statement tree. /// </summary> /// <param name="whileExpr"></param> public object VisitWhile(WhileExpr expr) { _callBackOnNodeStart(expr); expr.Condition.Visit(this); foreach (var stmt in expr.Statements) { stmt.Visit(this); } return null; }