예제 #1
0
 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);
         });
     }
 }
예제 #2
0
 /// <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;
 }
예제 #3
0
 /// <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);
     }
 }
예제 #4
0
        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);
        }
예제 #5
0
 /// <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);
 }
예제 #6
0
        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);
        }
예제 #7
0
        /// <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);
        }
예제 #8
0
 /// <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;
 }