Skip to content

Commit

Permalink
Merge pull request #531 from MihaZupan/random-perf-3
Browse files Browse the repository at this point in the history
A handful of codegen improvements
  • Loading branch information
xoofx committed Mar 15, 2021
2 parents da0ba34 + 6204095 commit c680910
Show file tree
Hide file tree
Showing 25 changed files with 1,466 additions and 1,442 deletions.
4 changes: 2 additions & 2 deletions src/Markdig.Tests/TestHtmlHelper.cs
Expand Up @@ -14,7 +14,7 @@ public void TestParseHtmlTagSimple()
{
var inputTag = "<a>";
var text = new StringSlice(inputTag);
Assert.True(HtmlHelper.TryParseHtmlTag(text, out string outputTag));
Assert.True(HtmlHelper.TryParseHtmlTag(ref text, out string outputTag));
Assert.AreEqual(inputTag, outputTag);
}

Expand All @@ -23,7 +23,7 @@ public void TestParseHtmlTagSimpleWithAttribute()
{
var inputTag = "<a href='http://google.com'>";
var text = new StringSlice(inputTag);
Assert.True(HtmlHelper.TryParseHtmlTag(text, out string outputTag));
Assert.True(HtmlHelper.TryParseHtmlTag(ref text, out string outputTag));
Assert.AreEqual(inputTag, outputTag);
}
}
Expand Down
28 changes: 28 additions & 0 deletions src/Markdig.Tests/TestStringSliceList.cs
Expand Up @@ -153,5 +153,33 @@ public void TestStringLineGroupIteratorPeekChar()

Assert.Throws<ArgumentOutOfRangeException>(() => iterator.PeekChar(-1));
}

[Test]
public void TestIteratorSkipChar()
{
var lineGroup = new StringLineGroup(4)
{
new StringSlice("ABC", NewLine.LineFeed),
new StringSlice("E", NewLine.LineFeed)
};

Test(lineGroup.ToCharIterator());

Test(new StringSlice("ABC\nE\n"));

Test(new StringSlice("Foo\nABC\nE\n", 4, 9));

static void Test<T>(T iterator) where T : ICharIterator
{
Assert.AreEqual('A', iterator.CurrentChar); iterator.SkipChar();
Assert.AreEqual('B', iterator.CurrentChar); iterator.SkipChar();
Assert.AreEqual('C', iterator.CurrentChar); iterator.SkipChar();
Assert.AreEqual('\n', iterator.CurrentChar); iterator.SkipChar();
Assert.AreEqual('E', iterator.CurrentChar); iterator.SkipChar();
Assert.AreEqual('\n', iterator.CurrentChar); iterator.SkipChar();
Assert.AreEqual('\0', iterator.CurrentChar); iterator.SkipChar();
Assert.AreEqual('\0', iterator.CurrentChar); iterator.SkipChar();
}
}
}
}
2 changes: 1 addition & 1 deletion src/Markdig/Extensions/Abbreviations/AbbreviationParser.cs
Expand Up @@ -51,7 +51,7 @@ public override BlockState TryOpen(BlockProcessor processor)
{
return BlockState.None;
}
slice.NextChar();
slice.SkipChar();

slice.Trim();

Expand Down
Expand Up @@ -109,7 +109,7 @@ public static bool TryParse(ref StringSlice slice, [NotNullWhen(true)] out HtmlA
if (c == '}')
{
isValid = true;
line.NextChar(); // skip }
line.SkipChar(); // skip }
break;
}

Expand Down Expand Up @@ -191,7 +191,7 @@ public static bool TryParse(ref StringSlice slice, [NotNullWhen(true)] out HtmlA
}

// Go to next char, skip any spaces
line.NextChar();
line.SkipChar();
line.TrimStart();

int startValue = -1;
Expand Down
27 changes: 22 additions & 5 deletions src/Markdig/Extensions/Globalization/GlobalizationExtension.cs
Expand Up @@ -10,6 +10,7 @@
using Markdig.Syntax;
using Markdig.Syntax.Inlines;
using System.Collections.Generic;
using System.Diagnostics;

namespace Markdig.Extensions.Globalization
{
Expand Down Expand Up @@ -51,7 +52,7 @@ public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer)

}

