/*
* 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)
{
// 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);
}
}
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);
}