Exemplo n.º 1
0
        public override BoundNode VisitAwaitExpression(BoundAwaitExpression node)
        {
            BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
            TypeSymbol      type       = this.VisitType(node.Type);

            return(node.Update(expression, VisitMethodSymbol(node.GetAwaiter), VisitPropertySymbol(node.IsCompleted), VisitMethodSymbol(node.GetResult), type));
        }
Exemplo n.º 2
0
        public override BoundNode VisitAwaitExpression(BoundAwaitExpression node)
        {
            // An await expression has already been wrapped in a BoundSpillSequence if not at the top level, so
            // the spilling will occur in the enclosing node.
            BoundSpillSequenceBuilder builder = null;
            var expr = VisitExpression(ref builder, node.Expression);

            return(UpdateExpression(builder, node.Update(expr, node.AwaitableInfo, node.Type)));
        }
        private BoundBlock VisitAwaitExpression(BoundAwaitExpression node, BoundExpression resultPlace)
        {
            var expression = (BoundExpression)Visit(node.Expression);

            resultPlace = (BoundExpression)Visit(resultPlace);
            MethodSymbol getAwaiter        = VisitMethodSymbol(node.AwaitableInfo.GetAwaiter);
            MethodSymbol getResult         = VisitMethodSymbol(node.AwaitableInfo.GetResult);
            MethodSymbol isCompletedMethod = ((object)node.AwaitableInfo.IsCompleted != null) ? VisitMethodSymbol(node.AwaitableInfo.IsCompleted.GetMethod) : null;
            TypeSymbol   type = VisitType(node.Type);

            // The awaiter temp facilitates EnC method remapping and thus have to be long-lived.
            // It transfers the awaiter objects from the old version of the MoveNext method to the new one.
            Debug.Assert(node.Syntax.IsKind(SyntaxKind.AwaitExpression) || node.WasCompilerGenerated);
            TypeSymbol awaiterType       = getAwaiter.ReturnType.TypeSymbol;
            var        awaiterTemp       = F.SynthesizedLocal(awaiterType, syntax: node.Syntax, kind: SynthesizedLocalKind.Awaiter);
            var        awaitIfIncomplete = F.Block(
                // temp $awaiterTemp = <expr>.GetAwaiter();
                F.Assignment(
                    F.Local(awaiterTemp),
                    MakeCallMaybeDynamic(expression, getAwaiter, WellKnownMemberNames.GetAwaiter)),

                // hidden sequence point facilitates EnC method remapping, see explanation on SynthesizedLocalKind.Awaiter:
                F.HiddenSequencePoint(),

                // if(!($awaiterTemp.IsCompleted)) { ... }
                F.If(
                    condition: F.Not(GenerateGetIsCompleted(awaiterTemp, isCompletedMethod)),
                    thenClause: GenerateAwaitForIncompleteTask(awaiterTemp)));
            BoundExpression getResultCall = MakeCallMaybeDynamic(
                F.Local(awaiterTemp),
                getResult,
                WellKnownMemberNames.GetResult,
                resultsDiscarded: resultPlace == null);

            // [$resultPlace = ] $awaiterTemp.GetResult();
            BoundStatement getResultStatement = resultPlace != null && type.SpecialType != SpecialType.System_Void ?
                                                F.Assignment(resultPlace, getResultCall) :
                                                F.ExpressionStatement(getResultCall);

            return(F.Block(
                       ImmutableArray.Create(awaiterTemp),
                       awaitIfIncomplete,
                       getResultStatement));
        }
Exemplo n.º 4
0
 public override BoundNode VisitAwaitExpression(BoundAwaitExpression node)
 {
     BoundExpression expression = (BoundExpression)this.Visit(node.Expression);
     TypeSymbol type = this.VisitType(node.Type);
     return node.Update(expression, VisitMethodSymbol(node.GetAwaiter), VisitPropertySymbol(node.IsCompleted), VisitMethodSymbol(node.GetResult), type);
 }
 public sealed override BoundNode VisitAwaitExpression(BoundAwaitExpression node)
 {
     // await expressions must, by now, have been moved to the top level.
     throw ExceptionUtilities.Unreachable;
 }
Exemplo n.º 6
0
 public override BoundNode VisitAwaitExpression(BoundAwaitExpression node)
 {
     _sawAwait = true;
     return(null);
 }
 public override BoundNode VisitAwaitExpression(BoundAwaitExpression node)
 {
     _seenAwait = true;
     return(base.VisitAwaitExpression(node));
 }
Exemplo n.º 8
0
 public BoundExpression VisitAwaitExpression(BoundAwaitExpression node, bool used)
 {
     return(RewriteAwaitExpression((BoundExpression)base.VisitAwaitExpression(node), used));
 }
Exemplo n.º 9
0
 public override BoundNode VisitAwaitExpression(BoundAwaitExpression node)
 {
     return(VisitAwaitExpression(node, true));
 }