// 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); }