/// <summary> /// Visit enumeree and body. /// </summary> /// <param name="x"></param> virtual public void VisitForeachStmt(ForeachStmt x) { VisitElement(x.Enumeree); VisitForeachVar(x.KeyVariable); VisitForeachVar(x.ValueVariable); VisitElement(x.Body); }
internal ForeachStmtPoint(ForeachStmt foreachStmt, ValuePoint enumeree, LValuePoint keyVar, LValuePoint valVar) { Foreach = foreachStmt; KeyVar = keyVar; ValVar = valVar; Enumeree = enumeree; }
/// <summary> /// Visits foreach statement and creates the foreach contruct in cfg. /// </summary> /// <param name="x">ForeachStmt</param> public override void VisitForeachStmt(ForeachStmt x) { BasicBlock foreachHead = new BasicBlock(); BasicBlock foreachBody = new BasicBlock(); BasicBlock foreachSink = new BasicBlock(); foreachHead.CreateWorklistSegment(foreachSink); //Input edge to the foreach statement BasicBlockEdge.ConnectDirectEdge(currentBasicBlock, foreachHead); foreachHead.AddElement(x); //Conditional edge to the foreach body BasicBlockEdge.ConnectForeachEdge(foreachHead, foreachBody); //Visits foreach body loopData.Push(new LoopData(foreachHead, foreachSink)); currentBasicBlock = foreachBody; x.Body.VisitMe(this); loopData.Pop(); //Connect end of foreach with foreach head BasicBlockEdge.ConnectDirectEdge(currentBasicBlock, foreachHead); //Output edge to the sink BasicBlockEdge.ConnectDirectEdge(foreachHead, foreachSink); currentBasicBlock = foreachSink; }
public override void VisitForeachStmt(ForeachStmt x) { using (new ScopeHelper(this, x)) { base.VisitForeachStmt(x); } }
private static ForeachExpression ToForeachExpression(ForeachStmt e) { return(new ForeachExpression( enumeree: Parse(e.Enumeree), body: Parse(e.Body), key_variable: Parse((VarLikeConstructUse)e.KeyVariable?.Variable ?? e.KeyVariable?.List), value_variable: Parse((VarLikeConstructUse)e.ValueVariable?.Variable ?? e.ValueVariable?.List) )); }
public override void VisitForeachStmt(ForeachStmt x) { // binds enumeree expression & connect pre-enumeree-expr blocks var boundEnumereeBag = _binder.BindWholeExpression(x.Enumeree, BoundAccess.Read); ConnectBoundItemsBagBlocksToCurrentBlock(boundEnumereeBag); var end = NewBlock(); var move = NewBlock(); var body = NewBlock(); // _current -> move -> body -> move -> ... // ForeachEnumereeEdge : SimpleEdge // x.Enumeree.GetEnumerator(); var enumereeEdge = new ForeachEnumereeEdge(_current, move, boundEnumereeBag.BoundElement, x.ValueVariable.Alias); // ContinueTarget: OpenBreakScope(end, move); // bind reference expression for foreach key variable BoundReferenceExpression keyVar = (x.KeyVariable != null) ? (BoundReferenceExpression)_binder.BindWholeExpression(x.KeyVariable.Variable, BoundAccess.Write).GetOnlyBoundElement() : null; // bind reference expression for foreach value variable var valueVar = (BoundReferenceExpression)(_binder.BindWholeExpression( (Expression)x.ValueVariable.Variable ?? x.ValueVariable.List, x.ValueVariable.Alias ? BoundAccess.Write.WithWriteRef(FlowAnalysis.TypeRefMask.AnyType) : BoundAccess.Write ).GetOnlyBoundElement()); // ForeachMoveNextEdge : ConditionalEdge var moveEdge = new ForeachMoveNextEdge(move, body, end, enumereeEdge, keyVar, valueVar, Span.FromBounds(x.Enumeree.Span.End + 1, (x.KeyVariable ?? x.ValueVariable).Span.Start - 1).ToTextSpan() /*"as" between enumeree and variables*/); // while (enumerator.MoveNext()) { // var value = enumerator.Current.Value // var key = enumerator.Current.Key // Block // { x.Body } _current = WithOpenScope(WithNewOrdinal(body)); VisitElement(x.Body); CloseScope(); // goto ContinueTarget; Connect(_current, move); // BreakTarget: CloseBreakScope(); // _current = WithNewOrdinal(end); }
override public void VisitForeachStmt(ForeachStmt x) { _serializer.StartSerialize(typeof(ForeachStmt).Name, SerializeSpan(x.Span)); SerializeOptionalProperty("Enumeree", x.Enumeree); if (x.KeyVariable != null) { SerializeOptionalProperty("KeyVariable", x.KeyVariable.Target); } SerializeOptionalProperty("ValueVariable", x.ValueVariable.Target); SerializeOptionalProperty("Body", x.Body); _serializer.EndSerialize(); }
public override void VisitForeachStmt(ForeachStmt x) { // Traverse only header if (x.KeyVariable != null) { VisitElement(x.KeyVariable.Variable); } if (x.ValueVariable != null) { VisitElement(x.ValueVariable.Variable); } VisitElement(x.Enumeree); }
public override void VisitForeachStmt(ForeachStmt x) { using (new ScopeHelper(this, x)) { ConsumeToken(Tokens.T_FOREACH, "foreach", x.Span.Start); ConsumeToken(Tokens.T_LPAREN, "("); VisitElement(x.Enumeree); ConsumeToken(Tokens.T_AS, "as"); if (x.KeyVariable != null) { VisitForeachVar(x.KeyVariable); ConsumeToken(Tokens.T_DOUBLE_ARROW, "=>"); } VisitForeachVar(x.ValueVariable); ConsumeToken(Tokens.T_RPAREN, ")"); VisitElement(x.Body); } }
/// <inheritdoc /> public override void VisitForeachStmt(ForeachStmt x) { var enumeree = CreateRValue(x.Enumeree); LValuePoint keyVar = null; LValuePoint valueVar = null; if (x.KeyVariable != null) { keyVar = CreateLValue(x.KeyVariable.Variable); } if (x.ValueVariable != null) { valueVar = CreateLValue(x.ValueVariable.Variable); } Result(new ForeachStmtPoint(x, enumeree, keyVar, valueVar)); }
public override void VisitForeachStmt(ForeachStmt x) { var end = NewBlock(); var move = NewBlock(); var body = NewBlock(); // _current -> move -> body -> move -> ... // ForeachEnumereeEdge : SimpleEdge // x.Enumeree.GetEnumerator(); var enumereeEdge = new ForeachEnumereeEdge(_current, move, _binder.BindExpression(x.Enumeree, BoundAccess.Read), x.ValueVariable.Alias); // ContinueTarget: OpenBreakScope(end, move); // ForeachMoveNextEdge : ConditionalEdge var moveEdge = new ForeachMoveNextEdge(move, body, end, enumereeEdge, (x.KeyVariable != null) ? (BoundReferenceExpression)_binder.BindExpression(x.KeyVariable.Variable, BoundAccess.Write) : null, (BoundReferenceExpression)_binder.BindExpression( (Expression)x.ValueVariable.Variable ?? x.ValueVariable.List, x.ValueVariable.Alias ? BoundAccess.Write.WithWriteRef(FlowAnalysis.TypeRefMask.AnyType) : BoundAccess.Write)); // while (enumerator.MoveNext()) { // var key = enumerator.Current.Key // var value = enumerator.Current.Value // Block // { x.Body } _current = WithOpenScope(WithNewOrdinal(body)); VisitElement(x.Body); CloseScope(); // goto ContinueTarget; Connect(_current, move); // BreakTarget: CloseBreakScope(); // _current = WithNewOrdinal(end); }
public override void VisitForeachStmt(ForeachStmt x) { var valuevar = x.ValueVariable; // VariableUse or ListEx var keyvar = x.KeyVariable; // VariableUse or null if (valuevar.Variable != null) { valuevar.Variable.VisitMe(this); } else if (valuevar.List != null) { valuevar.List.VisitMe(this); } if (keyvar != null && keyvar.Variable != null) { keyvar.Variable.VisitMe(this); } // base.VisitForeachStmt(x); }
public Stmt ParseForeach(int deep) { //report("ParseForeach()"); checkToken(TokenKind.Foreach); ForeachStmt foreachStmt = new ForeachStmt(); foreachStmt.ForeachToken = CurrentToken; MoveNext(); match(TokenKind.LBS); foreachStmt.ListExp = parseExp(); match(TokenKind.Comma); foreachStmt.ElementToken = CurrentToken; MoveNext(); if (CurrentKind == TokenKind.Comma) { MoveNext(); foreachStmt.IndexToken = CurrentToken; MoveNext(); } match(TokenKind.RBS); foreachStmt.Body = parseBlock(foreachStmt.Postion, deep); return(foreachStmt); }