示例#1
0
        public override Object Visit(ForStatement node, Object obj)
        {
            Object aux = null;

            this.map.SetScope();
            for (int i = 0; i < node.InitializerCount; i++)
            {
                node.GetInitializerElement(i).Accept(this, false);
            }
            SSAMap map1 = this.map.Clone();

            if ((aux = node.Condition.Accept(this, false)) is SingleIdentifierExpression)
            {
                node.Condition = (SingleIdentifierExpression)aux;
            }
            SSAMap map2 = this.map.Clone();

            node.Statements.Accept(this, obj);
            SSAMap map3 = this.map.Clone();

            for (int i = 0; i < node.IteratorCount; i++)
            {
                node.GetIteratorElement(i).Accept(this, false);
            }
            // map4 = this.map

            List <MoveStatement> mvSt = map1.GetMoveStatements(this.map, node.Location.FileName, node.Location.Line);

            if (mvSt.Count != 0)
            {
                node.AfterInit = mvSt;
            }

            List <ThetaStatement> thSt = map1.GetThetaStatements(map2, ref this.map, node.Location.FileName, node.Location.Line);

            if (thSt.Count != 0)
            {
                node.BeforeCondition = thSt;
            }

            mvSt = map1.GetMoveStatements(map2, this.map, node.Location.FileName, node.Location.Line);
            if (mvSt.Count != 0)
            {
                node.AfterCondition = mvSt;
            }

            SSAInfo info = new SSAInfo(null, null, map1, this.map);

            node.Condition.Accept(new VisitorSSA2(), info);

            info = new SSAInfo(this.map, null, map1, this.map);
            node.Statements.Accept(new VisitorSSA2(), info);

            info = new SSAInfo(this.map, null, map1, this.map);
            for (int i = 0; i < node.IteratorCount; i++)
            {
                node.GetIteratorElement(i).Accept(new VisitorSSA2(), info);
            }

            this.addLocalVariable(this.map.ResetScope(), node.AuxInitializer);
            node.UpdateInitializer();

            return(null);
        }