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