BoundTree\LengthBasedStringSwitchData.cs (24)
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)
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 (11)
79private readonly PooledDictionary<LabelSymbol, TLocalState> _labels;
210_labels = PooledDictionary<LabelSymbol, TLocalState>.GetInstance();
400public readonly LabelSymbol? Label;
403public PendingBranch(BoundNode branch, TLocalState state, LabelSymbol label, bool isConditionalState = false, TLocalState stateWhenTrue = default, TLocalState stateWhenFalse = default)
514protected virtual TLocalState LabelState(LabelSymbol label)
723private void ResolveBreaks(TLocalState breakState, LabelSymbol label)
732private void ResolveContinues(LabelSymbol continueLabel)
745private void JoinPendingBranches(ref TLocalState state, LabelSymbol label)
773private bool ResolveBranches(LabelSymbol label, BoundStatement? target)
792protected virtual void ResolveBranch(PendingBranch pending, LabelSymbol label, BoundStatement? target, ref bool labelStateChanged)
3385protected void VisitLabel(LabelSymbol label, BoundStatement node)
FlowAnalysis\NullableWalker_Patterns.cs (5)
377private PooledDictionary<LabelSymbol, (LocalState state, bool believedReachable)> LearnFromDecisionDag(
421var labelStateMap = PooledDictionary<LabelSymbol, (LocalState state, bool believedReachable)>.GetInstance();
1181PooledDictionary<LabelSymbol, (LocalState state, bool believedReachable)> labelStateMap,
1226PooledDictionary<LabelSymbol, (LocalState state, bool believedReachable)> labelStateMap,
1238LocalState getStateForArm(BoundSwitchExpressionArm arm, PooledDictionary<LabelSymbol, (LocalState state, bool believedReachable)> labelStateMap)
Generated\BoundNodes.xml.Generated.cs (106)
3754public BoundBreakStatement(SyntaxNode syntax, LabelSymbol label, BoundLabel? labelExpressionOpt, bool hasErrors = false)
3764public LabelSymbol Label { get; }
3770public BoundBreakStatement Update(LabelSymbol label, BoundLabel? labelExpressionOpt)
3784public BoundContinueStatement(SyntaxNode syntax, LabelSymbol label, BoundLabel? labelExpressionOpt, bool hasErrors = false)
3794public LabelSymbol Label { get; }
3800public BoundContinueStatement Update(LabelSymbol label, BoundLabel? labelExpressionOpt)
3814public BoundSwitchStatement(SyntaxNode syntax, BoundExpression expression, ImmutableArray<LocalSymbol> innerLocals, ImmutableArray<MethodSymbol> innerLocalFunctions, ImmutableArray<BoundSwitchSection> switchSections, BoundDecisionDag reachabilityDecisionDag, BoundSwitchLabel? defaultLabel, LabelSymbol breakLabel, bool hasErrors = false)
3840public LabelSymbol BreakLabel { get; }
3845public BoundSwitchStatement Update(BoundExpression expression, ImmutableArray<LocalSymbol> innerLocals, ImmutableArray<MethodSymbol> innerLocalFunctions, ImmutableArray<BoundSwitchSection> switchSections, BoundDecisionDag reachabilityDecisionDag, BoundSwitchLabel? defaultLabel, LabelSymbol breakLabel)
3859public BoundSwitchDispatch(SyntaxNode syntax, BoundExpression expression, ImmutableArray<(ConstantValue value, LabelSymbol label)> cases, LabelSymbol defaultLabel, LengthBasedStringSwitchData? lengthBasedStringSwitchDataOpt, bool hasErrors = false)
3874public ImmutableArray<(ConstantValue value, LabelSymbol label)> Cases { get; }
3875public LabelSymbol DefaultLabel { get; }
3881public BoundSwitchDispatch Update(BoundExpression expression, ImmutableArray<(ConstantValue value, LabelSymbol label)> cases, LabelSymbol defaultLabel, LengthBasedStringSwitchData? lengthBasedStringSwitchDataOpt)
3928protected BoundLoopStatement(BoundKind kind, SyntaxNode syntax, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors)
3939protected BoundLoopStatement(BoundKind kind, SyntaxNode syntax, LabelSymbol breakLabel, LabelSymbol continueLabel)
3950public LabelSymbol BreakLabel { get; }
3951public LabelSymbol ContinueLabel { get; }
3956protected BoundConditionalLoopStatement(BoundKind kind, SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3978public BoundDoStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3994public BoundDoStatement Update(ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4008public BoundWhileStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
4024public BoundWhileStatement Update(ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4038public BoundForStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> outerLocals, BoundStatement? initializer, ImmutableArray<LocalSymbol> innerLocals, BoundExpression? condition, BoundStatement? increment, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
4066public BoundForStatement Update(ImmutableArray<LocalSymbol> outerLocals, BoundStatement? initializer, ImmutableArray<LocalSymbol> innerLocals, BoundExpression? condition, BoundStatement? increment, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4080public 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)
4115public 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)
4264public BoundTryStatement(SyntaxNode syntax, BoundBlock tryBlock, ImmutableArray<BoundCatchBlock> catchBlocks, BoundBlock? finallyBlockOpt, LabelSymbol? finallyLabelOpt, bool preferFaultHandler, bool hasErrors = false)
4281public LabelSymbol? FinallyLabelOpt { get; }
4287public BoundTryStatement Update(BoundBlock tryBlock, ImmutableArray<BoundCatchBlock> catchBlocks, BoundBlock? finallyBlockOpt, LabelSymbol? finallyLabelOpt, bool preferFaultHandler)
4714public BoundLabelStatement(SyntaxNode syntax, LabelSymbol label, bool hasErrors)
4723public BoundLabelStatement(SyntaxNode syntax, LabelSymbol label)
4732public LabelSymbol Label { get; }
4737public BoundLabelStatement Update(LabelSymbol label)
4751public BoundGotoStatement(SyntaxNode syntax, LabelSymbol label, BoundExpression? caseExpressionOpt, BoundLabel? labelExpressionOpt, bool hasErrors = false)
4762public LabelSymbol Label { get; }
4769public BoundGotoStatement Update(LabelSymbol label, BoundExpression? caseExpressionOpt, BoundLabel? labelExpressionOpt)
4783public BoundLabeledStatement(SyntaxNode syntax, LabelSymbol label, BoundStatement body, bool hasErrors = false)
4794public LabelSymbol Label { get; }
4800public BoundLabeledStatement Update(LabelSymbol label, BoundStatement body)
4814public BoundLabel(SyntaxNode syntax, LabelSymbol label, TypeSymbol? type, bool hasErrors)
4823public BoundLabel(SyntaxNode syntax, LabelSymbol label, TypeSymbol? type)
4832public LabelSymbol Label { get; }
4837public BoundLabel Update(LabelSymbol label, TypeSymbol? type)
4888public BoundConditionalGoto(SyntaxNode syntax, BoundExpression condition, bool jumpIfTrue, LabelSymbol label, bool hasErrors = false)
4902public LabelSymbol Label { get; }
4907public BoundConditionalGoto Update(BoundExpression condition, bool jumpIfTrue, LabelSymbol label)
4921protected BoundSwitchExpression(BoundKind kind, SyntaxNode syntax, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type, bool hasErrors = false)
4939public LabelSymbol? DefaultLabel { get; }
4945public BoundSwitchExpressionArm(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundPattern pattern, bool hasUnionMatching, BoundExpression? whenClause, BoundExpression value, LabelSymbol label, bool hasErrors = false)
4967public LabelSymbol Label { get; }
4972public BoundSwitchExpressionArm Update(ImmutableArray<LocalSymbol> locals, BoundPattern pattern, bool hasUnionMatching, BoundExpression? whenClause, BoundExpression value, LabelSymbol label)
4986public BoundUnconvertedSwitchExpression(SyntaxNode syntax, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type, bool hasErrors = false)
5000public BoundUnconvertedSwitchExpression Update(BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type)
5014public BoundConvertedSwitchExpression(SyntaxNode syntax, TypeSymbol? naturalTypeOpt, bool wasTargetTyped, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol type, bool hasErrors = false)
5034public BoundConvertedSwitchExpression Update(TypeSymbol? naturalTypeOpt, bool wasTargetTyped, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol type)
5192public BoundLeafDecisionDagNode(SyntaxNode syntax, LabelSymbol label, bool hasErrors)
5201public BoundLeafDecisionDagNode(SyntaxNode syntax, LabelSymbol label)
5210public LabelSymbol Label { get; }
5215public BoundLeafDecisionDagNode Update(LabelSymbol label)
5762public BoundSwitchLabel(SyntaxNode syntax, LabelSymbol label, BoundPattern pattern, bool hasUnionMatching, BoundExpression? whenClause, bool hasErrors = false)
5775public LabelSymbol Label { get; }
5783public BoundSwitchLabel Update(LabelSymbol label, BoundPattern pattern, bool hasUnionMatching, BoundExpression? whenClause)
8071public BoundIsPatternExpression(SyntaxNode syntax, BoundExpression expression, BoundPattern pattern, bool hasUnionMatching, bool isNegated, BoundDecisionDag reachabilityDecisionDag, LabelSymbol whenTrueLabel, LabelSymbol whenFalseLabel, TypeSymbol? type, bool hasErrors = false)
8095public LabelSymbol WhenTrueLabel { get; }
8096public LabelSymbol WhenFalseLabel { get; }
8101public BoundIsPatternExpression Update(BoundExpression expression, BoundPattern pattern, bool hasUnionMatching, bool isNegated, BoundDecisionDag reachabilityDecisionDag, LabelSymbol whenTrueLabel, LabelSymbol whenFalseLabel, TypeSymbol? type)
11708LabelSymbol label = this.VisitLabelSymbol(node.Label);
11714LabelSymbol label = this.VisitLabelSymbol(node.Label);
11722LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11731LabelSymbol defaultLabel = this.VisitLabelSymbol(node.DefaultLabel);
11745LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11746LabelSymbol continueLabel = this.VisitLabelSymbol(node.ContinueLabel);
11754LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11755LabelSymbol continueLabel = this.VisitLabelSymbol(node.ContinueLabel);
11764LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11765LabelSymbol continueLabel = this.VisitLabelSymbol(node.ContinueLabel);
11775LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11776LabelSymbol continueLabel = this.VisitLabelSymbol(node.ContinueLabel);
11816LabelSymbol? finallyLabelOpt = this.VisitLabelSymbol(node.FinallyLabelOpt);
11889LabelSymbol label = this.VisitLabelSymbol(node.Label);
11894LabelSymbol label = this.VisitLabelSymbol(node.Label);
11901LabelSymbol label = this.VisitLabelSymbol(node.Label);
11907LabelSymbol label = this.VisitLabelSymbol(node.Label);
11918LabelSymbol label = this.VisitLabelSymbol(node.Label);
11925LabelSymbol label = this.VisitLabelSymbol(node.Label);
11933LabelSymbol? defaultLabel = this.VisitLabelSymbol(node.DefaultLabel);
11942LabelSymbol? defaultLabel = this.VisitLabelSymbol(node.DefaultLabel);
11977LabelSymbol label = this.VisitLabelSymbol(node.Label);
12082LabelSymbol label = this.VisitLabelSymbol(node.Label);
12506LabelSymbol whenTrueLabel = this.VisitLabelSymbol(node.WhenTrueLabel);
12507LabelSymbol 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;
1010var whenExpressionMap = PooledDictionary<BoundExpression, (LabelSymbol LabelToWhenExpression, ArrayBuilder<BoundWhenDecisionDagNode> WhenNodes)>.GetInstance();
1011var whenNodeMap = PooledDictionary<BoundWhenDecisionDagNode, (LabelSymbol LabelToWhenExpression, int WhenNodeIdentifier)>.GetInstance();
1019LabelSymbol labelToWhenExpression;
1070LabelSymbol labelToSectionScope = GetDagNodeLabel(whenNode);
1087void lowerWhenExpressionIfShared(BoundExpression whenExpression, LabelSymbol labelToWhenExpression, ArrayBuilder<BoundWhenDecisionDagNode> whenNodes)
1095var whenTrueLabel = GetDagNodeLabel(whenNodes[0].WhenTrue);
1131void addConditionalGoto(BoundExpression whenExpression, SyntaxNode whenClauseSyntax, LabelSymbol whenTrueLabel, ArrayBuilder<BoundStatement> sectionBuilder)
1161LabelSymbol labelToSectionScope = GetDagNodeLabel(whenClause);
1168var trueLabel = GetDagNodeLabel(whenTrue);