Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/features/async-streams.md
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ else if (token.Equals(this.parameterProxy) || token.Equals(default))
else
{
result.combinedTokens = CancellationTokenSource.CreateLinkedTokenSource(this.parameterProxy, token);
result.parameter = combinedTokens.Token;
result.parameter = result.combinedTokens.Token;
}
```
For a discussion of the threadID check, see https://github.com/dotnet/corefx/issues/3481
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,10 +207,10 @@ protected override void InitializeStateMachine(ArrayBuilder<BoundStatement> body
F.New(stateMachineType.Constructor.AsMember(frameType), F.Literal(initialState))));
}

protected override BoundStatement InitializeParameterField(MethodSymbol getEnumeratorMethod, ParameterSymbol parameter, BoundExpression resultParameter, BoundExpression parameterProxy)
protected override BoundStatement InitializeParameterField(MethodSymbol getEnumeratorMethod, ParameterSymbol parameter, BoundExpression result, BoundExpression resultParameter, BoundExpression parameterProxy)
{
BoundStatement result;
if (_combinedTokensField is object &&
BoundStatement initializeParameterFieldResult;
if (_combinedTokensField is not null &&
!parameter.IsExtensionParameterImplementation() &&
parameter.HasEnumeratorCancellationAttribute &&
parameter.Type.Equals(F.Compilation.GetWellKnownType(WellKnownType.System_Threading_CancellationToken), TypeCompareKind.ConsiderEverything))
Expand All @@ -227,12 +227,13 @@ protected override BoundStatement InitializeParameterField(MethodSymbol getEnume
// else
// {
// result.combinedTokens = CancellationTokenSource.CreateLinkedTokenSource(this.parameterProxy, token);
// result.parameter = combinedTokens.Token;
// result.parameter = result.combinedTokens.Token;
// }

BoundParameter tokenParameter = F.Parameter(getEnumeratorMethod.Parameters[0]);
BoundFieldAccess combinedTokens = F.Field(F.This(), _combinedTokensField);
result = F.If(
BoundFieldAccess resultCombinedTokens = F.Field(result, _combinedTokensField);

initializeParameterFieldResult = F.If(
// if (this.parameterProxy.Equals(default))
F.Call(parameterProxy, WellKnownMember.System_Threading_CancellationToken__Equals, F.Default(parameterProxy.Type)),
// result.parameter = token;
Expand All @@ -246,18 +247,18 @@ protected override BoundStatement InitializeParameterField(MethodSymbol getEnume
thenClause: F.Assignment(resultParameter, parameterProxy),
elseClauseOpt: F.Block(
// result.combinedTokens = CancellationTokenSource.CreateLinkedTokenSource(this.parameterProxy, token);
F.Assignment(combinedTokens, F.StaticCall(WellKnownMember.System_Threading_CancellationTokenSource__CreateLinkedTokenSource, parameterProxy, tokenParameter)),
F.Assignment(resultCombinedTokens, F.StaticCall(WellKnownMember.System_Threading_CancellationTokenSource__CreateLinkedTokenSource, parameterProxy, tokenParameter)),
// result.parameter = result.combinedTokens.Token;
F.Assignment(resultParameter, F.Property(combinedTokens, WellKnownMember.System_Threading_CancellationTokenSource__Token)))));
F.Assignment(resultParameter, F.Property(resultCombinedTokens, WellKnownMember.System_Threading_CancellationTokenSource__Token)))));
}
else
{
// For parameters that don't have [EnumeratorCancellation], initialize their parameter fields
// result.parameter = this.parameterProxy;
result = F.Assignment(resultParameter, parameterProxy);
initializeParameterFieldResult = F.Assignment(resultParameter, parameterProxy);
}

return result;
return initializeParameterFieldResult;
}

protected override BoundStatement GenerateStateMachineCreation(LocalSymbol stateMachineVariable, NamedTypeSymbol frameType, IReadOnlyDictionary<Symbol, CapturedSymbolReplacement> proxies)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,7 @@ protected SynthesizedImplementationMethod GenerateIteratorGetEnumerator(MethodSy

var thisInitialized = F.GenerateLabel("thisInitialized");

if ((object)initialThreadIdField != null)
if (initialThreadIdField is not null)
{
managedThreadId = MakeCurrentThreadId();

Expand Down Expand Up @@ -487,15 +487,22 @@ protected SynthesizedImplementationMethod GenerateIteratorGetEnumerator(MethodSy
CapturedSymbolReplacement proxy;
if (copyDest.TryGetValue(parameter, out proxy))
{
// result
BoundExpression result = F.Local(resultVariable);

// result.parameter
BoundExpression resultParameter = proxy.Replacement(
F.Syntax,
static (stateMachineType, arg) => arg.F.Local(arg.resultVariable),
(F, resultVariable));
static (stateMachineType, result) => result,
result);

// this.parameterProxy
BoundExpression parameterProxy = copySrc[parameter].Replacement(F.Syntax, static (stateMachineType, F) => F.This(), F);
BoundStatement copy = InitializeParameterField(getEnumeratorMethod, parameter, resultParameter, parameterProxy);
BoundExpression parameterProxy = copySrc[parameter].Replacement(
F.Syntax,
static (stateMachineType, F) => F.This(),
F
);
BoundStatement copy = InitializeParameterField(getEnumeratorMethod, parameter, result, resultParameter, parameterProxy);

bodyBuilder.Add(copy);
}
Expand All @@ -516,7 +523,7 @@ protected virtual void GenerateResetInstance(ArrayBuilder<BoundStatement> builde
F.Assignment(F.Field(F.This(), stateField), F.Literal(initialState)));
}

protected virtual BoundStatement InitializeParameterField(MethodSymbol getEnumeratorMethod, ParameterSymbol parameter, BoundExpression resultParameter, BoundExpression parameterProxy)
protected virtual BoundStatement InitializeParameterField(MethodSymbol getEnumeratorMethod, ParameterSymbol parameter, BoundExpression result, BoundExpression resultParameter, BoundExpression parameterProxy)
{
Debug.Assert(!method.IsIterator || !method.IsAsync); // an override handles async-iterators

Expand Down
Loading
Loading