/* * Internal worker called by all the public APIs */ internal Match Run(bool quick, int prevlen, string input, int beginning, int length, int startat) { Match match; RegexRunner runner = null; if (startat < 0 || startat > input.Length) { throw new ArgumentOutOfRangeException(nameof(startat), SR.BeginIndexNotNegative); } if (length < 0 || length > input.Length) { throw new ArgumentOutOfRangeException(nameof(length), SR.LengthNotNegative); } // There may be a cached runner; grab ownership of it if we can. runner = (RegexRunner)_runnerref.Get(); // Create a RegexRunner instance if we need to if (runner == null) { if (factory != null) { runner = factory.CreateInstance(); } else { runner = new RegexInterpreter(_code, UseOptionInvariant() ? CultureInfo.InvariantCulture : CultureInfo.CurrentCulture); } } try { // Do the scan starting at the requested position match = runner.Scan(this, input, beginning, beginning + length, startat, prevlen, quick, internalMatchTimeout); } finally { // Release or fill the cache slot _runnerref.Release(runner); } #if DEBUG if (Debug && match != null) { match.Dump(); } #endif return(match); }
// Internal worker called by all the public APIs internal Match Run(bool quick, int prevlen, String input, int beginning, int length, int startat) { Match match; RegexRunner runner = null; if (startat < 0 || startat > input.Length) { throw new ArgumentOutOfRangeException("start", SR.GetString(SR.BeginIndexNotNegative)); } if (length < 0 || length > input.Length) { throw new ArgumentOutOfRangeException("length", SR.GetString(SR.LengthNotNegative)); } // There may be a cached runner; grab ownership of it if we can. runner = (RegexRunner)runnerref.Get(); // Create a RegexRunner instance if we need to if (runner == null) { // Use the compiled RegexRunner factory if the code was compiled to MSIL if (factory != null) { runner = factory.CreateInstance(); } else { runner = new RegexInterpreter(code, UseOptionInvariant() ? CultureInfo.InvariantCulture : CultureInfo.CurrentCulture); } } // Do the scan starting at the requested position match = runner.Scan(this, input, beginning, beginning + length, startat, prevlen, quick); // Release or fill the cache slot runnerref.Release(runner); #if DBG if (UseOptionDebug()) { match.Dump(); } #endif return(match); }