private void ForStatementEnter(XmlNode node) { CFGBlock forLoopInit = new CFGBlock(); if (!CurrentBlock.BreaksOutOfScope) { forLoopInit = ConnectNewBlockTo(CurrentBlock, EdgeType.Normal); } forLoopInit.AstEntryNode = ForLoop.GetInitNode(node); DoNotVisitChildren(forLoopInit.AstEntryNode); CFGBlock conditionBlock = ConnectNewBlockTo(forLoopInit, EdgeType.Normal); conditionBlock.AstEntryNode = node; DoNotVisitChildren(Conditional.GetCondNode(node)); CFGBlock loopUpdateBlock = new CFGBlock { AstEntryNode = ForLoop.GetLoopNode(node) }; DoNotVisitChildren(loopUpdateBlock.AstEntryNode); var edge = new TaggedEdge<CFGBlock, EdgeTag>(loopUpdateBlock, conditionBlock, new EdgeTag(EdgeType.Normal)); Graph.AddVerticesAndEdge(edge); CFGBlock loopBodyBlock = ConnectNewBlockTo(conditionBlock, EdgeType.True); CFGBlock loopDoneBlock = ConnectNewBlockTo(conditionBlock, EdgeType.False); var loopScope = new LoopScope(forLoopInit) { LoopConditionBlock = loopUpdateBlock, LoopBodyStartBlock = loopBodyBlock, LoopUpdateBlock = loopUpdateBlock, ContinueDestination = loopUpdateBlock, EndBlock = loopDoneBlock }; scopeHandler.EnterLoop(loopScope); CurrentBlock = loopBodyBlock; }
private void WhileOrForeachStatementEnter(XmlNode node) { CFGBlock conditionBlock = new CFGBlock(); if (!CurrentBlock.BreaksOutOfScope) { conditionBlock = ConnectNewBlockTo(CurrentBlock, EdgeType.Normal); } CFGBlock loopBodyBlock; CFGBlock loopExitBlock; if (node.LocalName == AstConstants.Nodes.Stmt_Foreach) { loopBodyBlock = ConnectNewBlockTo(conditionBlock, EdgeType.Normal); loopExitBlock = ConnectNewBlockTo(conditionBlock, EdgeType.Normal); } else { loopBodyBlock = ConnectNewBlockTo(conditionBlock, EdgeType.True); loopExitBlock = ConnectNewBlockTo(conditionBlock, EdgeType.False); } conditionBlock.AstEntryNode = node; var whileLoopScope = new LoopScope(conditionBlock) { LoopConditionBlock = conditionBlock, LoopBodyStartBlock = loopBodyBlock, ContinueDestination = conditionBlock, EndBlock = loopExitBlock }; scopeHandler.EnterLoop(whileLoopScope); if (node.LocalName == AstConstants.Nodes.Stmt_Foreach) { DoNotVisitChildren(node.GetSubNode(AstConstants.Subnode + ":" + AstConstants.Subnodes.Expr)); DoNotVisitChildren(node.GetSubNode(AstConstants.Subnode + ":" + AstConstants.Subnodes.KeyVar)); DoNotVisitChildren(node.GetSubNode(AstConstants.Subnode + ":" + AstConstants.Subnodes.ValueVar)); } else { DoNotVisitChildren(Conditional.GetCondNode(node)); } CurrentBlock = loopBodyBlock; }
private void DoStatementEnter(XmlNode node) { var loopEntryBlock = new CFGBlock(); if (!CurrentBlock.BreaksOutOfScope) { loopEntryBlock = ConnectNewBlockTo(CurrentBlock, EdgeType.Normal); } Graph.AddVertex(loopEntryBlock); CurrentBlock = loopEntryBlock; CFGBlock conditionBlock = new CFGBlock { AstEntryNode = node }; CFGBlock loopDoneBlock = ConnectNewBlockTo(conditionBlock, EdgeType.False); ConnectBlocks(conditionBlock, loopEntryBlock, EdgeType.True); var loopScope = new LoopScope(loopEntryBlock) { LoopBodyStartBlock = loopEntryBlock, LoopConditionBlock = conditionBlock, ContinueDestination = conditionBlock, EndBlock = loopDoneBlock, }; scopeHandler.EnterLoop(loopScope); DoNotVisitChildren(Conditional.GetCondNode(node)); }