11 writes to M
System.Text.RegularExpressions (11)
System\Text\RegularExpressions\RegexNode.cs (11)
75M = m; 82M = m; 98newNode.M = M - 1; 153M = min; 200M = N = 0; 209M = N = 0; 885u.M = min = ((int.MaxValue - 1) / u.M < min) ? int.MaxValue : u.M * min; 1802currentNode.M += nextNode.M; 1816currentNode.M++; 1843currentNode.M += matchingCharsInMulti; 1885currentNode.M = nextNode.M + 1;
177 references to M
System.Text.RegularExpressions (177)
System\Text\RegularExpressions\RegexCompiler.cs (35)
1343if (target.LoopNode.M > 0) 1358Ldc(target.LoopNode.M); 1855int capnum = RegexParser.MapCaptureNumber(node.M, _regexTree!.CaptureNumberSparseMapping); 2037int capnum = RegexParser.MapCaptureNumber(node.M, _regexTree!.CaptureNumberSparseMapping); 2390int capnum = RegexParser.MapCaptureNumber(node.M, _regexTree!.CaptureNumberSparseMapping); 3297if (node.M == node.N) 3307Debug.Assert(node.M < node.N); 3337if (node.M > 0) 3340Ldc(!rtl ? node.M : -node.M); 3508if (node.M > 0) 3515if (node.M == node.N || analysis.IsAtomicByAncestor(node)) 3520Debug.Assert(node.M < node.N); 3534maxIterations = node.N - node.M; 3851Debug.Assert(node.M < int.MaxValue, $"Unexpected M={node.M}"); 3852Debug.Assert(node.N >= node.M, $"Unexpected M={node.M}, N={node.N}"); 3856int minIterations = node.M; 4214int iterations = node.M; 4364if (node.M == node.N) 4371if (node.M == 0 && node.N == 1) 4377Debug.Assert(node.N > node.M); 4378int minIterations = node.M; 4609Debug.Assert(node.M == 0 && node.N == 1); 4698Debug.Assert(node.M < int.MaxValue, $"Unexpected M={node.M}"); 4699Debug.Assert(node.M == node.N, $"Unexpected M={node.M} == N={node.N}"); 4729Ldc(node.M); 4736Debug.Assert(node.M < int.MaxValue, $"Unexpected M={node.M}"); 4737Debug.Assert(node.N >= node.M, $"Unexpected M={node.M}, N={node.N}"); 4741int minIterations = node.M;
System\Text\RegularExpressions\RegexFindOptimizations.cs (1)
845if ((i - prev - 1) < loopNode.M)
System\Text\RegularExpressions\RegexNode.cs (73)
92Debug.Assert(M > 0); 98newNode.M = M - 1; 182N = M; 207RegexNode loopAsChild = new(RegexNodeKind.Loop, Options, M, N); 218N = M; 831int min = M; 876if (u.M == 0 && child.M > 1 || child.N < child.M * 2) 883if (u.M > 0) 885u.M = min = ((int.MaxValue - 1) / u.M < min) ? int.MaxValue : u.M * min; 910child.MakeRep(u.Kind == RegexNodeKind.Lazyloop ? RegexNodeKind.Onelazy : RegexNodeKind.Oneloop, u.M, u.N); 935u = u.M == 0 ? new RegexNode(RegexNodeKind.Empty, Options) : child; 1227case RegexNodeKind.Oneloop or RegexNodeKind.Notoneloop or RegexNodeKind.Setloop or RegexNodeKind.Onelazy or RegexNodeKind.Notonelazy or RegexNodeKind.Setlazy when required.M == required.N: 1245required.M != other.M || 1507Debug.Assert(Kind is RegexNodeKind.One or RegexNodeKind.Multi || (IsOneFamily && M > 0)); 1523case RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Onelazy when node.M > 0: 1525case RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic or RegexNodeKind.Notonelazy when node.M > 0: 1527case RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy when node.M > 0: 1535case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when node.M > 0: 1787if (nextNode.M > 0 && 1797if (!CanCombineCounts(currentNode.M, currentNode.N, nextNode.M, nextNode.N)) 1802currentNode.M += nextNode.M; 1814if (CanCombineCounts(currentNode.M, currentNode.N, 1, 1)) 1840if (CanCombineCounts(currentNode.M, currentNode.N, matchingCharsInMulti, matchingCharsInMulti)) 1882if (CanCombineCounts(1, 1, nextNode.M, nextNode.N)) 1885currentNode.M = nextNode.M + 1; 2298case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when subsequent.M > 0: 2353case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && node.Ch != subsequent.Ch: 2354case RegexNodeKind.Notonelazy or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic when subsequent.M > 0 && node.Ch == subsequent.Ch: 2355case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.Str!): 2359case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsBoundaryWordChar(node.Ch): 2360case RegexNodeKind.NonBoundary when node.M > 0 && !RegexCharClass.IsBoundaryWordChar(node.Ch): 2361case RegexNodeKind.ECMABoundary when node.M > 0 && RegexCharClass.IsECMAWordChar(node.Ch): 2362case RegexNodeKind.NonECMABoundary when node.M > 0 && !RegexCharClass.IsECMAWordChar(node.Ch): 2365case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && node.Ch != subsequent.Ch: 2366case RegexNodeKind.Notonelazy or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic when subsequent.M == 0 && node.Ch == subsequent.Ch: 2367case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.Str!): 2381case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && node.Ch == subsequent.Ch: 2386case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && node.Ch == subsequent.Ch: 2401case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.Str!): 2402case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.MayOverlap(node.Str!, subsequent.Str!): 2406case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsKnownWordClassSubset(node.Str!): 2407case RegexNodeKind.NonBoundary when node.M > 0 && node.Str is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass: 2408case RegexNodeKind.ECMABoundary when node.M > 0 && node.Str is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass: 2409case RegexNodeKind.NonECMABoundary when node.M > 0 && node.Str is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass: 2412case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.Str!): 2413case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.MayOverlap(node.Str!, subsequent.Str!): 2448case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && !CharInStartingOrEndingSet(subsequent.Ch): 2449case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !MayOverlapStartingOrEndingSet(subsequent.Str!): 2453case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsKnownWordClassSubset(loopStartingSet) && RegexCharClass.IsKnownWordClassSubset(loopEndingSet): 2454case RegexNodeKind.NonBoundary when node.M > 0 && (loopStartingSet is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass) && (loopEndingSet is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass): 2455case RegexNodeKind.ECMABoundary when node.M > 0 && (loopStartingSet is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass) && (loopEndingSet is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass): 2456case RegexNodeKind.NonECMABoundary when node.M > 0 && (loopStartingSet is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass) && (loopEndingSet is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass): 2459case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !CharInStartingOrEndingSet(subsequent.Ch): 2460case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !MayOverlapStartingOrEndingSet(subsequent.Str!): 2608return M; 2613return (int)Math.Min(int.MaxValue - 1, (long)M * Child(0).ComputeMinLength()); 2881(child.Kind is RegexNodeKind.Setloop or RegexNodeKind.Setlazy or RegexNodeKind.Setloopatomic && child.M == child.N)) 2890vsb.Append((char)(twoChars[0] | 0x20), child.Kind is RegexNodeKind.Set ? 1 : child.M); 2952when node.M == node.N => true, 3212sb.Append(' ').Append($"index = {M}"); 3220sb.Append(' ').Append($"index = {M}"); 3252(M == 0 && N == int.MaxValue) ? "*" : 3253(M == 0 && N == 1) ? "?" : 3254(M == 1 && N == int.MaxValue) ? "+" : 3255(N == int.MaxValue) ? $"{{{M}, *}}" : 3256(N == M) ? $"{{{M}}}" : 3257$"{{{M}, {N}}}");
System\Text\RegularExpressions\RegexNodeKind.cs (14)
31/// The character is specified in <see cref="RegexNode.Ch"/>, the minimum number of iterations in <see cref="RegexNode.M"/>, and the maximum number of iterations in <see cref="RegexNode.N"/>. 36/// <remarks>The character is specified in <see cref="RegexNode.Ch"/>, the minimum number of iterations in <see cref="RegexNode.M"/>, and the maximum number of iterations in <see cref="RegexNode.N"/>.</remarks> 40/// <remarks>The <see cref="RegexCharClass"/> set string is specified in <see cref="RegexNode.Str"/>, the minimum number of iterations in <see cref="RegexNode.M"/>, and the maximum number of iterations in <see cref="RegexNode.N"/>.</remarks> 45/// <remarks>The character is specified in <see cref="RegexNode.Ch"/>, the minimum number of iterations in <see cref="RegexNode.M"/>, and the maximum number of iterations in <see cref="RegexNode.N"/>.</remarks> 49/// <remarks>The character is specified in <see cref="RegexNode.Ch"/>, the minimum number of iterations in <see cref="RegexNode.M"/>, and the maximum number of iterations in <see cref="RegexNode.N"/>.</remarks> 53/// <remarks>The <see cref="RegexCharClass"/> set string is specified in <see cref="RegexNode.Str"/>, the minimum number of iterations in <see cref="RegexNode.M"/>, and the maximum number of iterations in <see cref="RegexNode.N"/>.</remarks> 59/// The character is specified in <see cref="RegexNode.Ch"/>, the minimum number of iterations in <see cref="RegexNode.M"/>, and the maximum number of iterations in <see cref="RegexNode.N"/>. 65/// The character is specified in <see cref="RegexNode.Ch"/>, the minimum number of iterations in <see cref="RegexNode.M"/>, and the maximum number of iterations in <see cref="RegexNode.N"/>. 71/// The <see cref="RegexCharClass"/> set string is specified in <see cref="RegexNode.Str"/>, the minimum number of iterations in <see cref="RegexNode.M"/>, and the maximum number of iterations in <see cref="RegexNode.N"/>. 77/// <remarks>The capture group number referenced is stored in <see cref="RegexNode.M"/>.</remarks> 128/// One and only one child, the expression in the loop. The minimum number of iterations is in <see cref="RegexNode.M"/>, 134/// One and only one child, the expression in the loop. The minimum number of iterations is in <see cref="RegexNode.M"/>, 141/// One and only one child, the expression in the capture. <see cref="RegexNode.M"/> is the number of the capture, and if a balancing 169/// The referenced capture group number is stored in <see cref="RegexNode.M"/>.
System\Text\RegularExpressions\RegexOpcode.cs (1)
151/// For quantified constructs with a minimum of zero (<see cref="RegexNode.M"/> == 0), this opcode pushes a counter
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:
System\Text\RegularExpressions\RegexReplacement.cs (1)
65int slot = child.M;
System\Text\RegularExpressions\RegexTreeAnalyzer.cs (2)
50case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when node.M != node.N: 51case RegexNodeKind.Oneloop or RegexNodeKind.Notoneloop or RegexNodeKind.Setloop or RegexNodeKind.Onelazy or RegexNodeKind.Notonelazy or RegexNodeKind.Setlazy when node.M != node.N:
System\Text\RegularExpressions\RegexWriter.cs (20)
254Emit(RegexOpcode.TestBackreference, RegexParser.MapCaptureNumber(node.M, _tree.CaptureNumberSparseMapping)); 314if (node.N < int.MaxValue || node.M > 1) 315Emit(node.M == 0 ? RegexOpcode.Nullcount : RegexOpcode.Setcount, node.M == 0 ? 0 : 1 - node.M); 317Emit(node.M == 0 ? RegexOpcode.Nullmark : RegexOpcode.Setmark); 319if (node.M == 0) 333if (node.N < int.MaxValue || node.M > 1) 334Emit(RegexOpcode.Branchcount + Lazy, _intStack.Pop(), node.N == int.MaxValue ? int.MaxValue : node.N - node.M); 338if (node.M == 0) 348Emit(RegexOpcode.Capturemark, RegexParser.MapCaptureNumber(node.M, _tree.CaptureNumberSparseMapping), RegexParser.MapCaptureNumber(node.N, _tree.CaptureNumberSparseMapping)); 392if (node.M > 0) 395RegexOpcode.Onerep : RegexOpcode.Notonerep) | bits, node.Ch, node.M); 397if (node.N > node.M) 399Emit((RegexOpcode)node.Kind | bits, node.Ch, node.N == int.MaxValue ? int.MaxValue : node.N - node.M); 408if (node.M > 0) 410Emit(RegexOpcode.Setrep | bits, stringCode, node.M); 412if (node.N > node.M) 414Emit((RegexOpcode)node.Kind | bits, stringCode, (node.N == int.MaxValue) ? int.MaxValue : node.N - node.M); 428Emit((RegexOpcode)node.Kind | bits, RegexParser.MapCaptureNumber(node.M, _tree.CaptureNumberSparseMapping));
System\Text\RegularExpressions\Symbolic\RegexNodeConverter.cs (4)
117result.AddLast(_builder.CreateLoop(_builder.CreateSingleton(bdd), node.Kind is RegexNodeKind.Onelazy or RegexNodeKind.Notonelazy, node.M, node.N)); 128result.AddLast(_builder.CreateLoop(_builder.CreateSingleton(setBdd), node.Kind == RegexNodeKind.Setlazy, node.M, node.N)); 260result.AddLast(_builder.CreateLoop(body, node.Kind == RegexNodeKind.Lazyloop, node.M, node.N)); 272int captureNum = RegexParser.MapCaptureNumber(node.M, _captureSparseMapping);