private bool NeedsLabel(StructureNode node) { if (node.ForceLabel) { return(true); } if (node.InEdges.Count == 1) { return(false); } foreach (StructureNode pred in node.InEdges) { if (IsVisited(pred) && !IncompleteNodes.Contains(pred)) { continue; } if (node.IsLoopHeader() && node.IsAncestorOf(pred)) { continue; } return(true); } return(false); }
public void GenerateCode( StructureNode node, StructureNode latchNode, AbsynStatementEmitter emitter) { if (followStack.Contains(node) && followStack.Peek() == node) { return; } if (IsVisited(node)) { return; } visited.Add(node); if (NeedsLabel(node)) { GenerateLabel(node, emitter); } if (node.IsLoopHeader()) { node.Loop.GenerateCode(this, node, latchNode, emitter); } else if (node.Conditional != null) { node.Conditional.GenerateCode(this, node, latchNode, emitter); } else { EmitLinearBlockStatements(node, emitter); if (EndsWithReturnInstruction(node)) { emitter.EmitStatement(node.Instructions.Last); return; } if (node.IsLatchNode()) { return; } if (node.OutEdges.Count == 1) { StructureNode succ = node.OutEdges[0]; if (ShouldJumpFromSequentialNode(node, succ)) { EmitGotoAndForceLabel(node, succ, emitter); } else { GenerateCode(succ, latchNode, emitter); } } } }