public override void CloseScope(ILBuilder builder) { Debug.Assert(_handlers.Count > 1); // Fix up the NextExceptionHandler reference of each leader block. ExceptionHandlerScope tryScope = _handlers[0]; ExceptionHandlerLeaderBlock previousBlock = tryScope.LeaderBlock; for (int i = 1; i < _handlers.Count; i++) { ExceptionHandlerScope handlerScope = _handlers[i]; ExceptionHandlerLeaderBlock nextBlock = handlerScope.LeaderBlock; previousBlock.NextExceptionHandler = nextBlock; previousBlock = nextBlock; } // Generate label for try/catch "leave" target. builder.MarkLabel(_endLabel); // hide the following code, since it could be reached through the label above. builder.DefineHiddenSequencePoint(); Debug.Assert(builder._currentBlock == builder._labelInfos[_endLabel].bb); if (_handlers[1].Type == ScopeType.Finally) { // Generate "nop" branch to itself. If this block is unreachable // (because the finally block does not complete), the "nop" will be // replaced by Br_s. On the other hand, if this block is reachable, // the "nop" will be skipped so any "leave" instructions jumping // to this block will jump to the next instead. builder.EmitBranch(ILOpCode.Nop, _endLabel); _handlers[1].SetBlockedByFinallyDestination(_endLabel); } }