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)
1251LabelSymbol fallThroughLabel,
1342LabelSymbol fallThroughLabel,
1382void emitLengthDispatch(LengthBasedStringSwitchData lengthBasedSwitchInfo, LocalOrParameter keyTemp, LabelSymbol fallThroughLabel, SyntaxNode syntaxNode)
1416void emitCharDispatches(LengthBasedStringSwitchData lengthBasedSwitchInfo, LocalOrParameter keyTemp, LabelSymbol fallThroughLabel, SyntaxNode syntaxNode)
1454void emitFinalDispatches(LengthBasedStringSwitchData lengthBasedSwitchInfo, LocalOrParameter keyTemp, TypeSymbol keyType, LabelSymbol fallThroughLabel, SyntaxNode syntaxNode)
1481LabelSymbol fallThroughLabel,
1933private Dictionary<LabelSymbol, GeneratedLabelSymbol> _labelClones;
1980var casesBuilder = ArrayBuilder<(ConstantValue, LabelSymbol)>.GetInstance();
2002private GeneratedLabelSymbol GetLabelClone(LabelSymbol label)
2007_labelClones = labelClones = new Dictionary<LabelSymbol, GeneratedLabelSymbol>();
FlowAnalysis\AbstractFlowPass.cs (11)
80private readonly PooledDictionary<LabelSymbol, TLocalState> _labels;
211_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)
3353protected 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();
987PooledDictionary<LabelSymbol, (LocalState state, bool believedReachable)> labelStateMap,
1032PooledDictionary<LabelSymbol, (LocalState state, bool believedReachable)> labelStateMap,
1044LocalState getStateForArm(BoundSwitchExpressionArm arm, PooledDictionary<LabelSymbol, (LocalState state, bool believedReachable)> labelStateMap)
Generated\BoundNodes.xml.Generated.cs (108)
3695public BoundBreakStatement(SyntaxNode syntax, LabelSymbol label, bool hasErrors)
3704public BoundBreakStatement(SyntaxNode syntax, LabelSymbol label)
3713public LabelSymbol Label { get; }
3718public BoundBreakStatement Update(LabelSymbol label)
3732public BoundContinueStatement(SyntaxNode syntax, LabelSymbol label, bool hasErrors)
3741public BoundContinueStatement(SyntaxNode syntax, LabelSymbol label)
3750public LabelSymbol Label { get; }
3755public BoundContinueStatement Update(LabelSymbol label)
3769public BoundSwitchStatement(SyntaxNode syntax, BoundExpression expression, ImmutableArray<LocalSymbol> innerLocals, ImmutableArray<MethodSymbol> innerLocalFunctions, ImmutableArray<BoundSwitchSection> switchSections, BoundDecisionDag reachabilityDecisionDag, BoundSwitchLabel? defaultLabel, LabelSymbol breakLabel, bool hasErrors = false)
3795public LabelSymbol BreakLabel { get; }
3800public BoundSwitchStatement Update(BoundExpression expression, ImmutableArray<LocalSymbol> innerLocals, ImmutableArray<MethodSymbol> innerLocalFunctions, ImmutableArray<BoundSwitchSection> switchSections, BoundDecisionDag reachabilityDecisionDag, BoundSwitchLabel? defaultLabel, LabelSymbol breakLabel)
3814public BoundSwitchDispatch(SyntaxNode syntax, BoundExpression expression, ImmutableArray<(ConstantValue value, LabelSymbol label)> cases, LabelSymbol defaultLabel, LengthBasedStringSwitchData? lengthBasedStringSwitchDataOpt, bool hasErrors = false)
3829public ImmutableArray<(ConstantValue value, LabelSymbol label)> Cases { get; }
3830public LabelSymbol DefaultLabel { get; }
3836public BoundSwitchDispatch Update(BoundExpression expression, ImmutableArray<(ConstantValue value, LabelSymbol label)> cases, LabelSymbol defaultLabel, LengthBasedStringSwitchData? lengthBasedStringSwitchDataOpt)
3883protected BoundLoopStatement(BoundKind kind, SyntaxNode syntax, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors)
3894protected BoundLoopStatement(BoundKind kind, SyntaxNode syntax, LabelSymbol breakLabel, LabelSymbol continueLabel)
3905public LabelSymbol BreakLabel { get; }
3906public LabelSymbol ContinueLabel { get; }
3911protected BoundConditionalLoopStatement(BoundKind kind, SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3933public BoundDoStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3949public BoundDoStatement Update(ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
3963public BoundWhileStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
3979public BoundWhileStatement Update(ImmutableArray<LocalSymbol> locals, BoundExpression condition, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
3993public BoundForStatement(SyntaxNode syntax, ImmutableArray<LocalSymbol> outerLocals, BoundStatement? initializer, ImmutableArray<LocalSymbol> innerLocals, BoundExpression? condition, BoundStatement? increment, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel, bool hasErrors = false)
4021public BoundForStatement Update(ImmutableArray<LocalSymbol> outerLocals, BoundStatement? initializer, ImmutableArray<LocalSymbol> innerLocals, BoundExpression? condition, BoundStatement? increment, BoundStatement body, LabelSymbol breakLabel, LabelSymbol continueLabel)
4035public 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)
4072public 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)
4221public BoundTryStatement(SyntaxNode syntax, BoundBlock tryBlock, ImmutableArray<BoundCatchBlock> catchBlocks, BoundBlock? finallyBlockOpt, LabelSymbol? finallyLabelOpt, bool preferFaultHandler, bool hasErrors = false)
4238public LabelSymbol? FinallyLabelOpt { get; }
4244public BoundTryStatement Update(BoundBlock tryBlock, ImmutableArray<BoundCatchBlock> catchBlocks, BoundBlock? finallyBlockOpt, LabelSymbol? finallyLabelOpt, bool preferFaultHandler)
4671public BoundLabelStatement(SyntaxNode syntax, LabelSymbol label, bool hasErrors)
4680public BoundLabelStatement(SyntaxNode syntax, LabelSymbol label)
4689public LabelSymbol Label { get; }
4694public BoundLabelStatement Update(LabelSymbol label)
4708public BoundGotoStatement(SyntaxNode syntax, LabelSymbol label, BoundExpression? caseExpressionOpt, BoundLabel? labelExpressionOpt, bool hasErrors = false)
4719public LabelSymbol Label { get; }
4726public BoundGotoStatement Update(LabelSymbol label, BoundExpression? caseExpressionOpt, BoundLabel? labelExpressionOpt)
4740public BoundLabeledStatement(SyntaxNode syntax, LabelSymbol label, BoundStatement body, bool hasErrors = false)
4751public LabelSymbol Label { get; }
4757public BoundLabeledStatement Update(LabelSymbol label, BoundStatement body)
4771public BoundLabel(SyntaxNode syntax, LabelSymbol label, TypeSymbol? type, bool hasErrors)
4780public BoundLabel(SyntaxNode syntax, LabelSymbol label, TypeSymbol? type)
4789public LabelSymbol Label { get; }
4794public BoundLabel Update(LabelSymbol label, TypeSymbol? type)
4845public BoundConditionalGoto(SyntaxNode syntax, BoundExpression condition, bool jumpIfTrue, LabelSymbol label, bool hasErrors = false)
4859public LabelSymbol Label { get; }
4864public BoundConditionalGoto Update(BoundExpression condition, bool jumpIfTrue, LabelSymbol label)
4878protected BoundSwitchExpression(BoundKind kind, SyntaxNode syntax, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type, bool hasErrors = false)
4896public LabelSymbol? DefaultLabel { get; }
4902public BoundSwitchExpressionArm(SyntaxNode syntax, ImmutableArray<LocalSymbol> locals, BoundPattern pattern, BoundExpression? whenClause, BoundExpression value, LabelSymbol label, bool hasErrors = false)
4922public LabelSymbol Label { get; }
4927public BoundSwitchExpressionArm Update(ImmutableArray<LocalSymbol> locals, BoundPattern pattern, BoundExpression? whenClause, BoundExpression value, LabelSymbol label)
4941public BoundUnconvertedSwitchExpression(SyntaxNode syntax, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type, bool hasErrors = false)
4955public BoundUnconvertedSwitchExpression Update(BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol? type)
4969public BoundConvertedSwitchExpression(SyntaxNode syntax, TypeSymbol? naturalTypeOpt, bool wasTargetTyped, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol type, bool hasErrors = false)
4989public BoundConvertedSwitchExpression Update(TypeSymbol? naturalTypeOpt, bool wasTargetTyped, BoundExpression expression, ImmutableArray<BoundSwitchExpressionArm> switchArms, BoundDecisionDag reachabilityDecisionDag, LabelSymbol? defaultLabel, bool reportedNotExhaustive, TypeSymbol type)
5145public BoundLeafDecisionDagNode(SyntaxNode syntax, LabelSymbol label, bool hasErrors)
5154public BoundLeafDecisionDagNode(SyntaxNode syntax, LabelSymbol label)
5163public LabelSymbol Label { get; }
5168public BoundLeafDecisionDagNode Update(LabelSymbol label)
5689public BoundSwitchLabel(SyntaxNode syntax, LabelSymbol label, BoundPattern pattern, BoundExpression? whenClause, bool hasErrors = false)
5701public LabelSymbol Label { get; }
5708public BoundSwitchLabel Update(LabelSymbol label, BoundPattern pattern, BoundExpression? whenClause)
7946public BoundIsPatternExpression(SyntaxNode syntax, BoundExpression expression, BoundPattern pattern, bool isNegated, BoundDecisionDag reachabilityDecisionDag, LabelSymbol whenTrueLabel, LabelSymbol whenFalseLabel, TypeSymbol? type, bool hasErrors = false)
7968public LabelSymbol WhenTrueLabel { get; }
7969public LabelSymbol WhenFalseLabel { get; }
7974public BoundIsPatternExpression Update(BoundExpression expression, BoundPattern pattern, bool isNegated, BoundDecisionDag reachabilityDecisionDag, LabelSymbol whenTrueLabel, LabelSymbol whenFalseLabel, TypeSymbol? type)
11426LabelSymbol label = this.VisitLabelSymbol(node.Label);
11431LabelSymbol label = this.VisitLabelSymbol(node.Label);
11438LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11447LabelSymbol defaultLabel = this.VisitLabelSymbol(node.DefaultLabel);
11461LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11462LabelSymbol continueLabel = this.VisitLabelSymbol(node.ContinueLabel);
11470LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11471LabelSymbol continueLabel = this.VisitLabelSymbol(node.ContinueLabel);
11480LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11481LabelSymbol continueLabel = this.VisitLabelSymbol(node.ContinueLabel);
11491LabelSymbol breakLabel = this.VisitLabelSymbol(node.BreakLabel);
11492LabelSymbol continueLabel = this.VisitLabelSymbol(node.ContinueLabel);
11533LabelSymbol? finallyLabelOpt = this.VisitLabelSymbol(node.FinallyLabelOpt);
11606LabelSymbol label = this.VisitLabelSymbol(node.Label);
11611LabelSymbol label = this.VisitLabelSymbol(node.Label);
11618LabelSymbol label = this.VisitLabelSymbol(node.Label);
11624LabelSymbol label = this.VisitLabelSymbol(node.Label);
11635LabelSymbol label = this.VisitLabelSymbol(node.Label);
11642LabelSymbol label = this.VisitLabelSymbol(node.Label);
11650LabelSymbol? defaultLabel = this.VisitLabelSymbol(node.DefaultLabel);
11659LabelSymbol? defaultLabel = this.VisitLabelSymbol(node.DefaultLabel);
11694LabelSymbol label = this.VisitLabelSymbol(node.Label);
11794LabelSymbol label = this.VisitLabelSymbol(node.Label);
12213LabelSymbol whenTrueLabel = this.VisitLabelSymbol(node.WhenTrueLabel);
12214LabelSymbol 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);