11 writes to M
System.Text.RegularExpressions.Generator (11)
parent\src\System\Text\RegularExpressions\RegexNode.cs (11)
75M = m; 82M = m; 98newNode.M = M - 1; 153M = min; 200M = N = 0; 209M = N = 0; 940u.M = min = ((int.MaxValue - 1) / u.M < min) ? int.MaxValue : u.M * min; 1922currentNode.M += nextNode.M; 1936currentNode.M++; 1963currentNode.M += matchingCharsInMulti; 2005currentNode.M = nextNode.M + 1;
147 references to M
System.Text.RegularExpressions.Generator (147)
parent\src\System\Text\RegularExpressions\RegexNode.cs (66)
92Debug.Assert(M > 0); 98newNode.M = M - 1; 182N = M; 207RegexNode loopAsChild = new(RegexNodeKind.Loop, Options, M, N); 218N = M; 886int min = M; 931if (u.M == 0 && child.M > 1 || child.N < child.M * 2) 938if (u.M > 0) 940u.M = min = ((int.MaxValue - 1) / u.M < min) ? int.MaxValue : u.M * min; 965child.MakeRep(u.Kind == RegexNodeKind.Lazyloop ? RegexNodeKind.Onelazy : RegexNodeKind.Oneloop, u.M, u.N); 990u = u.M == 0 ? new RegexNode(RegexNodeKind.Empty, Options) : child; 1265case RegexNodeKind.Oneloop or RegexNodeKind.Notoneloop or RegexNodeKind.Setloop or RegexNodeKind.Onelazy or RegexNodeKind.Notonelazy or RegexNodeKind.Setlazy when required.M == required.N: 1284required.M != other.M || 1557Debug.Assert(Kind is RegexNodeKind.One or RegexNodeKind.Multi || (IsOneFamily && M > 0)); 1643case RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Onelazy when node.M > 0: 1645case RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic or RegexNodeKind.Notonelazy when node.M > 0: 1647case RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy when node.M > 0: 1655case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when node.M > 0: 1907if (nextNode.M > 0 && 1917if (!CanCombineCounts(currentNode.M, currentNode.N, nextNode.M, nextNode.N)) 1922currentNode.M += nextNode.M; 1934if (CanCombineCounts(currentNode.M, currentNode.N, 1, 1)) 1960if (CanCombineCounts(currentNode.M, currentNode.N, matchingCharsInMulti, matchingCharsInMulti)) 2002if (CanCombineCounts(1, 1, nextNode.M, nextNode.N)) 2005currentNode.M = nextNode.M + 1; 2486case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when subsequent.M > 0: 2541case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && node.Ch != subsequent.Ch: 2542case RegexNodeKind.Notonelazy or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic when subsequent.M > 0 && node.Ch == subsequent.Ch: 2543case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.Str!): 2547case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsBoundaryWordChar(node.Ch): 2548case RegexNodeKind.NonBoundary when node.M > 0 && !RegexCharClass.IsBoundaryWordChar(node.Ch): 2549case RegexNodeKind.ECMABoundary when node.M > 0 && RegexCharClass.IsECMAWordChar(node.Ch): 2550case RegexNodeKind.NonECMABoundary when node.M > 0 && !RegexCharClass.IsECMAWordChar(node.Ch): 2553case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && node.Ch != subsequent.Ch: 2554case RegexNodeKind.Notonelazy or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic when subsequent.M == 0 && node.Ch == subsequent.Ch: 2555case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.Str!): 2569case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && node.Ch == subsequent.Ch: 2574case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && node.Ch == subsequent.Ch: 2589case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.Str!): 2590case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.MayOverlap(node.Str!, subsequent.Str!): 2594case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsSubsetOf(node.Str!, RegexCharClass.WordClass): 2595case RegexNodeKind.NonBoundary when node.M > 0 && node.Str is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass: 2596case RegexNodeKind.ECMABoundary when node.M > 0 && node.Str is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass: 2597case RegexNodeKind.NonECMABoundary when node.M > 0 && node.Str is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass: 2600case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.Str!): 2601case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.MayOverlap(node.Str!, subsequent.Str!): 2636case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && !CharInStartingOrEndingSet(subsequent.Ch): 2637case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !MayOverlapStartingOrEndingSet(subsequent.Str!): 2641case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsSubsetOf(loopStartingSet, RegexCharClass.WordClass) && RegexCharClass.IsSubsetOf(loopEndingSet, RegexCharClass.WordClass): 2642case RegexNodeKind.NonBoundary when node.M > 0 && (loopStartingSet is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass) && (loopEndingSet is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass): 2643case RegexNodeKind.ECMABoundary when node.M > 0 && (loopStartingSet is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass) && (loopEndingSet is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass): 2644case RegexNodeKind.NonECMABoundary when node.M > 0 && (loopStartingSet is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass) && (loopEndingSet is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass): 2647case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !CharInStartingOrEndingSet(subsequent.Ch): 2648case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !MayOverlapStartingOrEndingSet(subsequent.Str!): 2741RegexNodeKind.Loop or RegexNodeKind.Lazyloop when M != N => true, 2744RegexNodeKind.Setloop or RegexNodeKind.Setlazy when M != N => true, 2863return M; 2868return (int)Math.Min(int.MaxValue - 1, (long)M * Child(0).ComputeMinLength()); 3159(child.Kind is RegexNodeKind.Setloop or RegexNodeKind.Setlazy or RegexNodeKind.Setloopatomic && child.M == child.N)) 3168vsb.Append((char)(twoChars[0] | 0x20), child.Kind is RegexNodeKind.Set ? 1 : child.M); 3250when node.M == node.N => true,
parent\src\System\Text\RegularExpressions\RegexPrefixAnalyzer.cs (26)
114int reps = node.Kind is RegexNodeKind.One ? 1 : Math.Min(node.M, MaxPrefixLength); 164int reps = node.Kind is RegexNodeKind.Set ? 1 : Math.Min(node.M, MaxPrefixLength); 226case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when node.M > 0: 228int limit = Math.Min(node.M, MaxPrefixLength); // MaxPrefixLength here is somewhat arbitrary, as a single loop iteration could yield multiple chars 432case RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Onelazy when node.M > 0: 434int count = Math.Min(node.M, SingleCharIterationLimit); 439case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when node.M > 0: 442int limit = Math.Min(node.M, NodeIterationLimit); 493case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when node.M > 0: 609case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when node.M > 0: 612int minIterations = Math.Min(node.M, MaxLoopExpansion); 618return i == node.M && i == node.N; 641case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when node.M > 0: 643int minIterations = Math.Min(node.M, MaxLoopExpansion); 649return i == node.M && i == node.N; 658case RegexNodeKind.Notonelazy or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic when node.M == node.N: 659distance += node.M; 686case RegexNodeKind.Lazyloop or RegexNodeKind.Loop when node.M > 0: 959return node.Kind is RegexNodeKind.One || node.M > 0 ? true : null; 977return node.Kind is RegexNodeKind.Notone || node.M > 0 ? true : null; 996node.Kind is RegexNodeKind.Set || node.M > 0 ? true : 1043_ => node.M == 0 ? null : true, 1225(nextChild.Kind is RegexNodeKind.Loop or RegexNodeKind.Lazyloop && nextChild.M >= 1)) 1233(nextChild.Kind is RegexNodeKind.Set || nextChild.M >= 1)) 1303case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when node.M >= 1: 1362case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when leading && node.M >= 1:
RegexGenerator.Emitter.cs (55)
1517if (target.LoopNode.M > 0) 1542if (target.LoopNode.M > 0) 1563if (target.LoopNode.M > 0) 1567using (EmitBlock(writer, $"if ((i - prev - 1) < {target.LoopNode.M})")) 2207int capnum = RegexParser.MapCaptureNumber(node.M, rm.Tree.CaptureNumberSparseMapping); 2219writer.WriteLine($"// If the {DescribeCapture(node.M, rm)} hasn't matched, the backreference matches with RegexOptions.ECMAScript rules."); 2227writer.WriteLine($"// If the {DescribeCapture(node.M, rm)} hasn't matched, the backreference doesn't match."); 2282int capnum = RegexParser.MapCaptureNumber(node.M, rm.Tree.CaptureNumberSparseMapping); 2297writer.WriteLine($"// The {DescribeCapture(node.M, rm)} captured a value. Match the first branch."); 2630int capnum = RegexParser.MapCaptureNumber(node.M, rm.Tree.CaptureNumberSparseMapping); 3128child.M == child.N && 3129child.M <= MaxUnrollSize) 3131int repeatCount = child.Kind is RegexNodeKind.One or RegexNodeKind.Notone or RegexNodeKind.Set ? 1 : child.M; 3411if (node.M == node.N) 3421Debug.Assert(node.M < node.N); 3446EmitAdd(writer, startingPos, !rtl ? node.M : -node.M); 3584if (node.M > 0) 3591if (node.M == node.N || rm.Analysis.IsAtomicByAncestor(node)) 3596if (node.M > 0) 3602Debug.Assert(node.M < node.N); 3615maxIterations = $"{node.N - node.M}"; 3827Debug.Assert(node.M < int.MaxValue, $"Unexpected M={node.M}"); 3828Debug.Assert(node.N >= node.M, $"Unexpected M={node.M}, N={node.N}"); 3832int minIterations = node.M; 4134int iterations = node.M; 4255if (node.M == node.N) 4262if (node.M == 0 && node.N == 1) 4268Debug.Assert(node.N > node.M); 4269int minIterations = node.M; 4385Debug.Assert(node.M == 0 && node.N == 1); 4423Debug.Assert(node.M < int.MaxValue, $"Unexpected M={node.M}"); 4424Debug.Assert(node.M == node.N, $"Unexpected M={node.M} == N={node.N}"); 4433using (EmitBlock(writer, $"for (int {i} = 0; {i} < {node.M}; {i}++)")) 4443Debug.Assert(node.M < int.MaxValue, $"Unexpected M={node.M}"); 4444Debug.Assert(node.N >= node.M, $"Unexpected M={node.M}, N={node.N}"); 4448int minIterations = node.M; 5594RegexNodeKind.Capture when node.M == -1 && node.N != -1 => $"Non-capturing balancing group. Uncaptures the {DescribeCapture(node.N, rm)}.", 5595RegexNodeKind.Capture when node.N != -1 => $"Balancing group. Captures the {DescribeCapture(node.M, rm)} and uncaptures the {DescribeCapture(node.N, rm)}.", 5596RegexNodeKind.Capture when node.N == -1 => $"{DescribeCapture(node.M, rm)}.", 5603RegexNodeKind.Loop or RegexNodeKind.Lazyloop => node.M == 0 && node.N == 1 ? $"Optional ({(node.Kind is RegexNodeKind.Loop ? "greedy" : "lazy")})." : $"Loop {DescribeLoop(node, rm)}{direction}.", 5613RegexNodeKind.Backreference => $"Match the same text as matched by the {DescribeCapture(node.M, rm)}{direction}.", 5619RegexNodeKind.BackreferenceConditional => $"Conditionally match one of two expressions depending on whether the {DescribeCapture(node.M, rm)} matched.", 5831_ when node.M == node.N => "exactly", 5839node.M == node.N ? $" {node.M} times" : 5840(node.M, node.N) switch 5845(_, int.MaxValue) => $" at least {node.M} times", 5848_ => $" at least {node.M} and at most {node.N} times"