1 write to F
Microsoft.CodeAnalysis.CSharp (1)
Lowering\StateMachineRewriter\MethodToStateMachineRewriter.cs (1)
122
this.
F
= F;
415 references to F
Microsoft.CodeAnalysis.CSharp (415)
Lowering\AsyncRewriter\AsyncIteratorMethodToStateMachineRewriter.cs (57)
82
var iteratorDispatch = _iteratorStateAllocator.GenerateThrowMissingStateDispatch(
F
,
F
.Local(cachedState), CodeAnalysisResources.EncCannotResumeSuspendedIteratorMethod);
88
return (asyncDispatch != null) ?
F
.Block(asyncDispatch, iteratorDispatch) : iteratorDispatch;
118
F
.Return(),
119
F
.Label(_exprReturnLabelTrue),
123
return
F
.Block(builder.ToImmutableAndFree());
129
BoundFieldAccess promiseField =
F
.InstanceField(_asyncIteratorInfo.PromiseOfValueOrEndField);
130
return
F
.ExpressionStatement(
F
.Call(promiseField, _asyncIteratorInfo.SetResultMethod,
F
.Literal(result)));
138
return
F
.Assignment(
F
.InstanceField(currentField),
F
.Default(currentField.Type));
145
return
F
.ExpressionStatement(
146
F
.Call(
147
F
.Field(
F
.This(), _asyncMethodBuilderField),
157
var combinedTokens =
F
.Field(
F
.This(), _asyncIteratorInfo.CombinedTokensField);
161
F
.If(
F
.ObjectNotEqual(combinedTokens,
F
.Null(combinedTokensType)),
162
thenClause:
F
.Block(
163
F
.ExpressionStatement(
F
.Call(combinedTokens,
F
.WellKnownMethod(WellKnownMember.System_Threading_CancellationTokenSource__Dispose))),
164
F
.Assignment(combinedTokens,
F
.Null(combinedTokensType)))));
182
builder.Add(
F
.ExpressionStatement(
F
.Call(
183
F
.InstanceField(_asyncIteratorInfo.PromiseOfValueOrEndField),
185
F
.Local(exceptionLocal))));
187
return
F
.Block(builder.ToImmutableAndFree());
193
return
F
.If(
195
F
.InstanceField(_asyncIteratorInfo.DisposeModeField),
197
thenClause:
F
.Goto(_currentDisposalLabel));
206
return
F
.Block(
219
return
F
.IntEqual(
F
.Local(cachedState),
F
.Literal(StateMachineState.NotStartedOrRunningState));
243
return
F
.Block(
244
F
.Label(resumeLabel), // initialStateResumeLabel:
272
F
.Assignment(
F
.InstanceField(_asyncIteratorInfo.CurrentField), rewrittenExpression));
280
F
.Goto(_exprReturnLabelTrue));
284
F
.Label(resumeLabel));
286
blockBuilder.Add(
F
.HiddenSequencePoint());
298
F
.HiddenSequencePoint());
300
return
F
.Block(blockBuilder.ToImmutableAndFree());
312
return
F
.Block(
316
F
.Goto(_currentDisposalLabel));
321
return
F
.Assignment(
F
.InstanceField(_asyncIteratorInfo.DisposeModeField),
F
.Literal(value));
343
var finallyEntry =
F
.GenerateLabel("finallyEntry");
354
tryBlock:
F
.Block(node.TryBlock,
F
.Label(finallyEntry)),
Lowering\AsyncRewriter\AsyncMethodToStateMachineRewriter.cs (171)
112
if (slotAllocatorOpt == null || !slotAllocatorOpt.TryGetPreviousAwaiterSlotIndex(
F
.ModuleBuilderOpt.Translate(awaiterType,
F
.Syntax,
F
.Diagnostics.DiagnosticBag),
F
.Diagnostics.DiagnosticBag, out slotIndex))
118
result =
F
.StateMachineField(awaiterType, fieldName, SynthesizedLocalKind.AwaiterField, slotIndex);
136
F
.CurrentFunction = moveNextMethod;
144
bodyBuilder.Add(
F
.HiddenSequencePoint());
145
bodyBuilder.Add(
F
.Assignment(
F
.Local(cachedState),
F
.Field(
F
.This(), stateField)));
148
var exceptionLocal =
F
.SynthesizedLocal(
F
.WellKnownType(WellKnownType.System_Exception));
151
F
.Block(ImmutableArray<LocalSymbol>.Empty,
153
F
.HiddenSequencePoint(),
158
F
.CatchBlocks(GenerateExceptionHandling(exceptionLocal, rootScopeHoistedLocals)))
162
bodyBuilder.Add(
F
.Label(_exprReturnLabel));
165
var stateDone =
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.Literal(StateMachineState.FinishedState));
174
bodyBuilder.Add(
F
.SequencePointWithSpan(block, block.CloseBraceToken.Span, stateDone));
175
bodyBuilder.Add(
F
.HiddenSequencePoint());
184
bodyBuilder.Add(
F
.Label(_exitLabel));
185
bodyBuilder.Add(
F
.Return());
195
F
.SequencePoint(
197
F
.Block(
208
newBody =
F
.Block(
211
F
.Try(
F
.Block(newBody), ImmutableArray<BoundCatchBlock>.Empty,
F
.Block(instrumentation.Epilogue)));
214
F
.CloseMethod(newBody);
218
=>
F
.Try(tryBlock, catchBlocks);
223
return
F
.ExpressionStatement(
224
F
.Call(
225
F
.Field(
F
.This(), _asyncMethodBuilderField),
227
_method.IsAsyncEffectivelyReturningGenericTask(
F
.Compilation)
228
? ImmutableArray.Create<BoundExpression>(
F
.Local(_exprRetValue))
247
F
.ExpressionStatement(
F
.AssignmentExpression(
F
.Field(
F
.This(), stateField),
F
.Literal(StateMachineState.FinishedState)));
253
F
.Syntax,
255
F
.Local(exceptionLocal),
259
body:
F
.Block(
275
var useSiteInfo = new CompoundUseSiteInfo<AssemblySymbol>(
F
.Diagnostics,
F
.Compilation.Assembly);
277
F
.Diagnostics.Add(hoistedLocal.Locations.FirstOrNone(), useSiteInfo);
283
builder.Add(
F
.Assignment(
F
.Field(
F
.This(), hoistedLocal),
F
.NullOrDefault(hoistedLocal.Type)));
286
return
F
.Block(builder.ToImmutableAndFree());
294
return
F
.ExpressionStatement(
295
F
.Call(
296
F
.Field(
F
.This(), _asyncMethodBuilderField),
298
F
.Local(exceptionLocal)));
303
return
F
.Goto(_exitLabel);
327
return (expr != null) ? node.Update(expr) : (BoundStatement)
F
.StatementList();
370
var awaiterTemp =
F
.SynthesizedLocal(getAwaiter.Type, syntax: node.Syntax, kind: SynthesizedLocalKind.Awaiter);
371
var awaitIfIncomplete =
F
.Block(
373
F
.Assignment(
374
F
.Local(awaiterTemp),
378
F
.HiddenSequencePoint(),
381
F
.If(
382
condition:
F
.Not(GenerateGetIsCompleted(awaiterTemp, isCompletedMethod)),
385
F
.Local(awaiterTemp),
392
F
.Assignment(resultPlace, getResultCall) :
393
F
.ExpressionStatement(getResultCall);
395
return
F
.Block(
418
?
F
.StaticCall(methodSymbol.ContainingType, methodSymbol, receiver)
419
:
F
.Call(receiver, methodSymbol);
441
F
.Local(awaiterTemp),
447
resultType:
F
.SpecialType(SpecialType.System_Boolean)).ToExpression();
450
return
F
.Call(
F
.Local(awaiterTemp), getIsCompletedMethod);
458
?
F
.SpecialType(SpecialType.System_Object)
471
F
.NoOp(NoOpStatementFlavor.AwaitYieldPoint));
475
F
.Assignment(
476
F
.Field(
F
.This(), awaiterField),
478
?
F
.Local(awaiterTemp)
479
:
F
.Convert(awaiterFieldType,
F
.Local(awaiterTemp))));
489
F
.Label(resumeLabel));
493
F
.NoOp(NoOpStatementFlavor.AwaitResumePoint));
498
F
.Assignment(
499
F
.Local(awaiterTemp),
501
?
F
.Field(
F
.This(), awaiterField)
502
:
F
.Convert(awaiterTemp.Type,
F
.Field(
F
.This(), awaiterField))));
505
F
.Assignment(
F
.Field(
F
.This(), awaiterField),
F
.NullOrDefault(awaiterField.Type)));
511
return
F
.Block(blockBuilder.ToImmutableAndFree());
531
var criticalNotifyCompletedTemp =
F
.SynthesizedLocal(
532
F
.WellKnownType(WellKnownType.System_Runtime_CompilerServices_ICriticalNotifyCompletion),
535
var notifyCompletionTemp =
F
.SynthesizedLocal(
536
F
.WellKnownType(WellKnownType.System_Runtime_CompilerServices_INotifyCompletion),
539
LocalSymbol thisTemp = (
F
.CurrentType.TypeKind == TypeKind.Class) ?
F
.SynthesizedLocal(
F
.CurrentType) : null;
544
F
.Assignment(
545
F
.Local(criticalNotifyCompletedTemp),
547
F
.As(
F
.Local(awaiterTemp), criticalNotifyCompletedTemp.Type)));
551
blockBuilder.Add(
F
.Assignment(
F
.Local(thisTemp),
F
.This()));
555
F
.If(
556
condition:
F
.ObjectEqual(
F
.Local(criticalNotifyCompletedTemp),
F
.Null(criticalNotifyCompletedTemp.Type)),
558
thenClause:
F
.Block(
560
F
.Assignment(
561
F
.Local(notifyCompletionTemp),
563
F
.Convert(notifyCompletionTemp.Type,
F
.Local(awaiterTemp), Conversion.ExplicitReference)),
564
F
.ExpressionStatement(
565
F
.Call(
566
F
.Field(
F
.This(), _asyncMethodBuilderField),
569
F
.This().Type),
570
F
.Local(notifyCompletionTemp),
F
.This(thisTemp))),
571
F
.Assignment(
572
F
.Local(notifyCompletionTemp),
573
F
.NullOrDefault(notifyCompletionTemp.Type))),
575
elseClauseOpt:
F
.Block(
576
F
.ExpressionStatement(
577
F
.Call(
578
F
.Field(
F
.This(), _asyncMethodBuilderField),
581
F
.This().Type),
582
F
.Local(criticalNotifyCompletedTemp),
F
.This(thisTemp))))));
585
F
.Assignment(
586
F
.Local(criticalNotifyCompletedTemp),
587
F
.NullOrDefault(criticalNotifyCompletedTemp.Type)));
589
return
F
.Block(
600
LocalSymbol thisTemp = (
F
.CurrentType.TypeKind == TypeKind.Class) ?
F
.SynthesizedLocal(
F
.CurrentType) : null;
603
var useUnsafeOnCompleted =
F
.Compilation.Conversions.ClassifyImplicitConversionFromType(
605
F
.Compilation.GetWellKnownType(WellKnownType.System_Runtime_CompilerServices_ICriticalNotifyCompletion),
610
_asyncMethodBuilderMemberCollection.AwaitOnCompleted).Construct(loweredAwaiterType,
F
.This().Type);
613
onCompleted.CheckConstraints(new ConstraintsHelper.CheckConstraintsArgs(
F
.Compilation,
F
.Compilation.Conversions, includeNullability: false,
F
.Syntax.Location, this.Diagnostics));
617
F
.Call(
618
F
.Field(
F
.This(), _asyncMethodBuilderField),
620
F
.Local(awaiterTemp),
F
.This(thisTemp));
624
result =
F
.Sequence(
626
ImmutableArray.Create<BoundExpression>(
F
.AssignmentExpression(
F
.Local(thisTemp),
F
.This())),
630
return
F
.ExpressionStatement(result);
642
Debug.Assert(_method.IsAsyncEffectivelyReturningGenericTask(
F
.Compilation));
643
return
F
.Block(
644
F
.Assignment(
F
.Local(_exprRetValue), (BoundExpression)Visit(node.ExpressionOpt)),
645
F
.Goto(_exprReturnLabel));
648
return
F
.Goto(_exprReturnLabel);
Lowering\IteratorRewriter\IteratorMethodToStateMachineRewriter.cs (109)
96
F
.CurrentFunction = moveNextMethod;
110
newBody =
F
.Block((object)cachedThis == null ?
114
F
.HiddenSequencePoint(),
115
F
.Assignment(
F
.Local(cachedState),
F
.Field(
F
.This(), stateField)),
119
F
.Label(initialLabel),
120
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.Literal(StateMachineState.NotStartedOrRunningState)),
145
var faultBlock =
F
.Block(
F
.ExpressionStatement(
F
.Call(
F
.This(), disposeMethod)));
146
newBody =
F
.Fault((BoundBlock)newBody, faultBlock);
149
newBody =
F
.SequencePoint(body.Syntax, HandleReturn(newBody));
153
newBody =
F
.Block(
156
F
.Try(
F
.Block(newBody), ImmutableArray<BoundCatchBlock>.Empty,
F
.Block(instrumentation.Epilogue)));
159
F
.CloseMethod(newBody);
164
F
.CurrentFunction = disposeMethod;
170
F
.CloseMethod(
F
.Return());
174
var stateLocal =
F
.SynthesizedLocal(stateField.Type);
175
var state =
F
.Local(stateLocal);
177
var disposeBody =
F
.Block(
179
F
.Assignment(
F
.Local(stateLocal),
F
.Field(
F
.This(), stateField)),
181
F
.Return());
183
F
.CloseMethod(disposeBody);
193
return
F
.Block(
195
F
.Return(
F
.Literal(false)));
203
return
F
.Block(
206
F
.Assignment(this.
F
.Local(_methodValue), this.
F
.Literal(true)),
207
F
.Label(_exitLabel),
208
F
.Return(this.
F
.Local(_methodValue)));
263
var breakLabel =
F
.GenerateLabel("break");
266
select
F
.SwitchSection(
269
F
.Goto(breakLabel));
271
body =
F
.Block(
272
F
.Switch(state, sections.ToImmutableArray()),
273
F
.Label(breakLabel));
278
var tryBlock = body != null ?
F
.Block(body) :
F
.Block();
279
body =
F
.Try(
282
F
.Block(
F
.ExpressionStatement(
F
.Call(
F
.This(), frame.handler))));
291
BoundLiteral result = this.
F
.Literal(!finished);
295
return
F
.Return(result);
301
_exitLabel = this.
F
.GenerateLabel("exitLabel");
302
_methodValue =
F
.SynthesizedLocal(result.Type);
305
var gotoExit =
F
.Goto(_exitLabel);
313
return this.
F
.Block(
314
F
.Assignment(this.
F
.Local(_methodValue), result),
341
return
F
.Block(
342
F
.Assignment(
F
.Field(
F
.This(), _current), rewrittenExpression),
343
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.Literal(stateNumber)),
345
F
.Label(resumeLabel),
346
F
.HiddenSequencePoint(),
347
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.Literal(_currentFinallyFrame.finalizeState)));
355
Debug.Assert(node.Label == proxyLabel || !(
F
.CurrentFunction is IteratorFinallyMethodSymbol), "should not be proxying branches in finally");
394
var origMethod =
F
.CurrentFunction;
397
F
.CurrentFunction = finallyMethod;
409
rewrittenHandler =
F
.Block((object)this.cachedThis != null ?
412
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.Literal(frame.parent.finalizeState)),
415
F
.Return()
418
F
.CloseMethod(rewrittenHandler);
419
F
.CurrentFunction = origMethod;
430
bodyStatements.Add(
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.Literal(frame.finalizeState)));
432
bodyStatements.Add(
F
.ExpressionStatement(
F
.Call(
F
.This(), finallyMethod)));
437
var dropThrough =
F
.GenerateLabel("dropThrough");
438
bodyStatements.Add(
F
.Goto(dropThrough));
447
bodyStatements.Add(
F
.Label(proxy));
450
bodyStatements.Add(
F
.ExpressionStatement(
F
.Call(
F
.This(), finallyMethod)));
454
bodyStatements.Add(
F
.Goto(parentProxy));
457
bodyStatements.Add(
F
.Label(dropThrough));
460
return
F
.Block(bodyStatements.ToImmutableAndFree());
495
var stateMachineType = (IteratorStateMachine)
F
.CurrentType;
498
F
.ModuleBuilderOpt.AddSynthesizedDefinition(stateMachineType, finallyMethod.GetCciAdapter());
Lowering\StateMachineRewriter\MethodToStateMachineRewriter.cs (78)
178
get { return ((SynthesizedContainer)
F
.CurrentType).TypeMap; }
183
get { return
F
.CurrentFunction; }
201
var oldSyntax =
F
.Syntax;
202
F
.Syntax = syntax;
203
var result =
F
.This();
205
F
.Syntax = oldSyntax;
231
resumeLabel =
F
.GenerateLabel("stateMachine");
245
select
F
.SwitchSection(kv.Value.SelectAsArray(state => (int)state),
F
.Goto(kv.Key));
247
var result =
F
.Switch(
F
.Local(cachedState), sections.ToImmutableArray());
260
result =
F
.Block(result, missingStateDispatch);
268
=> _resumableStateAllocator.GenerateThrowMissingStateDispatch(
F
,
F
.Local(cachedState), EncMissingStateMessage);
376
translatedStatement =
F
.Block(
378
F
.Block(variableCleanup.SelectAsArray((e, f) => (BoundStatement)f.ExpressionStatement(e),
F
)));
399
return
F
.Block(new BoundStateMachineScope(
F
.Syntax, hoistedLocals, statement));
428
cleanup.Add(
F
.AssignmentExpression(
F
.Field(
F
.This(), field),
F
.NullOrDefault(field.Type)));
468
return
F
.StateMachineField(type, fieldName, SynthesizedLocalKind.UserDefined, slotIndex);
471
return
F
.StateMachineField(type, GeneratedNames.ReusableHoistedLocalFieldName(slotIndex));
504
if (
F
.Compilation.Options.OptimizationLevel == OptimizationLevel.Debug)
525
var sacrificialTemp =
F
.SynthesizedLocal(type, refKind: RefKind.Ref);
527
return
F
.Sequence(ImmutableArray.Create(sacrificialTemp), sideEffects.ToImmutableAndFree(),
F
.AssignmentExpression(
F
.Local(sacrificialTemp), replacement, isRef: true));
538
return
F
.Sequence(ImmutableArray<LocalSymbol>.Empty, sideEffects.ToImmutableAndFree(), last);
590
return
F
.Field(receiver, field.FieldSymbol);
609
F
.Diagnostics.Add(ErrorCode.ERR_RefReturningCallAndAwait,
F
.Syntax.Location, call.Method);
626
F
.Diagnostics.Add(ErrorCode.ERR_RefConditionalAndAwait,
F
.Syntax.Location);
645
if (
F
.Compilation.Options.OptimizationLevel == OptimizationLevel.Debug)
660
F
.ModuleBuilderOpt.Translate(fieldType, awaitSyntaxOpt, Diagnostics.DiagnosticBag),
670
hoistedField =
F
.StateMachineField(expr.Type, fieldName, new LocalSlotDebugInfo(kind, id), slotIndex);
679
var replacement =
F
.Field(
F
.This(), hoistedField);
680
sideEffects.Add(
F
.AssignmentExpression(replacement, expr));
690
var oldSyntax =
F
.Syntax;
691
F
.Syntax = node.Syntax;
693
F
.Syntax = oldSyntax;
709
=>
F
.Field(
F
.This(), instanceIdField);
845
BoundBlock tryBlock =
F
.Block((BoundStatement)this.Visit(node.TryBlock));
849
dispatchLabel =
F
.GenerateLabel("tryDispatch");
851
tryBlock =
F
.Block(
852
F
.HiddenSequencePoint(),
864
BoundBlock finallyBlockOpt = node.FinallyBlockOpt == null ? null :
F
.Block(
865
F
.HiddenSequencePoint(),
866
F
.If(
870
F
.HiddenSequencePoint());
876
result =
F
.Block(
877
F
.HiddenSequencePoint(),
878
F
.Label(dispatchLabel),
892
return
F
.IntLessThan(
F
.Local(cachedState),
F
.Literal(StateMachineState.FirstUnusedState));
901
return
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.AssignmentExpression(
F
.Local(cachedState),
F
.Literal(stateNumber)));
910
var fetchThis = proxy.Replacement(
F
.Syntax, frameType =>
F
.This());
911
return
F
.Assignment(
F
.Local(this.cachedThis), fetchThis);
915
return
F
.StatementList();
923
return
F
.Local(this.cachedThis);
946
return proxy.Replacement(
F
.Syntax, frameType =>
F
.This());
957
return
F
.Local(this.cachedThis);
962
return proxy.Replacement(
F
.Syntax, frameType =>
F
.This());