private bool ShouldBeRightToLeft(MarkdownObject item)
private static bool ShouldBeRightToLeft(MarkdownObject item)
{
if (item is IEnumerable<MarkdownObject> container)
{
Expand Down Expand Up @@ -88,14 +89,30 @@ private bool ShouldBeRightToLeft(MarkdownObject item)
return false;
}

private bool StartsWithRtlCharacter(StringSlice slice)
private static bool StartsWithRtlCharacter(StringSlice slice)
{
foreach (var c in CharHelper.ToUtf32(slice))
for (int i = slice.Start; i <= slice.End; i++)
{
if (CharHelper.IsRightToLeft(c))
if (slice[i] < 128)
{
continue;
}

int rune;
if (CharHelper.IsHighSurrogate(slice[i]) && i < slice.End && CharHelper.IsLowSurrogate(slice[i + 1]))
{
Debug.Assert(char.IsSurrogatePair(slice[i], slice[i + 1]));
rune = char.ConvertToUtf32(slice[i], slice[i + 1]);
}
else
{
rune = slice[i];
}

if (CharHelper.IsRightToLeft(rune))
return true;

else if (CharHelper.IsLeftToRight(c))
if (CharHelper.IsLeftToRight(rune))
return false;
}

Expand Down
Expand Up @@ -52,7 +52,7 @@ public override bool Match(InlineProcessor processor, ref StringSlice slice)
type = SmartyPantType.Quote; // We will resolve them at the end of parsing all inlines
if (slice.PeekChar() == '\'')
{
slice.NextChar();
slice.SkipChar();
type = SmartyPantType.DoubleQuote; // We will resolve them at the end of parsing all inlines
}
break;
Expand Down
13 changes: 7 additions & 6 deletions src/Markdig/Extensions/Tables/GridTableParser.cs
Expand Up @@ -33,7 +33,7 @@ public override BlockState TryOpen(BlockProcessor processor)
while (c == '+')
{
var columnStart = line.Start;
line.NextChar();
line.SkipChar();
line.TrimStart();

// if we have reached the end of the line, exit
Expand Down Expand Up @@ -161,15 +161,16 @@ private static void SetRowSpanState(List<GridTableState.ColumnSlice> columns, St

private static bool IsRowSeperator(StringSlice slice)
{
while (slice.Length > 0)
char c = slice.CurrentChar;
do
{
if (slice.CurrentChar != '-' && slice.CurrentChar != '=' && slice.CurrentChar != ':')
if (c != '-' && c != '=' && c != ':')
{
return false;
return c == '\0';
}
slice.NextChar();
c = slice.NextChar();
}
return true;
while (true);
}

private static void TerminateCurrentRow(BlockProcessor processor, GridTableState tableState, Table gridTable, bool isLastRow)
Expand Down
2 changes: 1 addition & 1 deletion src/Markdig/Extensions/Tables/PipeTableParser.cs
Expand Up @@ -112,7 +112,7 @@ public override bool Match(InlineProcessor processor, ref StringSlice slice)
}
tableState.LineHasPipe = true;
tableState.LineIndex = localLineIndex;
slice.NextChar(); // Skip the `|` character
slice.SkipChar(); // Skip the `|` character

tableState.ColumnAndLineDelimiters.Add(processor.Inline);
}
Expand Down
4 changes: 2 additions & 2 deletions src/Markdig/Extensions/Tables/TableHelper.cs
Expand Up @@ -60,7 +60,7 @@ public static bool ParseColumnHeaderDetect(ref StringSlice slice, ref char delim
if (c == ':')
{
hasLeft = true;
slice.NextChar();
slice.SkipChar();
}

slice.TrimStart();
Expand Down Expand Up @@ -91,7 +91,7 @@ public static bool ParseColumnHeaderDetect(ref StringSlice slice, ref char delim
if (c == ':')
{
hasRight = true;
slice.NextChar();
slice.SkipChar();
}
slice.TrimStart();

Expand Down
2 changes: 1 addition & 1 deletion src/Markdig/Extensions/TaskLists/TaskListInlineParser.cs
Expand Up @@ -56,7 +56,7 @@ public override bool Match(InlineProcessor processor, ref StringSlice slice)
return false;
}
// Skip last ]
slice.NextChar();
slice.SkipChar();

// Create the TaskList
var taskItem = new TaskList()
Expand Down
16 changes: 0 additions & 16 deletions src/Markdig/Helpers/CharHelper.cs
Expand Up @@ -355,22 +355,6 @@ private static bool IsInInclusiveRange(char c, char min, char max)
internal static bool IsInInclusiveRange(int value, uint min, uint max)
=> ((uint)value - min) <= (max - min);

public static IEnumerable<int> ToUtf32(StringSlice text)
{
for (int i = text.Start; i <= text.End; i++)
{
if (IsHighSurrogate(text[i]) && i < text.End && IsLowSurrogate(text[i + 1]))
{
Debug.Assert(char.IsSurrogatePair(text[i], text[i + 1]));
yield return char.ConvertToUtf32(text[i], text[i + 1]);
}
else
{
yield return text[i];
}
}
}

public static bool IsRightToLeft(int c)
{
// Generated from Table D.1 of RFC3454
Expand Down

0 comments on commit c680910

Please sign in to comment.