Beispiel #1
0
        private string ComputeRecursiveExitLabel(LabelGroupData data, string label)
        {
            var labelData     = data[label];
            var recursiveExit = labelData.DirectExitLabel;

            if (recursiveExit == null)
            {
                return(null);
            }

            while (recursiveExit != null)
            {
                LabelGroupLabelData targetLabelData;

                if (!data.TryGetValue(recursiveExit, out targetLabelData))
                {
                    // The label is part of another label group.
                    return(null);
                }

                if (targetLabelData.DirectExitLabel == null)
                {
                    if (
                        (targetLabelData.ExitTargetLabels.Count == 0) /* &&
                                                                       * FIXME: Is this right?
                                                                       * (targetLabelData.UntargettedExitCount <= 1) */
                        )
                    {
                        return(recursiveExit);
                    }
                    else
                    {
                        return(null);
                    }
                }
                else
                {
                    // Cycle detected
                    if (recursiveExit == targetLabelData.DirectExitLabel)
                    {
                        return(null);
                    }

                    recursiveExit = targetLabelData.DirectExitLabel;
                }

                // Cycle detected
                if (recursiveExit == label)
                {
                    return(null);
                }
            }

            return(null);
        }