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