1 write to F
Microsoft.CodeAnalysis.CSharp (1)
Lowering\StateMachineRewriter\MethodToStateMachineRewriter.cs (1)
124
this.
F
= F;
428 references to F
Microsoft.CodeAnalysis.CSharp (428)
Lowering\AsyncRewriter\AsyncIteratorMethodToStateMachineRewriter.cs (60)
84
var iteratorDispatch = _iteratorStateAllocator.GenerateThrowMissingStateDispatch(
F
,
F
.Local(cachedState), HotReloadExceptionCode.CannotResumeSuspendedIteratorMethod);
90
return (asyncDispatch != null) ?
F
.Block(asyncDispatch, iteratorDispatch) : iteratorDispatch;
130
F
.Return(),
131
F
.Label(_exprReturnLabelTrue),
135
return
F
.Block(builder.ToImmutableAndFree());
141
BoundFieldAccess promiseField =
F
.InstanceField(_asyncIteratorInfo.PromiseOfValueOrEndField);
142
return
F
.ExpressionStatement(
F
.Call(promiseField, _asyncIteratorInfo.SetResultMethod,
F
.Literal(result)));
150
return
F
.Assignment(
F
.InstanceField(currentField),
F
.Default(currentField.Type));
157
return
F
.ExpressionStatement(
158
F
.Call(
159
F
.Field(
F
.This(), _asyncMethodBuilderField),
169
var combinedTokens =
F
.Field(
F
.This(), _asyncIteratorInfo.CombinedTokensField);
173
F
.If(
F
.ObjectNotEqual(combinedTokens,
F
.Null(combinedTokensType)),
174
thenClause:
F
.Block(
175
F
.ExpressionStatement(
F
.Call(combinedTokens,
F
.WellKnownMethod(WellKnownMember.System_Threading_CancellationTokenSource__Dispose))),
176
F
.Assignment(combinedTokens,
F
.Null(combinedTokensType)))));
194
builder.Add(
F
.ExpressionStatement(
F
.Call(
195
F
.InstanceField(_asyncIteratorInfo.PromiseOfValueOrEndField),
197
F
.Local(exceptionLocal))));
199
return
F
.Block(builder.ToImmutableAndFree());
205
return
F
.If(
207
F
.InstanceField(_asyncIteratorInfo.DisposeModeField),
209
thenClause:
F
.Goto(_currentDisposalLabel));
218
return
F
.Block(
231
return
F
.IntEqual(
F
.Local(cachedState),
F
.Literal(StateMachineState.NotStartedOrRunningState));
255
return
F
.Block(
256
F
.Label(resumeLabel), // initialStateResumeLabel:
284
F
.Assignment(
F
.InstanceField(_asyncIteratorInfo.CurrentField), rewrittenExpression));
292
F
.Goto(_exprReturnLabelTrue));
296
F
.Label(resumeLabel));
298
blockBuilder.Add(
F
.HiddenSequencePoint());
310
F
.HiddenSequencePoint());
312
return
F
.Block(blockBuilder.ToImmutableAndFree());
324
return
F
.Block(
328
F
.Goto(_currentDisposalLabel));
333
var useSiteInfo = new CompoundUseSiteInfo<AssemblySymbol>(
F
.Diagnostics,
F
.Compilation.Assembly);
336
F
.Diagnostics.Add(field.GetFirstLocationOrNone(), useSiteInfo);
349
return
F
.Assignment(
F
.InstanceField(_asyncIteratorInfo.DisposeModeField),
F
.Literal(value));
371
var finallyEntry =
F
.GenerateLabel("finallyEntry");
382
tryBlock:
F
.Block(node.TryBlock,
F
.Label(finallyEntry)),
Lowering\AsyncRewriter\AsyncMethodToStateMachineRewriter.cs (170)
119
if (slotAllocator == null || !slotAllocator.TryGetPreviousAwaiterSlotIndex(
F
.ModuleBuilderOpt.Translate(awaiterType,
F
.Syntax,
F
.Diagnostics.DiagnosticBag),
F
.Diagnostics.DiagnosticBag, out slotIndex))
125
result =
F
.StateMachineField(awaiterType, fieldName, SynthesizedLocalKind.AwaiterField, slotIndex);
143
F
.CurrentFunction = moveNextMethod;
151
bodyBuilder.Add(
F
.HiddenSequencePoint());
152
bodyBuilder.Add(
F
.Assignment(
F
.Local(cachedState),
F
.Field(
F
.This(), stateField)));
155
var exceptionLocal =
F
.SynthesizedLocal(
F
.WellKnownType(WellKnownType.System_Exception));
158
F
.Block(ImmutableArray<LocalSymbol>.Empty,
160
F
.HiddenSequencePoint(),
165
F
.CatchBlocks(generateExceptionHandling(exceptionLocal, rootScopeHoistedLocals)))
169
bodyBuilder.Add(
F
.Label(_exprReturnLabel));
172
var stateDone =
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.Literal(StateMachineState.FinishedState));
181
bodyBuilder.Add(
F
.SequencePointWithSpan(block, block.CloseBraceToken.Span, stateDone));
182
bodyBuilder.Add(
F
.HiddenSequencePoint());
191
bodyBuilder.Add(
F
.Label(_exitLabel));
192
bodyBuilder.Add(
F
.Return());
202
F
.SequencePoint(
204
F
.Block(
213
newBody =
F
.Instrument(newBody, instrumentation);
215
F
.CloseMethod(newBody);
233
F
.ExpressionStatement(
F
.AssignmentExpression(
F
.Field(
F
.This(), stateField),
F
.Literal(StateMachineState.FinishedState)));
239
F
.Syntax,
241
F
.Local(exceptionLocal),
245
body:
F
.Block(
255
=>
F
.Try(tryBlock, catchBlocks);
260
return
F
.ExpressionStatement(
261
F
.Call(
262
F
.Field(
F
.This(), _asyncMethodBuilderField),
264
_method.IsAsyncEffectivelyReturningGenericTask(
F
.Compilation)
265
? ImmutableArray.Create<BoundExpression>(
F
.Local(_exprRetValue))
277
var useSiteInfo = new CompoundUseSiteInfo<AssemblySymbol>(
F
.Diagnostics,
F
.Compilation.Assembly);
279
F
.Diagnostics.Add(hoistedLocal.GetFirstLocationOrNone(), useSiteInfo);
285
builder.Add(
F
.Assignment(
F
.Field(
F
.This(), hoistedLocal),
F
.NullOrDefault(hoistedLocal.Type)));
288
return
F
.Block(builder.ToImmutableAndFree());
296
return
F
.ExpressionStatement(
297
F
.Call(
298
F
.Field(
F
.This(), _asyncMethodBuilderField),
300
F
.Local(exceptionLocal)));
305
return
F
.Goto(_exitLabel);
329
return (expr != null) ? node.Update(expr) : (BoundStatement)
F
.StatementList();
378
var awaiterTemp =
F
.SynthesizedLocal(getAwaiter.Type, syntax: node.Syntax, kind: SynthesizedLocalKind.Awaiter);
379
var awaitIfIncomplete =
F
.Block(
381
F
.Assignment(
382
F
.Local(awaiterTemp),
386
F
.HiddenSequencePoint(),
389
F
.If(
390
condition:
F
.Not(GenerateGetIsCompleted(awaiterTemp, isCompletedMethod)),
393
F
.Local(awaiterTemp),
400
F
.Assignment(resultPlace, getResultCall) :
401
F
.ExpressionStatement(getResultCall);
411
return
F
.Block([awaiterTemp], statementsBuilder.ToImmutableAndFree());
431
?
F
.StaticCall(methodSymbol.ContainingType, methodSymbol, receiver)
432
:
F
.Call(receiver, methodSymbol);
454
F
.Local(awaiterTemp),
460
resultType:
F
.SpecialType(SpecialType.System_Boolean)).ToExpression();
463
return
F
.Call(
F
.Local(awaiterTemp), getIsCompletedMethod);
472
?
F
.SpecialType(SpecialType.System_Object)
485
F
.NoOp(NoOpStatementFlavor.AwaitYieldPoint));
489
F
.Assignment(
490
F
.Field(
F
.This(), awaiterField),
492
?
F
.Local(awaiterTemp)
493
:
F
.Convert(awaiterFieldType,
F
.Local(awaiterTemp))));
502
if (
F
.Compilation.Options.EnableEditAndContinue)
507
blockBuilder.Add(
F
.Label(dummyResumeLabel));
512
F
.Label(resumeLabel));
516
F
.NoOp(NoOpStatementFlavor.AwaitResumePoint));
521
F
.Assignment(
522
F
.Local(awaiterTemp),
524
?
F
.Field(
F
.This(), awaiterField)
525
:
F
.Convert(awaiterTemp.Type,
F
.Field(
F
.This(), awaiterField))));
528
F
.Assignment(
F
.Field(
F
.This(), awaiterField),
F
.NullOrDefault(awaiterField.Type)));
534
return
F
.Block(blockBuilder.ToImmutableAndFree());
554
var criticalNotifyCompletedTemp =
F
.SynthesizedLocal(
555
F
.WellKnownType(WellKnownType.System_Runtime_CompilerServices_ICriticalNotifyCompletion),
558
var notifyCompletionTemp =
F
.SynthesizedLocal(
559
F
.WellKnownType(WellKnownType.System_Runtime_CompilerServices_INotifyCompletion),
562
LocalSymbol thisTemp = (
F
.CurrentType.TypeKind == TypeKind.Class) ?
F
.SynthesizedLocal(
F
.CurrentType) : null;
567
F
.Assignment(
568
F
.Local(criticalNotifyCompletedTemp),
570
F
.As(
F
.Local(awaiterTemp), criticalNotifyCompletedTemp.Type)));
574
blockBuilder.Add(
F
.Assignment(
F
.Local(thisTemp),
F
.This()));
578
F
.If(
579
condition:
F
.ObjectEqual(
F
.Local(criticalNotifyCompletedTemp),
F
.Null(criticalNotifyCompletedTemp.Type)),
581
thenClause:
F
.Block(
583
F
.Assignment(
584
F
.Local(notifyCompletionTemp),
586
F
.Convert(notifyCompletionTemp.Type,
F
.Local(awaiterTemp), Conversion.ExplicitReference)),
587
F
.ExpressionStatement(
588
F
.Call(
589
F
.Field(
F
.This(), _asyncMethodBuilderField),
592
F
.This().Type),
593
F
.Local(notifyCompletionTemp),
F
.This(thisTemp))),
594
F
.Assignment(
595
F
.Local(notifyCompletionTemp),
596
F
.NullOrDefault(notifyCompletionTemp.Type))),
598
elseClauseOpt:
F
.Block(
599
F
.ExpressionStatement(
600
F
.Call(
601
F
.Field(
F
.This(), _asyncMethodBuilderField),
604
F
.This().Type),
605
F
.Local(criticalNotifyCompletedTemp),
F
.This(thisTemp))))));
608
F
.Assignment(
609
F
.Local(criticalNotifyCompletedTemp),
610
F
.NullOrDefault(criticalNotifyCompletedTemp.Type)));
612
return
F
.Block(
623
LocalSymbol thisTemp = (
F
.CurrentType.TypeKind == TypeKind.Class) ?
F
.SynthesizedLocal(
F
.CurrentType) : null;
626
var useUnsafeOnCompleted =
F
.Compilation.Conversions.ClassifyImplicitConversionFromType(
628
F
.Compilation.GetWellKnownType(WellKnownType.System_Runtime_CompilerServices_ICriticalNotifyCompletion),
633
_asyncMethodBuilderMemberCollection.AwaitOnCompleted).Construct(loweredAwaiterType,
F
.This().Type);
636
onCompleted.CheckConstraints(new ConstraintsHelper.CheckConstraintsArgs(
F
.Compilation,
F
.Compilation.Conversions, includeNullability: false,
F
.Syntax.Location, this.Diagnostics));
640
F
.Call(
641
F
.Field(
F
.This(), _asyncMethodBuilderField),
643
F
.Local(awaiterTemp),
F
.This(thisTemp));
647
result =
F
.Sequence(
649
ImmutableArray.Create<BoundExpression>(
F
.AssignmentExpression(
F
.Local(thisTemp),
F
.This())),
653
return
F
.ExpressionStatement(result);
665
Debug.Assert(_method.IsAsyncEffectivelyReturningGenericTask(
F
.Compilation));
666
return
F
.Block(
667
F
.Assignment(
F
.Local(_exprRetValue), (BoundExpression)Visit(node.ExpressionOpt)),
668
F
.Goto(_exprReturnLabel));
671
return
F
.Goto(_exprReturnLabel);
Lowering\IteratorRewriter\IteratorMethodToStateMachineRewriter.cs (115)
103
F
.CurrentFunction = moveNextMethod;
117
newBody =
F
.Block((object)cachedThis == null ?
121
F
.HiddenSequencePoint(),
122
F
.Assignment(
F
.Local(cachedState),
F
.Field(
F
.This(), stateField)),
126
F
.Label(initialLabel),
127
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.Literal(StateMachineState.NotStartedOrRunningState)),
152
var faultBlock =
F
.Block(
F
.ExpressionStatement(
F
.Call(
F
.This(), disposeMethod)));
153
newBody =
F
.Fault((BoundBlock)newBody, faultBlock);
156
newBody =
F
.Instrument(
F
.SequencePoint(body.Syntax, HandleReturn(newBody)), instrumentation);
158
F
.CloseMethod(newBody);
163
F
.CurrentFunction = disposeMethod;
169
var disposeBody =
F
.Block(
171
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.Literal(StateMachineState.FinishedState)),
172
F
.Return());
174
F
.CloseMethod(disposeBody);
178
var stateLocal =
F
.SynthesizedLocal(stateField.Type);
179
var state =
F
.Local(stateLocal);
181
var disposeBody =
F
.Block(
183
F
.Assignment(
F
.Local(stateLocal),
F
.Field(
F
.This(), stateField)),
186
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.Literal(StateMachineState.FinishedState)),
187
F
.Return());
189
F
.CloseMethod(disposeBody);
199
return
F
.Block(
201
F
.Return(
F
.Literal(false)));
209
return
F
.Block(
212
F
.Assignment(this.
F
.Local(_methodValue), this.
F
.Literal(true)),
213
F
.Label(_exitLabel),
214
F
.Return(this.
F
.Local(_methodValue)));
269
var breakLabel =
F
.GenerateLabel("break");
272
select
F
.SwitchSection(
275
F
.Goto(breakLabel));
277
body =
F
.Block(
278
F
.Switch(state, sections.ToImmutableArray()),
279
F
.Label(breakLabel));
284
var tryBlock = body != null ?
F
.Block(body) :
F
.Block();
285
body =
F
.Try(
288
F
.Block(
F
.ExpressionStatement(
F
.Call(
F
.This(), frame.handler))));
297
BoundLiteral result = this.
F
.Literal(!finished);
301
return
F
.Return(result);
307
_exitLabel = this.
F
.GenerateLabel("exitLabel");
308
_methodValue =
F
.SynthesizedLocal(result.Type);
311
var gotoExit =
F
.Goto(_exitLabel);
319
return this.
F
.Block(
320
F
.Assignment(this.
F
.Local(_methodValue), result),
347
return
F
.Block(
348
F
.Assignment(
F
.Field(
F
.This(), _current), rewrittenExpression),
349
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.Literal(stateNumber)),
351
F
.Label(resumeLabel),
352
F
.HiddenSequencePoint(),
353
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.Literal(_currentFinallyFrame.finalizeState)));
361
Debug.Assert(node.Label == proxyLabel || !(
F
.CurrentFunction is IteratorFinallyMethodSymbol), "should not be proxying branches in finally");
400
var origMethod =
F
.CurrentFunction;
403
F
.CurrentFunction = finallyMethod;
415
rewrittenHandler =
F
.Block((object)this.cachedThis != null ?
418
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.Literal(frame.parent.finalizeState)),
421
F
.Return()
424
F
.CloseMethod(rewrittenHandler);
425
F
.CurrentFunction = origMethod;
436
bodyStatements.Add(
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.Literal(frame.finalizeState)));
438
bodyStatements.Add(
F
.ExpressionStatement(
F
.Call(
F
.This(), finallyMethod)));
443
var dropThrough =
F
.GenerateLabel("dropThrough");
444
bodyStatements.Add(
F
.Goto(dropThrough));
453
bodyStatements.Add(
F
.Label(proxy));
456
bodyStatements.Add(
F
.ExpressionStatement(
F
.Call(
F
.This(), finallyMethod)));
460
bodyStatements.Add(
F
.Goto(parentProxy));
463
bodyStatements.Add(
F
.Label(dropThrough));
466
return
F
.Block(bodyStatements.ToImmutableAndFree());
501
var stateMachineType = (IteratorStateMachine)
F
.CurrentType;
504
F
.ModuleBuilderOpt.AddSynthesizedDefinition(stateMachineType, finallyMethod.GetCciAdapter());
Lowering\StateMachineRewriter\MethodToStateMachineRewriter.cs (83)
183
get { return ((SynthesizedContainer)
F
.CurrentType).TypeMap; }
188
get { return
F
.CurrentFunction; }
206
var oldSyntax =
F
.Syntax;
207
F
.Syntax = syntax;
208
var result =
F
.This();
210
F
.Syntax = oldSyntax;
236
resumeLabel =
F
.GenerateLabel("stateMachine");
250
select
F
.SwitchSection(kv.Value.SelectAsArray(state => (int)state),
F
.Goto(kv.Key));
252
var result =
F
.Switch(
F
.Local(cachedState), sections.ToImmutableArray());
265
result =
F
.Block(result, missingStateDispatch);
273
=> _resumableStateAllocator.GenerateThrowMissingStateDispatch(
F
,
F
.Local(cachedState), EncMissingStateErrorCode);
382
translatedStatement =
F
.Block(
384
F
.Block(variableCleanup.SelectAsArray((e, f) => (BoundStatement)f.ExpressionStatement(e),
F
)));
405
return
F
.Block(new BoundStateMachineScope(
F
.Syntax, hoistedLocals, statement));
436
var useSiteInfo = new CompoundUseSiteInfo<AssemblySymbol>(
F
.Diagnostics,
F
.Compilation.Assembly);
438
F
.Diagnostics.Add(field.GetFirstLocationOrNone(), useSiteInfo);
441
cleanup.Add(
F
.AssignmentExpression(
F
.Field(
F
.This(), field),
F
.NullOrDefault(field.Type)));
455
var result =
F
.Block(variableCleanup.SelectAsArray((e, f) => (BoundStatement)f.ExpressionStatement(e),
F
));
480
createdField =
F
.StateMachineField(type, fieldName, SynthesizedLocalKind.UserDefined, slotIndex);
484
createdField =
F
.StateMachineField(type, GeneratedNames.ReusableHoistedLocalFieldName(slotIndex));
537
if (
F
.Compilation.Options.OptimizationLevel == OptimizationLevel.Debug)
565
var sacrificialTemp =
F
.SynthesizedLocal(type, refKind: RefKind.Ref);
567
return
F
.Sequence(ImmutableArray.Create(sacrificialTemp), sideEffects.ToImmutableAndFree(),
F
.AssignmentExpression(
F
.Local(sacrificialTemp), replacement, isRef: true));
578
return
F
.Sequence(ImmutableArray<LocalSymbol>.Empty, sideEffects.ToImmutableAndFree(), last);
630
return
F
.Field(receiver, field.FieldSymbol);
650
F
.Diagnostics.Add(ErrorCode.ERR_RefReturningCallAndAwait,
F
.Syntax.Location, call.Method);
668
F
.Diagnostics.Add(ErrorCode.ERR_RefConditionalAndAwait,
F
.Syntax.Location);
687
if (
F
.Compilation.Options.OptimizationLevel == OptimizationLevel.Debug)
702
F
.ModuleBuilderOpt.Translate(fieldType, awaitSyntaxOpt, Diagnostics.DiagnosticBag),
712
hoistedField =
F
.StateMachineField(expr.Type, fieldName, new LocalSlotDebugInfo(kind, id), slotIndex);
722
var replacement =
F
.Field(
F
.This(), hoistedField);
723
sideEffects.Add(
F
.AssignmentExpression(replacement, expr));
733
var oldSyntax =
F
.Syntax;
734
F
.Syntax = node.Syntax;
736
F
.Syntax = oldSyntax;
752
=>
F
.Field(
F
.This(), instanceIdField);
889
BoundBlock tryBlock =
F
.Block((BoundStatement)this.Visit(node.TryBlock));
893
dispatchLabel =
F
.GenerateLabel("tryDispatch");
895
tryBlock =
F
.Block(
896
F
.HiddenSequencePoint(),
908
BoundBlock finallyBlockOpt = node.FinallyBlockOpt == null ? null :
F
.Block(
909
F
.HiddenSequencePoint(),
910
F
.If(
914
F
.HiddenSequencePoint());
920
result =
F
.Block(
921
F
.HiddenSequencePoint(),
922
F
.Label(dispatchLabel),
936
return
F
.IntLessThan(
F
.Local(cachedState),
F
.Literal(StateMachineState.FirstUnusedState));
945
return
F
.Assignment(
F
.Field(
F
.This(), stateField),
F
.AssignmentExpression(
F
.Local(cachedState),
F
.Literal(stateNumber)));
954
var fetchThis = proxy.Replacement(
F
.Syntax, static (frameType, F) => F.This(),
F
);
955
return
F
.Assignment(
F
.Local(this.cachedThis), fetchThis);
959
return
F
.StatementList();
967
return
F
.Local(this.cachedThis);
990
return proxy.Replacement(
F
.Syntax, static (frameType, F) => F.This(),
F
);
1001
return
F
.Local(this.cachedThis);
1006
return proxy.Replacement(
F
.Syntax, static (frameType, F) => F.This(),
F
);