Binder\LocalScopeBinder.cs (17)
21private ImmutableArray<LocalSymbol> _locals;
35internal sealed override ImmutableArray<LocalSymbol> Locals
41ImmutableInterlocked.InterlockedCompareExchange(ref _locals, BuildLocals(), default(ImmutableArray<LocalSymbol>));
48protected virtual ImmutableArray<LocalSymbol> BuildLocals()
50return ImmutableArray<LocalSymbol>.Empty;
89private SmallDictionary<string, LocalSymbol> _lazyLocalsMap;
90private SmallDictionary<string, LocalSymbol> LocalsMap
148protected ImmutableArray<LocalSymbol> BuildLocals(SyntaxList<StatementSyntax> statements, Binder enclosingBinder)
164ArrayBuilder<LocalSymbol> locals = ArrayBuilder<LocalSymbol>.GetInstance(DefaultLocalSymbolArrayCapacity);
173internal void BuildLocals(Binder enclosingBinder, StatementSyntax statement, ArrayBuilder<LocalSymbol> locals)
287static void findExpressionVariablesInRankSpecifier(ExpressionSyntax expression, (LocalScopeBinder localScopeBinder, ArrayBuilder<LocalSymbol> locals, Binder localDeclarationBinder) args)
383LocalSymbol result = null;
389foreach (var local in this.Locals)
444LocalSymbol localSymbol;
510declaredInThisScope |= newSymbolKind == SymbolKind.Local && this.Locals.Contains((LocalSymbol)newSymbol);
543LocalSymbol existingLocal = null;
Binder\RefSafetyAnalysis.cs (15)
64private Dictionary<LocalSymbol, (SafeContext RefEscapeScope, SafeContext ValEscapeScope)>? _localEscapeScopes;
93private readonly ImmutableArray<LocalSymbol> _locals;
95public LocalScope(RefSafetyAnalysis analysis, ImmutableArray<LocalSymbol> locals)
100foreach (var local in locals)
108foreach (var local in _locals)
212private (SafeContext RefEscapeScope, SafeContext ValEscapeScope) GetLocalScopes(LocalSymbol local)
221private void SetLocalScopes(LocalSymbol local, SafeContext refEscapeScope, SafeContext valEscapeScope)
476private void AddLocalScopes(LocalSymbol local, SafeContext refEscapeScope, SafeContext valEscapeScope)
503private void AddOrSetLocalScopes(LocalSymbol local, SafeContext refEscapeScope, SafeContext valEscapeScope)
505_localEscapeScopes ??= new Dictionary<LocalSymbol, (SafeContext RefEscapeScope, SafeContext ValEscapeScope)>();
510private void RemoveLocalScopes(LocalSymbol local)
707if (pattern.Variable is LocalSymbol local)
1221using var _ = new LocalScope(this, ImmutableArray<LocalSymbol>.Empty);
1223foreach (var local in node.IterationVariables)
1246foreach (var local in node.IterationVariables)
CodeGen\Optimizer.cs (32)
60out HashSet<LocalSymbol> stackLocals)
65var locals = PooledDictionary<LocalSymbol, LocalDefUseInfo>.GetInstance();
78stackLocals = new HashSet<LocalSymbol>(locals.Keys);
92private static void FilterValidStackLocals(Dictionary<LocalSymbol, LocalDefUseInfo> info)
97foreach (var local in info.Keys.ToArray())
125private static void RemoveIntersectingLocals(Dictionary<LocalSymbol, LocalDefUseInfo> info, ArrayBuilder<LocalDefUseInfo> dummies)
403private readonly Dictionary<LocalSymbol, LocalDefUseInfo> _locals;
417private StackOptimizerPass1(Dictionary<LocalSymbol, LocalDefUseInfo> locals,
432Dictionary<LocalSymbol, LocalDefUseInfo> locals,
618foreach (var local in node.Instrumentation.Locals)
696foreach (var local in locals)
756private bool IsNestedLocalOfCompoundOperator(LocalSymbol local, BoundSequence node)
806private readonly LocalSymbol _local;
809internal LocalUsedWalker(LocalSymbol local, int recursionDepth)
980LocalSymbol localSymbol = assignmentLocal.LocalSymbol;
1436var localSym = ((BoundLocal)boundExpression).LocalSymbol;
1872private void ShouldNotSchedule(LocalSymbol localSymbol)
1881private void RecordVarRef(LocalSymbol local)
1894private void RecordVarRead(LocalSymbol local)
1940private bool EvalStackHasLocal(LocalSymbol local)
1949private void RecordDummyWrite(LocalSymbol local)
1962private void RecordVarWrite(LocalSymbol local)
1992private bool CanScheduleToStack(LocalSymbol local)
1998private void DeclareLocals(ImmutableArray<LocalSymbol> locals, int stack)
2000foreach (var local in locals)
2006private void DeclareLocal(LocalSymbol local, int stack)
2041private readonly Dictionary<LocalSymbol, LocalDefUseInfo> _info;
2043private StackOptimizerPass2(Dictionary<LocalSymbol, LocalDefUseInfo> info)
2048public static BoundStatement Rewrite(BoundStatement src, Dictionary<LocalSymbol, LocalDefUseInfo> info)
2310var sourceLocal = ((BoundLocal)exceptionSource).LocalSymbol;
2368internal override LocalSymbol WithSynthesizedLocalKindAndSyntax(
2415internal override ConstantValue GetConstantValue(SyntaxNode node, LocalSymbol inProgress, BindingDiagnosticBag diagnostics)
Generated\BoundNodes.xml.Generated.cs (122)
273protected BoundEqualsValue(BoundKind kind, SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression value, bool hasErrors = false)
284public ImmutableArray<LocalSymbol> Locals { get; }
290public BoundFieldEqualsValue(SyntaxNode syntax, FieldSymbol field, ImmutableArray<LocalSymbol> locals, BoundExpression value, bool hasErrors = false)
306public BoundFieldEqualsValue Update(FieldSymbol field, ImmutableArray<LocalSymbol> locals, BoundExpression value)
320public BoundPropertyEqualsValue(SyntaxNode syntax, PropertySymbol property, ImmutableArray<LocalSymbol> locals, BoundExpression value, bool hasErrors = false)
336public BoundPropertyEqualsValue Update(PropertySymbol property, ImmutableArray<LocalSymbol> locals, BoundExpression value)
350public BoundParameterEqualsValue(SyntaxNode syntax, ParameterSymbol parameter, ImmutableArray<LocalSymbol> locals, BoundExpression value, bool hasErrors = false)
366public BoundParameterEqualsValue Update(ParameterSymbol parameter, ImmutableArray<LocalSymbol> locals, BoundExpression value)
2259public BoundBlockInstrumentation(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundStatement? prologue, BoundStatement? epilogue, bool hasErrors = false)
2270public ImmutableArray<LocalSymbol> Locals { get; }
2277public BoundBlockInstrumentation Update(ImmutableArray<LocalSymbol> locals, BoundStatement? prologue, BoundStatement? epilogue)
2335public BoundLocalId(SyntaxNode syntax, LocalSymbol local, FieldSymbol? hoistedField, TypeSymbol type, bool hasErrors)
2346public BoundLocalId(SyntaxNode syntax, LocalSymbol local, FieldSymbol? hoistedField, TypeSymbol type)
2358public LocalSymbol Local { get; }
2364public BoundLocalId Update(LocalSymbol local, FieldSymbol? hoistedField, TypeSymbol type)
3304public BoundBlock(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, ImmutableArray<MethodSymbol> localFunctions, bool hasUnsafeModifier, BoundBlockInstrumentation? instrumentation, ImmutableArray<BoundStatement> statements, bool hasErrors = false)
3318public ImmutableArray<LocalSymbol> Locals { get; }
3326public BoundBlock Update(ImmutableArray<LocalSymbol> locals, ImmutableArray<MethodSymbol> localFunctions, bool hasUnsafeModifier, BoundBlockInstrumentation? instrumentation, ImmutableArray<BoundStatement> statements)
3340public BoundScope(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundStatement> statements, bool hasErrors = false)
3350public ImmutableArray<LocalSymbol> Locals { get; }
3355public BoundScope Update(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundStatement> statements)
3400public BoundLocalDeclaration(SyntaxNode syntax, LocalSymbol localSymbol, BoundTypeExpression? declaredTypeOpt, BoundExpression? initializerOpt, ImmutableArray<BoundExpression> argumentsOpt, bool inferredType, bool hasErrors = false)
3413public LocalSymbol LocalSymbol { get; }
3422public BoundLocalDeclaration Update(LocalSymbol localSymbol, BoundTypeExpression? declaredTypeOpt, BoundExpression? initializerOpt, ImmutableArray<BoundExpression> argumentsOpt, bool inferredType)
3770public BoundSwitchStatement(SyntaxNode syntax, BoundExpression expression, ImmutableArray<LocalSymbol> innerLocals, ImmutableArray<MethodSymbol> innerLocalFunctions, ImmutableArray<BoundSwitchSection> switchSections, BoundDecisionDag reachabilityDecisionDag, BoundSwitchLabel? defaultLabel, LabelSymbol breakLabel, bool hasErrors = false)
3791public ImmutableArray<LocalSymbol> InnerLocals { get; }
3801public BoundSwitchStatement Update(BoundExpression expression, ImmutableArray<LocalSymbol> innerLocals, ImmutableArray<MethodSymbol> innerLocalFunctions, ImmutableArray<BoundSwitchSection> switchSections, BoundDecisionDag reachabilityDecisionDag, BoundSwitchLabel? defaultLabel, LabelSymbol breakLabel)
3912protected BoundConditionalLoopStatement(BoundKind kind, SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3927public ImmutableArray<LocalSymbol> Locals { get; }
3934public BoundDoStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3950public BoundDoStatement Update(ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
3964public BoundWhileStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3980public BoundWhileStatement Update(ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
3994public BoundForStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> outerLocals, BoundStatement? initializer, ImmutableArray<LocalSymbol> innerLocals, BoundExpression? condition, BoundStatement? increment, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
4012public ImmutableArray<LocalSymbol> OuterLocals { get; }
4014public ImmutableArray<LocalSymbol> InnerLocals { get; }
4022public BoundForStatement Update(ImmutableArray<LocalSymbol> outerLocals, BoundStatement? initializer, ImmutableArray<LocalSymbol> innerLocals, BoundExpression? condition, BoundStatement? increment, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4036public BoundForEachStatement(SyntaxNode syntax, ForEachEnumeratorInfo? enumeratorInfoOpt, BoundValuePlaceholder? elementPlaceholder, BoundExpression? elementConversion, BoundTypeExpression iterationVariableType, ImmutableArray<LocalSymbol> iterationVariables, BoundExpression? iterationErrorExpressionOpt, BoundExpression expression, BoundForEachDeconstructStep? deconstructionOpt, BoundAwaitableInfo? awaitOpt, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
4063public ImmutableArray<LocalSymbol> IterationVariables { get; }
4073public BoundForEachStatement Update(ForEachEnumeratorInfo? enumeratorInfoOpt, BoundValuePlaceholder? elementPlaceholder, BoundExpression? elementConversion, BoundTypeExpression iterationVariableType, ImmutableArray<LocalSymbol> iterationVariables, BoundExpression? iterationErrorExpressionOpt, BoundExpression expression, BoundForEachDeconstructStep? deconstructionOpt, BoundAwaitableInfo? awaitOpt, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4118public BoundUsingStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundMultipleLocalDeclarations? declarationsOpt, BoundExpression? expressionOpt, BoundStatement body, BoundAwaitableInfo? awaitOpt, MethodArgumentInfo? patternDisposeInfoOpt, bool hasErrors = false)
4133public ImmutableArray<LocalSymbol> Locals { get; }
4143public BoundUsingStatement Update(ImmutableArray<LocalSymbol> locals, BoundMultipleLocalDeclarations? declarationsOpt, BoundExpression? expressionOpt, BoundStatement body, BoundAwaitableInfo? awaitOpt, MethodArgumentInfo? patternDisposeInfoOpt)
4157public BoundFixedStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundMultipleLocalDeclarations declarations, BoundStatement body, bool hasErrors = false)
4170public ImmutableArray<LocalSymbol> Locals { get; }
4177public BoundFixedStatement Update(ImmutableArray<LocalSymbol> locals, BoundMultipleLocalDeclarations declarations, BoundStatement body)
4259public BoundCatchBlock(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression? exceptionSourceOpt, TypeSymbol? exceptionTypeOpt, BoundStatementList? exceptionFilterPrologueOpt, BoundExpression? exceptionFilterOpt, BoundBlock body, bool isSynthesizedAsyncCatchAll, bool hasErrors = false)
4275public ImmutableArray<LocalSymbol> Locals { get; }
4286public BoundCatchBlock Update(ImmutableArray<LocalSymbol> locals, BoundExpression? exceptionSourceOpt, TypeSymbol? exceptionTypeOpt, BoundStatementList? exceptionFilterPrologueOpt, BoundExpression? exceptionFilterOpt, BoundBlock body, bool isSynthesizedAsyncCatchAll)
4505public BoundLocal(SyntaxNode syntax, LocalSymbol localSymbol, BoundLocalDeclarationKind declarationKind, ConstantValue? constantValueOpt, bool isNullableUnknown, TypeSymbol type, bool hasErrors)
4518public BoundLocal(SyntaxNode syntax, LocalSymbol localSymbol, BoundLocalDeclarationKind declarationKind, ConstantValue? constantValueOpt, bool isNullableUnknown, TypeSymbol type)
4532public LocalSymbol LocalSymbol { get; }
4540public BoundLocal Update(LocalSymbol localSymbol, BoundLocalDeclarationKind declarationKind, ConstantValue? constantValueOpt, bool isNullableUnknown, TypeSymbol type)
4554public BoundPseudoVariable(SyntaxNode syntax, LocalSymbol localSymbol, PseudoVariableExpressions emitExpressions, TypeSymbol type, bool hasErrors)
4566public BoundPseudoVariable(SyntaxNode syntax, LocalSymbol localSymbol, PseudoVariableExpressions emitExpressions, TypeSymbol type)
4579public LocalSymbol LocalSymbol { get; }
4585public BoundPseudoVariable Update(LocalSymbol localSymbol, PseudoVariableExpressions emitExpressions, TypeSymbol type)
4903public BoundSwitchExpressionArm(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundPattern pattern, BoundExpression? whenClause, BoundExpression value, LabelSymbol label, bool hasErrors = false)
4919public ImmutableArray<LocalSymbol> Locals { get; }
4928public BoundSwitchExpressionArm Update(ImmutableArray<LocalSymbol> locals, BoundPattern pattern, BoundExpression? whenClause, BoundExpression value, LabelSymbol label)
5658public BoundSwitchSection(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundSwitchLabel> switchLabels, ImmutableArray<BoundStatement> statements, bool hasErrors = false)
5670public ImmutableArray<LocalSymbol> Locals { get; }
5676public BoundSwitchSection Update(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundSwitchLabel> switchLabels, ImmutableArray<BoundStatement> statements)
5765public BoundSequence(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundExpression> sideEffects, BoundExpression value, TypeSymbol type, bool hasErrors = false)
5780public ImmutableArray<LocalSymbol> Locals { get; }
5787public BoundSequence Update(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundExpression> sideEffects, BoundExpression value, TypeSymbol type)
5801public BoundSpillSequence(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundStatement> sideEffects, BoundExpression value, TypeSymbol type, bool hasErrors = false)
5816public ImmutableArray<LocalSymbol> Locals { get; }
5823public BoundSpillSequence Update(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundStatement> sideEffects, BoundExpression value, TypeSymbol type)
8766public BoundConstructorMethodBody(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundStatement? initializer, BoundBlock? blockBody, BoundBlock? expressionBody, bool hasErrors = false)
8776public ImmutableArray<LocalSymbol> Locals { get; }
8782public BoundConstructorMethodBody Update(ImmutableArray<LocalSymbol> locals, BoundStatement? initializer, BoundBlock? blockBody, BoundBlock? expressionBody)
10840ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
10847ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
10854ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
11205ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
11218LocalSymbol local = this.VisitLocalSymbol(node.Local);
11366ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
11374ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
11386LocalSymbol localSymbol = this.VisitLocalSymbol(node.LocalSymbol);
11444ImmutableArray<LocalSymbol> innerLocals = this.VisitLocals(node.InnerLocals);
11468ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
11477ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
11486ImmutableArray<LocalSymbol> outerLocals = this.VisitLocals(node.OuterLocals);
11487ImmutableArray<LocalSymbol> innerLocals = this.VisitLocals(node.InnerLocals);
11498ImmutableArray<LocalSymbol> iterationVariables = this.VisitLocals(node.IterationVariables);
11519ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
11528ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
11549ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
11589LocalSymbol localSymbol = this.VisitLocalSymbol(node.LocalSymbol);
11595LocalSymbol localSymbol = this.VisitLocalSymbol(node.LocalSymbol);
11649ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
11795ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
11815ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
11823ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
12382ImmutableArray<LocalSymbol> locals = this.VisitLocals(node.Locals);
12420ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
12428ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
12436ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
13166ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
13191LocalSymbol local = GetUpdatedSymbol(node, node.Local);
13528ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
13537ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
13551LocalSymbol localSymbol = GetUpdatedSymbol(node, node.LocalSymbol);
13568ImmutableArray<LocalSymbol> innerLocals = GetUpdatedArray(node, node.InnerLocals);
13579ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
13587ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
13595ImmutableArray<LocalSymbol> outerLocals = GetUpdatedArray(node, node.OuterLocals);
13596ImmutableArray<LocalSymbol> innerLocals = GetUpdatedArray(node, node.InnerLocals);
13606ImmutableArray<LocalSymbol> iterationVariables = GetUpdatedArray(node, node.IterationVariables);
13620ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
13630ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
13638ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
13721LocalSymbol localSymbol = GetUpdatedSymbol(node, node.LocalSymbol);
13738LocalSymbol localSymbol = GetUpdatedSymbol(node, node.LocalSymbol);
13802ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
13900ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
13925ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
13944ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
15089ImmutableArray<LocalSymbol> locals = GetUpdatedArray(node, node.Locals);
Lowering\AsyncRewriter\AsyncRewriter.AsyncIteratorRewriter.cs (6)
200protected override void InitializeStateMachine(ArrayBuilder<BoundStatement> bodyBuilder, NamedTypeSymbol frameType, LocalSymbol stateMachineLocal)
263protected override BoundStatement GenerateStateMachineCreation(LocalSymbol stateMachineVariable, NamedTypeSymbol frameType, IReadOnlyDictionary<Symbol, CapturedSymbolReplacement> proxies)
325out LocalSymbol instSymbol,
337var versionSymbol = F.SynthesizedLocal(F.SpecialType(SpecialType.System_Int16));
368private void GetPartsForStartingMachine(out BoundExpressionStatement callReset, out LocalSymbol instSymbol, out BoundStatement instAssignment,
435out LocalSymbol instSymbol,
Lowering\ClosureConversion\ClosureConversion.cs (28)
97private readonly HashSet<LocalSymbol> _assignLocals;
133private ArrayBuilder<LocalSymbol> _addedLocals;
173HashSet<LocalSymbol> assignLocals)
207Debug.Assert(localOrParameter is LocalSymbol || localOrParameter is ParameterSymbol ||
244HashSet<LocalSymbol> assignLocals)
636var localFrame = (LocalSymbol)framePointer;
664private BoundNode IntroduceFrame(BoundNode node, Analysis.ClosureEnvironment env, Func<ArrayBuilder<BoundExpression>, ArrayBuilder<LocalSymbol>, BoundNode> F)
671LocalSymbol framePointer = new SynthesizedLocal(_topLevelMethod, TypeWithAnnotations.Create(frameType), SynthesizedLocalKind.LambdaDisplayClass, frame.ScopeSyntaxOpt);
726var addedLocals = ArrayBuilder<LocalSymbol>.GetInstance();
749private void InitVariableProxy(SyntaxNode syntax, Symbol symbol, LocalSymbol framePointer, ArrayBuilder<BoundExpression> prologue)
769var local = (LocalSymbol)symbol;
775LocalSymbol localToUse;
1128locals: ImmutableArray<LocalSymbol>.Empty,
1139private BoundSequence RewriteSequence(BoundSequence node, ArrayBuilder<BoundExpression> prologue, ArrayBuilder<LocalSymbol> newLocals)
1160return IntroduceFrame(node, frame, (ArrayBuilder<BoundExpression> prologue, ArrayBuilder<LocalSymbol> newLocals) =>
1165return RewriteBlock(node, ArrayBuilder<BoundExpression>.GetInstance(), ArrayBuilder<LocalSymbol>.GetInstance());
1169private BoundBlock RewriteBlock(BoundBlock node, ArrayBuilder<BoundExpression> prologue, ArrayBuilder<LocalSymbol> newLocals)
1222return IntroduceFrame(node, frame, (ArrayBuilder<BoundExpression> prologue, ArrayBuilder<LocalSymbol> newLocals) =>
1229return RewriteCatch(node, ArrayBuilder<BoundExpression>.GetInstance(), ArrayBuilder<LocalSymbol>.GetInstance());
1233private BoundNode RewriteCatch(BoundCatchBlock node, ArrayBuilder<BoundExpression> prologue, ArrayBuilder<LocalSymbol> newLocals)
1251ImmutableArray.Create<LocalSymbol>(),
1296return IntroduceFrame(node, frame, (ArrayBuilder<BoundExpression> prologue, ArrayBuilder<LocalSymbol> newLocals) =>
1303return RewriteSequence(node, ArrayBuilder<BoundExpression>.GetInstance(), ArrayBuilder<LocalSymbol>.GetInstance());
1313return IntroduceFrame(node, frame, (ArrayBuilder<BoundExpression> prologue, ArrayBuilder<LocalSymbol> newLocals) =>
1722var cacheLocal = F.SynthesizedLocal(type, kind: SynthesizedLocalKind.CachedAnonymousMethodDelegate);
1723if (_addedLocals == null) _addedLocals = ArrayBuilder<LocalSymbol>.GetInstance();
Lowering\LocalRewriter\LocalRewriter_BinaryOperator.cs (10)
870locals: ImmutableArray<LocalSymbol>.Empty,
1116locals: ImmutableArray.Create<LocalSymbol>(boundTempX.LocalSymbol, boundTempY.LocalSymbol),
1305locals: ImmutableArray.Create<LocalSymbol>(boundTempX.LocalSymbol, boundTempY.LocalSymbol),
1414locals: ImmutableArray<LocalSymbol>.Empty,
1458var locals = ArrayBuilder<LocalSymbol>.GetInstance();
1507ArrayBuilder<LocalSymbol> locals,
1752locals: ImmutableArray.Create<LocalSymbol>(boundTemp.LocalSymbol),
1813locals: ImmutableArray.Create<LocalSymbol>(boundTempX.LocalSymbol, boundTempY.LocalSymbol),
1901locals: ImmutableArray.Create<LocalSymbol>(boundTempX.LocalSymbol, boundTempY.LocalSymbol),
1982locals: ImmutableArray<LocalSymbol>.Empty,
Lowering\LocalRewriter\LocalRewriter_Call.cs (17)
141ref ArrayBuilder<LocalSymbol> temps,
394ArrayBuilder<LocalSymbol>? temps = null;
463ImmutableArray<LocalSymbol> temps)
669ref ArrayBuilder<LocalSymbol>? tempsOpt,
733tempsOpt ??= ArrayBuilder<LocalSymbol>.GetInstance();
825ImmutableArray<LocalSymbol>.Empty,
833void ensureTempTrackingSetup([NotNull] ref ArrayBuilder<LocalSymbol>? tempsOpt, ref BitVector positionsAssignedToTemp)
835tempsOpt ??= ArrayBuilder<LocalSymbol>.GetInstance();
848ref ArrayBuilder<LocalSymbol>? tempsOpt,
903visitedArgumentsBuilder[argIndex] = _factory.Sequence(ImmutableArray<LocalSymbol>.Empty, ImmutableArray.Create<BoundExpression>(store), local);
991private void ReferToTempIfReferenceTypeReceiver(BoundLocal receiverTemp, ref BoundAssignmentOperator assignmentToTemp, out BoundAssignmentOperator? extraRefInitialization, ArrayBuilder<LocalSymbol> temps)
1064[NotNull] ref ArrayBuilder<LocalSymbol>? temps,
1076temps ??= ArrayBuilder<LocalSymbol>.GetInstance();
1530ArrayBuilder<LocalSymbol> temporariesBuilder)
1654ImmutableArray<LocalSymbol>.Empty,
1678ArrayBuilder<LocalSymbol> temporariesBuilder)
1718locals: ImmutableArray<LocalSymbol>.Empty,
Lowering\LocalRewriter\LocalRewriter_CompoundAssignmentOperator.cs (13)
85var temps = ArrayBuilder<LocalSymbol>.GetInstance();
118var eventTemps = ArrayBuilder<LocalSymbol>.GetInstance();
261private BoundExpression? TransformPropertyOrEventReceiver(Symbol propertyOrEvent, BoundExpression? receiverOpt, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
351private BoundDynamicMemberAccess TransformDynamicMemberAccess(BoundDynamicMemberAccess memberAccess, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
368private BoundIndexerAccess TransformIndexerAccess(BoundIndexerAccess indexerAccess, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
440ArrayBuilder<LocalSymbol> temps)
478ArrayBuilder<LocalSymbol> temps)
540ArrayBuilder<LocalSymbol> temps,
554private BoundExpression TransformIndexPatternIndexerAccess(BoundImplicitIndexerAccess implicitIndexerAccess, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps, bool isDynamicAssignment)
590private bool TransformCompoundAssignmentFieldOrEventAccessReceiver(Symbol fieldOrEvent, ref BoundExpression? receiver, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
633private BoundDynamicIndexerAccess TransformDynamicIndexerAccess(BoundDynamicIndexerAccess indexerAccess, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps)
692private BoundExpression TransformCompoundAssignmentLHS(BoundExpression originalLHS, ArrayBuilder<BoundExpression> stores, ArrayBuilder<LocalSymbol> temps, bool isDynamicAssignment)
911ArrayBuilder<LocalSymbol> temps)
Lowering\LocalRewriter\LocalRewriter_ForEachStatement.cs (27)
142ImmutableArray<LocalSymbol> iterationVariables,
158LocalSymbol enumeratorVar = _factory.SynthesizedLocal(enumeratorType, syntax: forEachSyntax, kind: SynthesizedLocalKind.ForEachEnumerator);
260tryBlock: new BoundBlock(forEachSyntax, locals: ImmutableArray<LocalSymbol>.Empty, statements: ImmutableArray.Create(whileLoop)),
411locals: ImmutableArray<LocalSymbol>.Empty,
424LocalSymbol disposableVar = _factory.SynthesizedLocal(idisposableTypeSymbol);
590ImmutableArray<LocalSymbol> iterationVariables,
605LocalSymbol? preambleLocal = null;
610LocalSymbol collectionTemp = _factory.SynthesizedLocal(collectionType, forEachSyntax, kind: SynthesizedLocalKind.ForEachArray, refKind: collectionTempRefKind);
626LocalSymbol positionVar = _factory.SynthesizedLocal(intType, syntax: forEachSyntax, kind: SynthesizedLocalKind.ForEachArrayIndex);
680outerLocals: preambleLocal is null ? ImmutableArray.Create<LocalSymbol>(collectionTemp, positionVar) : ImmutableArray.Create<LocalSymbol>(preambleLocal, collectionTemp, positionVar),
694private delegate BoundStatement? GetForEachStatementAsForPreamble(LocalRewriter rewriter, SyntaxNode syntax, ForEachEnumeratorInfo enumeratorInfo, ref BoundExpression rewrittenExpression, out LocalSymbol? preambleLocal, out RefKind collectionTempRefKind);
733return static (LocalRewriter rewriter, SyntaxNode syntax, ForEachEnumeratorInfo enumeratorInfo, ref BoundExpression rewrittenExpression, out LocalSymbol? preambleLocal, out RefKind collectionTempRefKind) =>
799ImmutableArray<LocalSymbol> iterationVariables,
825ImmutableArray<LocalSymbol> iterationVariables,
886ImmutableArray<LocalSymbol> iterationVariables,
904LocalSymbol arrayVar = _factory.SynthesizedLocal(arrayType, syntax: forEachSyntax, kind: SynthesizedLocalKind.ForEachArray);
915LocalSymbol positionVar = _factory.SynthesizedLocal(intType, syntax: forEachSyntax, kind: SynthesizedLocalKind.ForEachArrayIndex);
976outerLocals: ImmutableArray.Create<LocalSymbol>(arrayVar, positionVar),
1035ImmutableArray<LocalSymbol> iterationVariables,
1060LocalSymbol arrayVar = _factory.SynthesizedLocal(arrayType, syntax: forEachSyntax, kind: SynthesizedLocalKind.ForEachArray);
1074LocalSymbol[] upperVar = new LocalSymbol[rank];
1096LocalSymbol[] positionVar = new LocalSymbol[rank];
1219private static BoundLocal MakeBoundLocal(CSharpSyntaxNode syntax, LocalSymbol local, TypeSymbol type)
1227private BoundStatement MakeLocalDeclaration(CSharpSyntaxNode syntax, LocalSymbol local, BoundExpression rewrittenInitialValue)
Lowering\LocalRewriter\LocalRewriter_IndexerAccess.cs (8)
161ArrayBuilder<LocalSymbol>? temps = null;
290var localsBuilder = ArrayBuilder<LocalSymbol>.GetInstance();
495var locals = ArrayBuilder<LocalSymbol>.GetInstance(2);
516ArrayBuilder<LocalSymbol> locals)
798var localsBuilder = ArrayBuilder<LocalSymbol>.GetInstance();
809private BoundExpression VisitRangePatternIndexerAccess(BoundImplicitIndexerAccess node, ArrayBuilder<LocalSymbol> localsBuilder, ArrayBuilder<BoundExpression> sideEffectsBuilder, bool cacheAllArgumentsOnly)
1036private BoundExpression MakeRangeSize(ref BoundExpression startExpr, BoundExpression endExpr, ArrayBuilder<LocalSymbol> localsBuilder, ArrayBuilder<BoundExpression> sideEffectsBuilder)
1067private void DeconstructRange(BoundExpression rewrittenRangeArg, BoundExpression lengthAccess, ArrayBuilder<LocalSymbol> localsBuilder, ArrayBuilder<BoundExpression> sideEffectsBuilder, out BoundExpression startExpr, out BoundExpression rangeSizeExpr)
Lowering\LocalRewriter\LocalRewriter_ObjectOrCollectionInitializerExpression.cs (14)
33ref ArrayBuilder<LocalSymbol>? temps,
214ArrayBuilder<LocalSymbol>? temps = null;
245private BoundExpression VisitObjectInitializerMember(BoundObjectInitializerMember node, ref BoundExpression rewrittenReceiver, ArrayBuilder<BoundExpression> sideEffects, ref ArrayBuilder<LocalSymbol>? temps)
253ArrayBuilder<LocalSymbol>? constructionTemps = null;
284ref ArrayBuilder<LocalSymbol>? temps,
304ref ArrayBuilder<LocalSymbol>? temps,
457temps ??= ArrayBuilder<LocalSymbol>.GetInstance();
493temps = ArrayBuilder<LocalSymbol>.GetInstance();
515temps ??= ArrayBuilder<LocalSymbol>.GetInstance();
624ref ArrayBuilder<LocalSymbol>? temps)
638(LocalRewriter rewriter, ArrayBuilder<BoundExpression> sideeffects, ArrayBuilder<LocalSymbol>? temps) elementArg = (rewriter: this, sideeffects, temps);
641static (BoundExpression element, ref (LocalRewriter rewriter, ArrayBuilder<BoundExpression> sideeffects, ArrayBuilder<LocalSymbol>? temps) elementArg) =>
670private BoundExpression EvaluateSideEffects(BoundExpression arg, RefKind refKind, ArrayBuilder<BoundExpression> sideeffects, ref ArrayBuilder<LocalSymbol>? temps)
679temps = ArrayBuilder<LocalSymbol>.GetInstance();
Lowering\LocalRewriter\LocalRewriter_TupleBinaryOperator.cs (14)
32var temps = ArrayBuilder<LocalSymbol>.GetInstance();
101ArrayBuilder<LocalSymbol> temps)
142ArrayBuilder<LocalSymbol> temps)
183ArrayBuilder<LocalSymbol> temps,
247ArrayBuilder<LocalSymbol> temps, BinaryOperatorKind operatorKind)
267TypeSymbol boolType, ArrayBuilder<LocalSymbol> temps, BinaryOperatorKind operatorKind)
308BoundExpression innerSequence = _factory.Sequence(locals: ImmutableArray<LocalSymbol>.Empty, innerEffects.ToImmutableAndFree(), logicalExpression);
322return _factory.Sequence(ImmutableArray<LocalSymbol>.Empty, outerEffects.ToImmutableAndFree(),
330return _factory.Sequence(ImmutableArray<LocalSymbol>.Empty, outerEffects.ToImmutableAndFree(),
339_factory.Sequence(ImmutableArray<LocalSymbol>.Empty, outerEffects.ToImmutableAndFree(),
353private void MakeNullableParts(BoundExpression expr, ArrayBuilder<LocalSymbol> temps, ArrayBuilder<BoundExpression> innerEffects,
416private BoundLocal MakeTemp(BoundExpression loweredExpression, ArrayBuilder<LocalSymbol> temps, ArrayBuilder<BoundExpression> effects)
429ArrayBuilder<LocalSymbol> temps,
486ArrayBuilder<LocalSymbol> temps, BinaryOperatorKind operatorKind)
Lowering\SpillSequenceSpiller.cs (37)
22private readonly PooledDictionary<LocalSymbol, LocalSymbol> _tempSubstitution;
23private readonly PooledDictionary<LocalSymbol, BoundComplexConditionalReceiver> _receiverSubstitution;
27PooledDictionary<LocalSymbol, LocalSymbol> tempSubstitution,
28PooledDictionary<LocalSymbol, BoundComplexConditionalReceiver> receiverSubstitution,
41private ArrayBuilder<LocalSymbol> _locals;
67public ImmutableArray<LocalSymbol> GetLocals()
69return (_locals == null) ? ImmutableArray<LocalSymbol>.Empty : _locals.ToImmutable();
122public void AddLocal(LocalSymbol local)
126_locals = ArrayBuilder<LocalSymbol>.GetInstance();
132public void AddLocals(ImmutableArray<LocalSymbol> locals)
134foreach (var local in locals)
183private readonly PooledDictionary<LocalSymbol, LocalSymbol> _tempSubstitution;
184private readonly PooledDictionary<LocalSymbol, BoundComplexConditionalReceiver> _receiverSubstitution;
187PooledDictionary<LocalSymbol, LocalSymbol> tempSubstitution,
188PooledDictionary<LocalSymbol, BoundComplexConditionalReceiver> receiverSubstitution,
197PooledDictionary<LocalSymbol, LocalSymbol> tempSubstitution,
198PooledDictionary<LocalSymbol, BoundComplexConditionalReceiver> receiverSubstitution,
214LocalSymbol longLived;
234var tempSubstitution = PooledDictionary<LocalSymbol, LocalSymbol>.GetInstance();
235var receiverSubstitution = PooledDictionary<LocalSymbol, BoundComplexConditionalReceiver>.GetInstance();
357out LocalSymbol receiverRefLocal,
530out LocalSymbol outReceiverRefLocal,
1007var tmp = _F.SynthesizedLocal(node.Type, kind: SynthesizedLocalKind.Spill, syntax: _F.Syntax);
1146var tmp = _F.SynthesizedLocal(node.Type, kind: SynthesizedLocalKind.Spill, syntax: _F.Syntax);
1161var tmp = _F.SynthesizedLocal(condition.Type, kind: SynthesizedLocalKind.Spill, syntax: _F.Syntax);
1261var tmp = _F.SynthesizedLocal(node.Type, kind: SynthesizedLocalKind.Spill, syntax: _F.Syntax);
1317var clone = _F.SynthesizedLocal(receiver.Type, _F.Syntax, refKind: RefKind.None, kind: SynthesizedLocalKind.Spill);
1347var tmp = _F.SynthesizedLocal(node.Type, kind: SynthesizedLocalKind.Spill, syntax: _F.Syntax);
1498private void PromoteAndAddLocals(BoundSpillSequenceBuilder builder, ImmutableArray<LocalSymbol> locals)
1500foreach (var local in locals)
1508LocalSymbol longLived = local.WithSynthesizedLocalKindAndSyntax(SynthesizedLocalKind.Spill, _F.Syntax);
Lowering\SyntheticBoundNodeFactory.cs (28)
228public BoundExpression This(LocalSymbol thisTempOpt)
458return Block(ImmutableArray<LocalSymbol>.Empty, statements);
466public BoundBlock Block(ImmutableArray<LocalSymbol> locals, params BoundStatement[] statements)
471public BoundBlock Block(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundStatement> statements)
476public BoundBlock Block(ImmutableArray<LocalSymbol> locals, ImmutableArray<LocalFunctionSymbol> localFunctions, params BoundStatement[] statements)
481public BoundBlock Block(ImmutableArray<LocalSymbol> locals, ImmutableArray<LocalFunctionSymbol> localFunctions, ImmutableArray<BoundStatement> statements)
486public BoundBlock Block(ImmutableArray<LocalSymbol> locals, ImmutableArray<MethodSymbol> localFunctions, ImmutableArray<BoundStatement> statements)
515public BoundBlockInstrumentation CombineInstrumentation(BoundBlockInstrumentation? innerInstrumentation = null, LocalSymbol? local = null, BoundStatement? prologue = null, BoundStatement? epilogue = null)
594public LocalSymbol SynthesizedLocal(
616public LocalSymbol InterpolatedStringHandlerLocal(
934return If(condition, ImmutableArray<LocalSymbol>.Empty, thenClause, elseClauseOpt);
942public BoundStatement If(BoundExpression condition, ImmutableArray<LocalSymbol> locals, BoundStatement thenClause, BoundStatement? elseClauseOpt = null)
998public BoundLocal Local(LocalSymbol local)
1003public BoundExpression MakeSequence(LocalSymbol temp, params BoundExpression[] parts)
1005return MakeSequence(ImmutableArray.Create<LocalSymbol>(temp), parts);
1010return MakeSequence(ImmutableArray<LocalSymbol>.Empty, parts);
1013public BoundExpression MakeSequence(ImmutableArray<LocalSymbol> locals, params BoundExpression[] parts)
1039return new BoundSequence(Syntax, ImmutableArray<LocalSymbol>.Empty, sideEffects.AsImmutableOrNull(), result, resultType) { WasCompilerGenerated = true };
1042public BoundExpression Sequence(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundExpression> sideEffects, BoundExpression result)
1051public BoundSpillSequence SpillSequence(ImmutableArray<LocalSymbol> locals, ImmutableArray<BoundStatement> sideEffects, BoundExpression result)
1340public BoundExpression LocalId(LocalSymbol symbol)
1609LocalSymbol local,
1620return new BoundCatchBlock(Syntax, ImmutableArray<LocalSymbol>.Empty, source, source.Type, exceptionFilterPrologueOpt: null, exceptionFilterOpt: null, body: block, isSynthesizedAsyncCatchAll: false);
1728internal BoundLocal MakeTempForDiscard(BoundDiscardExpression node, ArrayBuilder<LocalSymbol> temps)
1730LocalSymbol temp;
1736internal BoundLocal MakeTempForDiscard(BoundDiscardExpression node, out LocalSymbol temp)
1744internal ImmutableArray<BoundExpression> MakeTempsForDiscardArguments(ImmutableArray<BoundExpression> arguments, ArrayBuilder<LocalSymbol> builder)
1862locals: ImmutableArray<LocalSymbol>.Empty,