protected internal override Expression VisitAwait(AwaitCSharpExpression node)
        {
            var exprCount = 1 /* GetAwaiter */ + 1 /* IsCompleted */ + 1 /* Label */ + 1 /* GetResult */ + 2 /* Cleanup */;

            if (_awaitInBlock.Count > 0)
            {
                _awaitInBlock.Peek().Value = true;
            }

            var getAwaiter  = node.Info.ReduceGetAwaiter(node.Operand);
            var awaiterVar  = _variableFactory(getAwaiter.Type, "__awaiter");
            var isCompleted = node.Info.ReduceIsCompleted(awaiterVar);
            var getResult   = node.Info.ReduceGetResult(awaiterVar);

            if (getResult.Type != typeof(void))
            {
                exprCount++;
            }

            var vars  = Array.Empty <ParameterExpression>();
            var exprs = new Expression[exprCount];

            if (getResult.Type != typeof(void))
            {
                var resultVar = Expression.Parameter(getResult.Type, "__result");
                getResult  = Expression.Assign(resultVar, getResult);
                vars       = new[] { resultVar };
                exprs[^ 1] = resultVar;
Example #2
0
            protected internal override Expression VisitAwait(AwaitCSharpExpression node)
            {
                if (_forbidden.Count > 0)
                {
                    throw Error.AwaitForbiddenHere(_forbidden.Peek());
                }

                return(base.VisitAwait(node));
            }
        protected internal override Expression VisitAwait(AwaitCSharpExpression node)
        {
            var exprCount = 1 /* GetAwaiter */ + 1 /* IsCompleted */ + 1 /* Label */ + 1 /* GetResult */ + 2 /* Cleanup */;

            if (_awaitInBlock.Count > 0)
            {
                _awaitInBlock.Peek().Value = true;
            }

            var getAwaiter  = node.ReduceGetAwaiter();
            var awaiterVar  = _variableFactory(getAwaiter.Type, "__awaiter");
            var isCompleted = node.ReduceIsCompleted(awaiterVar);
            var getResult   = node.ReduceGetResult(awaiterVar);

            if (getResult.Type != typeof(void))
            {
                exprCount++;
            }

            var vars  = Array.Empty <ParameterExpression>();
            var exprs = new Expression[exprCount];

            if (getResult.Type != typeof(void))
            {
                var resultVar = Expression.Parameter(getResult.Type, "__result");
                getResult = Expression.Assign(resultVar, getResult);
                vars      = new[] { resultVar };
                exprs[exprs.Length - 1] = resultVar;
            }

            var continueLabel = GetLabel();

            var i = 0;

            exprs[i++] =
                Expression.Assign(awaiterVar, getAwaiter);
            exprs[i++] =
                Expression.IfThen(Expression.Not(isCompleted),
                                  Expression.Block(
                                      UpdateState(continueLabel.Index),
                                      _onCompletedFactory(awaiterVar),
                                      Expression.Return(_exit)
                                      )
                                  );
            exprs[i++] =
                Expression.Label(continueLabel.Label);
            exprs[i++] =
                getResult;
            exprs[i++] =
                Expression.Assign(awaiterVar, Expression.Default(awaiterVar.Type));
            exprs[i++] =
                UpdateState(-1);

            var res = Expression.Block(getResult.Type, vars, exprs);

            return(res);
        }
        protected internal override Expression VisitAwait(AwaitCSharpExpression node)
        {
            if (_hasAwait.Count > 0)
            {
                _hasAwait.Peek().Value = true;
            }

            return base.VisitAwait(node);
        }
        protected internal override Expression VisitAwait(AwaitCSharpExpression node)
        {
            if (_hasAwait.Count > 0)
            {
                _hasAwait.Peek().Value = true;
            }

            return(base.VisitAwait(node));
        }
Example #6
0
            protected internal override Expression VisitAwait(AwaitCSharpExpression node)
            {
                Visited = true;

                return(base.VisitAwait(node));
            }
        protected internal override Expression VisitAwait(AwaitCSharpExpression node)
        {
            var exprCount = 1 /* GetAwaiter */ + 1 /* IsCompleted */ + 1 /* Label */ + 1 /* GetResult */ + 2 /* Cleanup */;

            if (_awaitInBlock.Count > 0)
            {
                _awaitInBlock.Peek().Value = true;
            }

            var getAwaiter = node.ReduceGetAwaiter();
            var awaiterVar = _variableFactory(getAwaiter.Type, "__awaiter");
            var isCompleted = node.ReduceIsCompleted(awaiterVar);
            var getResult = node.ReduceGetResult(awaiterVar);

            if (getResult.Type != typeof(void))
            {
                exprCount++;
            }

            var vars = Array.Empty<ParameterExpression>();
            var exprs = new Expression[exprCount];

            if (getResult.Type != typeof(void))
            {
                var resultVar = Expression.Parameter(getResult.Type, "__result");
                getResult = Expression.Assign(resultVar, getResult);
                vars = new[] { resultVar };
                exprs[exprs.Length - 1] = resultVar;
            }

            var continueLabel = GetLabel();

            var i = 0;

            exprs[i++] =
                Expression.Assign(awaiterVar, getAwaiter);
            exprs[i++] =
                Expression.IfThen(Expression.Not(isCompleted),
                    Expression.Block(
                        UpdateState(continueLabel.Index),
                        _onCompletedFactory(awaiterVar),
                        Expression.Return(_exit)
                    )
                );
            exprs[i++] =
                Expression.Label(continueLabel.Label);
            exprs[i++] =
                getResult;
            exprs[i++] =
                Expression.Assign(awaiterVar, Expression.Default(awaiterVar.Type));
            exprs[i++] =
                UpdateState(-1);

            var res = Expression.Block(getResult.Type, vars, exprs);
            return res;
        }