From 19d006cea7f047c1d8865cb3ef29757051c915d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid=20N=C3=A9meti?= Date: Fri, 30 Aug 2024 12:03:57 +0200 Subject: [PATCH] using string.IndexOf overload with StringComparison.Ordinal parameter to improve performance which has a regression in .NET (Core) since ICU is being used --- Irony/Parsing/Terminals/CommentTerminal.cs | 2 +- Irony/Parsing/Terminals/FreeTextLiteral.cs | 2 +- Irony/Parsing/Terminals/QuotedValueLiteral.cs | 2 +- Irony/Parsing/Terminals/StringLiteral.cs | 4 ++-- Irony/Parsing/Terminals/WikiTerminals/WikiBlockTerminal.cs | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Irony/Parsing/Terminals/CommentTerminal.cs b/Irony/Parsing/Terminals/CommentTerminal.cs index f1a0b6d..a7da65d 100644 --- a/Irony/Parsing/Terminals/CommentTerminal.cs +++ b/Irony/Parsing/Terminals/CommentTerminal.cs @@ -86,7 +86,7 @@ private Token CompleteMatch(ParsingContext context, ISourceStream source) { while (!source.EOF()) { int firstCharPos; if (EndSymbols.Count == 1) - firstCharPos = source.Text.IndexOf(EndSymbols[0], source.PreviewPosition); + firstCharPos = source.Text.IndexOf(EndSymbols[0], source.PreviewPosition, StringComparison.Ordinal); else firstCharPos = source.Text.IndexOfAny(_endSymbolsFirsts, source.PreviewPosition); if (firstCharPos < 0) { diff --git a/Irony/Parsing/Terminals/FreeTextLiteral.cs b/Irony/Parsing/Terminals/FreeTextLiteral.cs index 7cccdc8..3b0e800 100644 --- a/Irony/Parsing/Terminals/FreeTextLiteral.cs +++ b/Irony/Parsing/Terminals/FreeTextLiteral.cs @@ -84,7 +84,7 @@ private bool TryMatchPrefixes(ParsingContext context, ISourceStream source) { private Token TryMatchContentSimple(ParsingContext context, ISourceStream source) { var startPos = source.PreviewPosition; var termLen = _singleTerminator.Length; - var stringComp = Grammar.CaseSensitive ? StringComparison.InvariantCulture : StringComparison.InvariantCultureIgnoreCase; + var stringComp = Grammar.CaseSensitive ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; int termPos = source.Text.IndexOf(_singleTerminator, startPos, stringComp); if (termPos < 0 && IsSet(FreeTextOptions.AllowEof)) termPos = source.Text.Length; diff --git a/Irony/Parsing/Terminals/QuotedValueLiteral.cs b/Irony/Parsing/Terminals/QuotedValueLiteral.cs index eb54872..f19cac4 100644 --- a/Irony/Parsing/Terminals/QuotedValueLiteral.cs +++ b/Irony/Parsing/Terminals/QuotedValueLiteral.cs @@ -22,7 +22,7 @@ public override IList GetFirsts() { protected override string ReadBody(ParsingContext context, ISourceStream source) { if (!source.MatchSymbol(StartSymbol)) return null; //this will result in null returned from TryMatch, no token var start = source.Location.Position + StartSymbol.Length; - var end = source.Text.IndexOf(EndSymbol, start); + var end = source.Text.IndexOf(EndSymbol, start, StringComparison.Ordinal); if (end < 0) return null; var body = source.Text.Substring(start, end - start); source.PreviewPosition = end + EndSymbol.Length; //move beyond the end of EndSymbol diff --git a/Irony/Parsing/Terminals/StringLiteral.cs b/Irony/Parsing/Terminals/StringLiteral.cs index 180d5d7..d5d9025 100644 --- a/Irony/Parsing/Terminals/StringLiteral.cs +++ b/Irony/Parsing/Terminals/StringLiteral.cs @@ -185,7 +185,7 @@ private bool CompleteReadBody(ISourceStream source, CompoundTokenDetails details int nlPos = lineBreakAllowed ? -1 : source.Text.IndexOf('\n', source.PreviewPosition); //fix by ashmind for EOF right after opening symbol while (true) { - int endPos = source.Text.IndexOf(endQuoteSymbol, source.PreviewPosition); + int endPos = source.Text.IndexOf(endQuoteSymbol, source.PreviewPosition, StringComparison.Ordinal); //Check for partial token in line-scanning mode if (endPos < 0 && details.PartialOk && lineBreakAllowed) { ProcessPartialBody(source, details); @@ -324,7 +324,7 @@ protected override bool ConvertValue(CompoundTokenDetails details) { //Check for doubled end symbol string endSymbol = details.EndSymbol; - if (details.IsSet((short)StringOptions.AllowsDoubledQuote) && value.IndexOf(endSymbol) >= 0) + if (details.IsSet((short)StringOptions.AllowsDoubledQuote) && value.IndexOf(endSymbol, StringComparison.Ordinal) >= 0) value = value.Replace(endSymbol + endSymbol, endSymbol); if (details.IsSet((short)StringOptions.IsChar)) { diff --git a/Irony/Parsing/Terminals/WikiTerminals/WikiBlockTerminal.cs b/Irony/Parsing/Terminals/WikiTerminals/WikiBlockTerminal.cs index eda0e0c..6fd6c06 100644 --- a/Irony/Parsing/Terminals/WikiTerminals/WikiBlockTerminal.cs +++ b/Irony/Parsing/Terminals/WikiTerminals/WikiBlockTerminal.cs @@ -26,7 +26,7 @@ public WikiBlockTerminal(string name, WikiBlockType blockType, string openTag, s public override Token TryMatch(ParsingContext context, ISourceStream source) { if (!source.MatchSymbol(OpenTag)) return null; source.PreviewPosition += OpenTag.Length; - var endPos = source.Text.IndexOf(CloseTag, source.PreviewPosition); + var endPos = source.Text.IndexOf(CloseTag, source.PreviewPosition, StringComparison.Ordinal); string content; if(endPos > 0) { content = source.Text.Substring(source.PreviewPosition, endPos - source.PreviewPosition);