public override SqlStatement VisitLoopStatement(PlSqlParser.LoopStatementContext context) { LoopStatement loop; if (context.WHILE() != null) { var condition = Expression.Build(context.condition()); loop = new WhileLoopStatement(condition); } else if (context.FOR() != null) { var param = context.cursorLoopParam(); if (param.lowerBound() != null && param.upperBound() != null) { var lower = Expression.Build(param.lowerBound()); var upper = Expression.Build(param.upperBound()); var indexName = Name.Simple(param.id()); var reverse = param.REVERSE() != null; loop = new ForLoopStatement(indexName, lower, upper) { Reverse = reverse }; } else { throw new NotImplementedException(); } } else { loop = new LoopStatement(); } if (context.labelDeclaration() != null) { var labelName = Name.Simple(context.labelDeclaration().id()); loop.Label = labelName; } var seqOfStatements = context.seqOfStatements(); if (seqOfStatements != null) { var statements = seqOfStatements.statement().Select(Visit); foreach (var statement in statements) { loop.Statements.Add(statement); } } return(loop); }
void IStatementVisitor.Visit(WhileLoopStatement statement) { Label previousLoopAfterLabel = currentLoopAfterLabel; currentLoopAfterLabel = generator.DefineLabel(); Label labelBegin = generator.DefineAndMarkLabel(); statement.Condition.AcceptInternal(this); generator.IfFalseGoto(currentLoopAfterLabel); statement.Body.AcceptInternal(this); generator.Goto(labelBegin); generator.MarkLabel(currentLoopAfterLabel); currentLoopAfterLabel = previousLoopAfterLabel; }
public void WhileLoop() { var whileLoop = new WhileLoopStatement(SqlExpression.SmallerOrEqualThan(SqlExpression.VariableReference("a"), SqlExpression.Constant(20))); whileLoop.Statements.Add(new ExitStatement()); SerializeAndAssert(whileLoop, (serialized, deserialized) => { Assert.IsNotNull(deserialized); Assert.IsNotNull(deserialized.ConditionExpression); Assert.IsNotNull(deserialized.Statements); Assert.IsNotEmpty(deserialized.Statements); }); }
private static void EmitWhileLoopStatement(WhileLoopStatement whileLoop, ILGenerator methodIL) { Label toLoopCond = methodIL.DefineLabel(); Label toLoopBody = methodIL.DefineLabel(); Label toBodyEnd = methodIL.DefineLabel(); Label toLoopEnd = methodIL.DefineLabel(); BreakLabel = toLoopEnd; ContinueLabel = toBodyEnd; methodIL.MarkLabel(toLoopCond); EmitCondition(whileLoop.Condition, methodIL); methodIL.Emit(OpCodes.Brtrue, toLoopBody); methodIL.Emit(OpCodes.Br, toLoopEnd); methodIL.MarkLabel(toLoopBody); EmitEmbeddedStatement((EmbeddedStatement)whileLoop.Body, methodIL); methodIL.MarkLabel(toBodyEnd); methodIL.Emit(OpCodes.Br, toLoopCond); methodIL.MarkLabel(toLoopEnd); }
public void WhileLoop() { var loop = new WhileLoopStatement(SqlExpression.SmallerThan(SqlExpression.VariableReference("a"), SqlExpression.Constant(33))); loop.Statements.Add(new DeclareVariableStatement("b", PrimitiveTypes.Integer())); loop.Statements.Add(new AssignVariableStatement(SqlExpression.VariableReference("b"), SqlExpression.Add(SqlExpression.VariableReference("a"), SqlExpression.Constant(40)))); loop.Statements.Add(new AssignVariableStatement(SqlExpression.VariableReference("a"), SqlExpression.Add(SqlExpression.VariableReference("a"), SqlExpression.Constant(1)))); var block = new PlSqlBlockStatement(); block.Declarations.Add(new DeclareVariableStatement("a", PrimitiveTypes.Integer())); var result = AdminQuery.ExecuteStatement(block); Assert.IsNotNull(result); Assert.AreEqual(StatementResultType.Result, result.Type); var value = result.Result.GetValue(0, 0); Assert.IsNotNull(value); Assert.IsFalse(Field.IsNullField(value)); }