示例#1
0
 /// <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);
 }
示例#2
0
 internal ForeachStmtPoint(ForeachStmt foreachStmt, ValuePoint enumeree, LValuePoint keyVar, LValuePoint valVar)
 {
     Foreach  = foreachStmt;
     KeyVar   = keyVar;
     ValVar   = valVar;
     Enumeree = enumeree;
 }
示例#3
0
        /// <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;
        }
示例#4
0
 public override void VisitForeachStmt(ForeachStmt x)
 {
     using (new ScopeHelper(this, x))
     {
         base.VisitForeachStmt(x);
     }
 }
示例#5
0
 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)
                ));
 }
示例#6
0
        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);
        }
示例#7
0
 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();
 }
示例#8
0
 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);
 }
示例#9
0
 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);
     }
 }
示例#10
0
        /// <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));
        }
示例#11
0
        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);
        }
示例#12
0
        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);
        }
示例#13
0
        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);
        }