BoundTree\LengthBasedStringSwitchData.cs (26)
87public readonly LabelSymbol? NullCaseLabel;
88public readonly ImmutableArray<(int value, LabelSymbol label)> LengthCaseLabels;
90public LengthJumpTable(LabelSymbol? nullCaseLabel, ImmutableArray<(int value, LabelSymbol label)> lengthCaseLabels)
101public readonly LabelSymbol Label;
103public readonly ImmutableArray<(char value, LabelSymbol label)> CharCaseLabels;
105internal CharJumpTable(LabelSymbol label, int selectedCharPosition, ImmutableArray<(char value, LabelSymbol label)> charCaseLabels)
117public readonly LabelSymbol Label;
118public readonly ImmutableArray<(string value, LabelSymbol label)> StringCaseLabels;
120internal StringJumpTable(LabelSymbol label, ImmutableArray<(string value, LabelSymbol label)> stringCaseLabels)
137internal static LengthBasedStringSwitchData Create(ImmutableArray<(ConstantValue value, LabelSymbol label)> inputCases)
141LabelSymbol? nullCaseLabel = null;
151var lengthCaseLabels = ArrayBuilder<(int value, LabelSymbol label)>.GetInstance();
157var labelForLength = CreateAndRegisterCharJumpTables(stringLength, group.SelectAsArray(c => (c.value.StringValue!, c.label)), charJumpTables, stringJumpTables);
165private static LabelSymbol CreateAndRegisterCharJumpTables(int stringLength, ImmutableArray<(string value, LabelSymbol label)> casesWithGivenLength,
186var charCaseLabels = ArrayBuilder<(char value, LabelSymbol label)>.GetInstance();
191LabelSymbol label = (stringLength == 1)
202static int selectBestCharacterIndex(int stringLength, ImmutableArray<(string value, LabelSymbol label)> caseLabels)
229static (int singleEntryCount, int largestBucket) positionScore(int position, ImmutableArray<(string value, LabelSymbol label)> caseLabels)
253private static LabelSymbol CreateAndRegisterStringJumpTable(ImmutableArray<(string value, LabelSymbol label)> cases, ArrayBuilder<StringJumpTable> stringJumpTables)
290void dump<T>(ImmutableArray<(T value, LabelSymbol label)> cases)
298string readable(LabelSymbol? label)
CodeGen\EmitStatement.cs (10)
1278LabelSymbol fallThroughLabel,
1369LabelSymbol fallThroughLabel,
1409void emitLengthDispatch(LengthBasedStringSwitchData lengthBasedSwitchInfo, LocalOrParameter keyTemp, LabelSymbol fallThroughLabel, SyntaxNode syntaxNode)
1446void emitCharDispatches(LengthBasedStringSwitchData lengthBasedSwitchInfo, LocalOrParameter keyTemp, LabelSymbol fallThroughLabel, SyntaxNode syntaxNode)
1487void emitFinalDispatches(LengthBasedStringSwitchData lengthBasedSwitchInfo, LocalOrParameter keyTemp, TypeSymbol keyType, LabelSymbol fallThroughLabel, SyntaxNode syntaxNode)
1514LabelSymbol fallThroughLabel,
1967private Dictionary<LabelSymbol, GeneratedLabelSymbol> _labelClones;
2014var casesBuilder = ArrayBuilder<(ConstantValue, LabelSymbol)>.GetInstance();
2036private GeneratedLabelSymbol GetLabelClone(LabelSymbol label)
2041_labelClones = labelClones = new Dictionary<LabelSymbol, GeneratedLabelSymbol>();
FlowAnalysis\AbstractFlowPass.cs (12)
79private readonly PooledDictionary<LabelSymbol, TLocalState> _labels;
210_labels = PooledDictionary<LabelSymbol, TLocalState>.GetInstance();
238foreach (var key in _labels.Keys)
399public readonly LabelSymbol? Label;
402public PendingBranch(BoundNode branch, TLocalState state, LabelSymbol label, bool isConditionalState = false, TLocalState stateWhenTrue = default, TLocalState stateWhenFalse = default)
513protected virtual TLocalState LabelState(LabelSymbol label)
722private void ResolveBreaks(TLocalState breakState, LabelSymbol label)
731private void ResolveContinues(LabelSymbol continueLabel)
744private void JoinPendingBranches(ref TLocalState state, LabelSymbol label)
772private bool ResolveBranches(LabelSymbol label, BoundStatement? target)
791protected virtual void ResolveBranch(PendingBranch pending, LabelSymbol label, BoundStatement? target, ref bool labelStateChanged)
3375protected void VisitLabel(LabelSymbol label, BoundStatement node)
FlowAnalysis\NullableWalker_Patterns.cs (5)
374private PooledDictionary<LabelSymbol, (LocalState state, bool believedReachable)> LearnFromDecisionDag(
416var labelStateMap = PooledDictionary<LabelSymbol, (LocalState state, bool believedReachable)>.GetInstance();
989PooledDictionary<LabelSymbol, (LocalState state, bool believedReachable)> labelStateMap,
1034PooledDictionary<LabelSymbol, (LocalState state, bool believedReachable)> labelStateMap,
1046LocalState getStateForArm(BoundSwitchExpressionArm arm, PooledDictionary<LabelSymbol, (LocalState state, bool believedReachable)> labelStateMap)
Generated\BoundNodes.xml.Generated.cs (108)
3704public BoundBreakStatement(SyntaxNode syntax, LabelSymbol label, bool hasErrors)
3713public BoundBreakStatement(SyntaxNode syntax, LabelSymbol label)
3722public LabelSymbol Label { get; }
3727public BoundBreakStatement Update(LabelSymbol label)
3741public BoundContinueStatement(SyntaxNode syntax, LabelSymbol label, bool hasErrors)
3750public BoundContinueStatement(SyntaxNode syntax, LabelSymbol label)
3759public LabelSymbol Label { get; }
3764public BoundContinueStatement Update(LabelSymbol label)
3778public BoundSwitchStatement(SyntaxNode syntax, BoundExpression expression, ImmutableArray<LocalSymbol> innerLocals, ImmutableArray<MethodSymbol> innerLocalFunctions, ImmutableArray<BoundSwitchSection> switchSections, BoundDecisionDag reachabilityDecisionDag, BoundSwitchLabel? defaultLabel, LabelSymbol breakLabel, bool hasErrors = false)
3804public LabelSymbol BreakLabel { get; }
3809public BoundSwitchStatement Update(BoundExpression expression, ImmutableArray<LocalSymbol> innerLocals, ImmutableArray<MethodSymbol> innerLocalFunctions, ImmutableArray<BoundSwitchSection> switchSections, BoundDecisionDag reachabilityDecisionDag, BoundSwitchLabel? defaultLabel, LabelSymbol breakLabel)
3823public BoundSwitchDispatch(SyntaxNode syntax, BoundExpression expression, ImmutableArray<(ConstantValue value, LabelSymbol label)> cases, LabelSymbol defaultLabel, LengthBasedStringSwitchData? lengthBasedStringSwitchDataOpt, bool hasErrors = false)
3838public ImmutableArray<(ConstantValue value, LabelSymbol label)> Cases { get; }
3839public LabelSymbol DefaultLabel { get; }
3845public BoundSwitchDispatch Update(BoundExpression expression, ImmutableArray<(ConstantValue value, LabelSymbol label)> cases, LabelSymbol defaultLabel, LengthBasedStringSwitchData? lengthBasedStringSwitchDataOpt)
3892protected BoundLoopStatement(BoundKind kind, SyntaxNode syntax, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors)
3903protected BoundLoopStatement(BoundKind kind, SyntaxNode syntax, LabelSymbol breakLabel, LabelSymbol continueLabel)
3914public LabelSymbol BreakLabel { get; }
3915public LabelSymbol ContinueLabel { get; }
3920protected BoundConditionalLoopStatement(BoundKind kind, SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3942public BoundDoStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3958public BoundDoStatement Update(ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
3972public BoundWhileStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3988public BoundWhileStatement Update(ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4002public BoundForStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> outerLocals, BoundStatement? initializer, ImmutableArray<LocalSymbol> innerLocals, BoundExpression? condition, BoundStatement? increment, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
4030public BoundForStatement Update(ImmutableArray<LocalSymbol> outerLocals, BoundStatement? initializer, ImmutableArray<LocalSymbol> innerLocals, BoundExpression? condition, BoundStatement? increment, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4044public BoundForEachStatement(SyntaxNode syntax, ForEachEnumeratorInfo? enumeratorInfoOpt, BoundValuePlaceholder? elementPlaceholder, BoundExpression? elementConversion, BoundTypeExpression iterationVariableType, ImmutableArray<LocalSymbol> iterationVariables, BoundExpression? iterationErrorExpressionOpt, BoundExpression expression, BoundForEachDeconstructStep? deconstructionOpt, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
4079public BoundForEachStatement Update(ForEachEnumeratorInfo? enumeratorInfoOpt, BoundValuePlaceholder? elementPlaceholder, BoundExpression? elementConversion, BoundTypeExpression iterationVariableType, ImmutableArray<LocalSymbol> iterationVariables, BoundExpression? iterationErrorExpressionOpt, BoundExpression expression, BoundForEachDeconstructStep? deconstructionOpt, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4228public BoundTryStatement(SyntaxNode syntax, BoundBlock tryBlock, ImmutableArray<BoundCatchBlock> catchBlocks, BoundBlock? finallyBlockOpt, LabelSymbol? finallyLabelOpt, bool preferFaultHandler, bool hasErrors = false)
4245public LabelSymbol? FinallyLabelOpt { get; }
4251public BoundTryStatement Update(BoundBlock tryBlock, ImmutableArray<BoundCatchBlock> catchBlocks, BoundBlock? finallyBlockOpt, LabelSymbol? finallyLabelOpt, bool preferFaultHandler)
4678public BoundLabelStatement(SyntaxNode syntax, LabelSymbol label, bool hasErrors)
4687public BoundLabelStatement(SyntaxNode syntax, LabelSymbol label)
4696public LabelSymbol Label { get; }
4701public BoundLabelStatement Update(LabelSymbol label)
4715public BoundGotoStatement(SyntaxNode syntax, LabelSymbol label, BoundExpression? caseExpressionOpt, BoundLabel? labelExpressionOpt, bool hasErrors = false)
4726public LabelSymbol Label { get; }
4733public BoundGotoStatement Update(LabelSymbol label, BoundExpression? caseExpressionOpt, BoundLabel? labelExpressionOpt)
4747public BoundLabeledStatement(SyntaxNode syntax, LabelSymbol label, BoundStatement body, bool hasErrors = false)
4758public LabelSymbol Label { get; }
4764public BoundLabeledStatement Update(LabelSymbol label, BoundStatement body)
4778public BoundLabel(SyntaxNode syntax, LabelSymbol label, TypeSymbol? type, bool hasErrors)
4787public BoundLabel(SyntaxNode syntax, LabelSymbol label, TypeSymbol? type)
4796public LabelSymbol Label { get; }
4801public BoundLabel Update(LabelSymbol label, TypeSymbol? type)
4852public BoundConditionalGoto(SyntaxNode syntax, BoundExpression condition, bool jumpIfTrue, LabelSymbol label, bool hasErrors = false)
4866public LabelSymbol Label { get; }
4871public BoundConditionalGoto Update(BoundExpression condition, bool jumpIfTrue, LabelSymbol label)
4885protected BoundSwitchExpression(BoundKind kind, SyntaxNode syntax, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type, bool hasErrors = false)
4903public LabelSymbol? DefaultLabel { get; }
4909public BoundSwitchExpressionArm(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundPattern pattern, BoundExpression? whenClause, BoundExpression value, LabelSymbol label, bool hasErrors = false)
4929public LabelSymbol Label { get; }
4934public BoundSwitchExpressionArm Update(ImmutableArray<LocalSymbol> locals, BoundPattern pattern, BoundExpression? whenClause, BoundExpression value, LabelSymbol label)
4948public BoundUnconvertedSwitchExpression(SyntaxNode syntax, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type, bool hasErrors = false)
4962public BoundUnconvertedSwitchExpression Update(BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type)
4976public BoundConvertedSwitchExpression(SyntaxNode syntax, TypeSymbol? naturalTypeOpt, bool wasTargetTyped, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol type, bool hasErrors = false)
4996public BoundConvertedSwitchExpression Update(TypeSymbol? naturalTypeOpt, bool wasTargetTyped, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol type)
5152public BoundLeafDecisionDagNode(SyntaxNode syntax, LabelSymbol label, bool hasErrors)
5161public BoundLeafDecisionDagNode(SyntaxNode syntax, LabelSymbol label)
5170public LabelSymbol Label { get; }
5175public BoundLeafDecisionDagNode Update(LabelSymbol label)
5696public BoundSwitchLabel(SyntaxNode syntax, LabelSymbol label, BoundPattern pattern, BoundExpression? whenClause, bool hasErrors = false)
5708public LabelSymbol Label { get; }
5715public BoundSwitchLabel Update(LabelSymbol label, BoundPattern pattern, BoundExpression? whenClause)
7957public BoundIsPatternExpression(SyntaxNode syntax, BoundExpression expression, BoundPattern pattern, bool isNegated, BoundDecisionDag reachabilityDecisionDag, LabelSymbol whenTrueLabel, LabelSymbol whenFalseLabel, TypeSymbol? type, bool hasErrors = false)
7979public LabelSymbol WhenTrueLabel { get; }
7980public LabelSymbol WhenFalseLabel { get; }
7985public BoundIsPatternExpression Update(BoundExpression expression, BoundPattern pattern, bool isNegated, BoundDecisionDag reachabilityDecisionDag, LabelSymbol whenTrueLabel, LabelSymbol whenFalseLabel, TypeSymbol? type)
11443LabelSymbol label = this.VisitLabelSymbol(node.Label);
11448LabelSymbol label = this.VisitLabelSymbol(node.Label);
11455LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11464LabelSymbol defaultLabel = this.VisitLabelSymbol(node.DefaultLabel);
11478LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11479LabelSymbol continueLabel = this.VisitLabelSymbol(node.ContinueLabel);
11487LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11488LabelSymbol continueLabel = this.VisitLabelSymbol(node.ContinueLabel);
11497LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11498LabelSymbol continueLabel = this.VisitLabelSymbol(node.ContinueLabel);
11508LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11509LabelSymbol continueLabel = this.VisitLabelSymbol(node.ContinueLabel);
11549LabelSymbol? finallyLabelOpt = this.VisitLabelSymbol(node.FinallyLabelOpt);
11622LabelSymbol label = this.VisitLabelSymbol(node.Label);
11627LabelSymbol label = this.VisitLabelSymbol(node.Label);
11634LabelSymbol label = this.VisitLabelSymbol(node.Label);
11640LabelSymbol label = this.VisitLabelSymbol(node.Label);
11651LabelSymbol label = this.VisitLabelSymbol(node.Label);
11658LabelSymbol label = this.VisitLabelSymbol(node.Label);
11666LabelSymbol? defaultLabel = this.VisitLabelSymbol(node.DefaultLabel);
11675LabelSymbol? defaultLabel = this.VisitLabelSymbol(node.DefaultLabel);
11710LabelSymbol label = this.VisitLabelSymbol(node.Label);
11810LabelSymbol label = this.VisitLabelSymbol(node.Label);
12229LabelSymbol whenTrueLabel = this.VisitLabelSymbol(node.WhenTrueLabel);
12230LabelSymbol whenFalseLabel = this.VisitLabelSymbol(node.WhenFalseLabel);
Lowering\LocalRewriter\LocalRewriter.DecisionDagRewriter.cs (33)
43private readonly PooledDictionary<BoundDecisionDagNode, LabelSymbol> _dagNodeLabels = PooledDictionary<BoundDecisionDagNode, LabelSymbol>.GetInstance();
111protected virtual LabelSymbol GetDagNodeLabel(BoundDecisionDagNode dag)
113if (!_dagNodeLabels.TryGetValue(dag, out LabelSymbol label))
400if (_dagNodeLabels.TryGetValue(node, out LabelSymbol label))
566bool foundLabel = this._dagNodeLabels.TryGetValue(node, out LabelSymbol label);
572var label = GetDagNodeLabel(node);
589var cases = ArrayBuilder<(ConstantValue value, LabelSymbol label)>.GetInstance();
608var label = GetDagNodeLabel(node);
620ImmutableArray<(ConstantValue value, LabelSymbol label)> cases,
643(ImmutableArray<(ConstantValue value, LabelSymbol label)> whenTrueCases, ImmutableArray<(ConstantValue value, LabelSymbol label)> whenFalseCases)
644splitCases(ImmutableArray<(ConstantValue value, LabelSymbol label)> cases, BinaryOperatorKind op, ConstantValue value)
646var whenTrueBuilder = ArrayBuilder<(ConstantValue value, LabelSymbol label)>.GetInstance();
647var whenFalseBuilder = ArrayBuilder<(ConstantValue value, LabelSymbol label)>.GetInstance();
681LabelSymbol trueLabel = whenTrue.Label;
687LabelSymbol falseLabel = whenFalse.Label;
693LabelSymbol falseLabel = _factory.GenerateLabel("relationalDispatch");
704private sealed class CasesComparer : IComparer<(ConstantValue value, LabelSymbol label)>
713int IComparer<(ConstantValue value, LabelSymbol label)>.Compare((ConstantValue value, LabelSymbol label) left, (ConstantValue value, LabelSymbol label) right)
744LabelSymbol defaultLabel = node.Otherwise;
787ImmutableArray<(ConstantValue value, LabelSymbol label)> cases;
1002var whenExpressionMap = PooledDictionary<BoundExpression, (LabelSymbol LabelToWhenExpression, ArrayBuilder<BoundWhenDecisionDagNode> WhenNodes)>.GetInstance();
1003var whenNodeMap = PooledDictionary<BoundWhenDecisionDagNode, (LabelSymbol LabelToWhenExpression, int WhenNodeIdentifier)>.GetInstance();
1011LabelSymbol labelToWhenExpression;
1062LabelSymbol labelToSectionScope = GetDagNodeLabel(whenNode);
1079void lowerWhenExpressionIfShared(BoundExpression whenExpression, LabelSymbol labelToWhenExpression, ArrayBuilder<BoundWhenDecisionDagNode> whenNodes)
1087var whenTrueLabel = GetDagNodeLabel(whenNodes[0].WhenTrue);
1123void addConditionalGoto(BoundExpression whenExpression, SyntaxNode whenClauseSyntax, LabelSymbol whenTrueLabel, ArrayBuilder<BoundStatement> sectionBuilder)
1153LabelSymbol labelToSectionScope = GetDagNodeLabel(whenClause);
1160var trueLabel = GetDagNodeLabel(whenTrue);