Example #1
0
            // returns a proxy for a label if branch must be hijacked to run finally
            // otherwise returns same label back
            public InternalLabel ProxyLabelIfNeeded(InternalLabel label)
            {
                // no need to proxy a label in the current frame or when we are at the root
                if (IsRoot() || (_labelsOpt != null && _labelsOpt.Contains(label)))
                {
                    return(label);
                }

                var proxyLabels   = this.proxyLabels;
                var proxiedLabels = this.proxiedLabels;

                if (proxyLabels == null)
                {
                    this.proxyLabels   = proxyLabels = new Dictionary <InternalLabel, InternalLabel>();
                    this.proxiedLabels = proxiedLabels = new List <InternalLabel>();
                }

                InternalLabel proxy;

                if (!proxyLabels.TryGetValue(label, out proxy))
                {
                    proxy = _builder.CreateLabel(label.LabelStatement, "proxy" + label.Name, _tryDepth);
                    proxyLabels.Add(label, proxy);
                    proxiedLabels.Add(label);
                }

                return(proxy);
            }