private static Expression CreateRewrittenTry(TryExpression node, HandlerRewriter rewriter, Expression call)
        {
            var assignLeaveResult = Expression.Assign(rewriter.LeaveResult, call);
            var leaveResultValue  = Expression.PropertyOrField(rewriter.LeaveResult, "Value");

            //
            // 1. Create jump table.
            //
            var dispatch = rewriter.GetDispatchTable();

            //
            // 2. Count number of expressions needed in resulting block.
            //
            var n          = (node.Type == typeof(void) ? 0 : 1) + (dispatch != null ? 1 : 0) + 1;
            var statements = new Expression[n];

            //
            // 3. Store result of call in temporary.
            //
            var i = 0;

            statements[i++] = assignLeaveResult;

            //
            // 4. For non-emptyu dispatch tables, emit the dispatch.
            //
            if (dispatch != null)
            {
                statements[i++] = dispatch;
            }

            //
            // 5. For non-null nodes, extract the result.
            //
            if (node.Type != typeof(void))
            {
                statements[i++] = Expression.Convert(leaveResultValue, node.Type);
            }

            //
            // 6. Put everything together in a block.
            //
            var res = Expression.Block(node.Type, new[] { rewriter.LeaveResult }, statements);

            return(res);
        }
        private static Expression CreateRewrittenTry(TryExpression node, HandlerRewriter rewriter, Expression call)
        {
            var assignLeaveResult = Expression.Assign(rewriter.LeaveResult, call);
            var leaveResultValue = Expression.PropertyOrField(rewriter.LeaveResult, "Value");

            //
            // 1. Create jump table.
            //
            var dispatch = rewriter.GetDispatchTable();

            //
            // 2. Count number of expressions needed in resulting block.
            //
            var n = (node.Type == typeof(void) ? 0 : 1) + (dispatch != null ? 1 : 0) + 1;
            var statements = new Expression[n];

            //
            // 3. Store result of call in temporary.
            //
            var i = 0;
            statements[i++] = assignLeaveResult;

            //
            // 4. For non-emptyu dispatch tables, emit the dispatch.
            //
            if (dispatch != null)
            {
                statements[i++] = dispatch;
            }

            //
            // 5. For non-null nodes, extract the result.
            //
            if (node.Type != typeof(void))
            {
                statements[i++] = Expression.Convert(leaveResultValue, node.Type);
            }

            //
            // 6. Put everything together in a block.
            //
            var res = Expression.Block(node.Type, new[] { rewriter.LeaveResult }, statements);
            return res;
        }