Skip to content

Commit

Permalink
Fast-track ASCII/UTF8 conversion in wasm
Browse files Browse the repository at this point in the history
  • Loading branch information
GrabYourPitchforks committed Apr 9, 2021
1 parent 9803888 commit d7eae3b
Showing 1 changed file with 14 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ public static OperationStatus TranscodeToUtf16(byte* pInputBuffer, int inputLeng
Debug.Assert(outputCharsRemaining >= 0, "Destination length must not be negative.");
Debug.Assert(pOutputBuffer != null || outputCharsRemaining == 0, "Destination length must be zero if destination buffer pointer is null.");

var input = new ReadOnlySpan<byte>(pInputBuffer, inputLength);
var output = new Span<char>(pOutputBuffer, outputCharsRemaining);
// try fast-tracking ASCII first before falling back to the standard loop
int numAsciiBytesTranscoded = (int)ASCIIUtility.WidenAsciiToUtf16(pInputBuffer, pOutputBuffer, (uint)Math.Min(inputLength, outputCharsRemaining));
var input = new ReadOnlySpan<byte>(pInputBuffer, inputLength).Slice(numAsciiBytesTranscoded);
var output = new Span<char>(pOutputBuffer, outputCharsRemaining).Slice(numAsciiBytesTranscoded);

OperationStatus opStatus = OperationStatus.Done;
while (!input.IsEmpty)
Expand Down Expand Up @@ -49,9 +51,10 @@ public static OperationStatus TranscodeToUtf8(char* pInputBuffer, int inputLengt
Debug.Assert(outputBytesRemaining >= 0, "Destination length must not be negative.");
Debug.Assert(pOutputBuffer != null || outputBytesRemaining == 0, "Destination length must be zero if destination buffer pointer is null.");


var input = new ReadOnlySpan<char>(pInputBuffer, inputLength);
var output = new Span<byte>(pOutputBuffer, outputBytesRemaining);
// try fast-tracking ASCII first before falling back to the standard loop
int numAsciiCharsTranscoded = (int)ASCIIUtility.NarrowUtf16ToAscii(pInputBuffer, pOutputBuffer, (uint)Math.Min(inputLength, outputBytesRemaining));
var input = new ReadOnlySpan<char>(pInputBuffer, inputLength).Slice(numAsciiCharsTranscoded);
var output = new Span<byte>(pOutputBuffer, outputBytesRemaining).Slice(numAsciiCharsTranscoded);

OperationStatus opStatus = OperationStatus.Done;
while (!input.IsEmpty)
Expand Down Expand Up @@ -86,9 +89,12 @@ public static OperationStatus TranscodeToUtf8(char* pInputBuffer, int inputLengt
Debug.Assert(inputLength >= 0, "Input length must not be negative.");
Debug.Assert(pInputBuffer != null || inputLength == 0, "Input length must be zero if input buffer pointer is null.");

var input = new ReadOnlySpan<byte>(pInputBuffer, inputLength);
int cumulativeUtf16CodeUnitCount = 0;
int cumulativeScalarValueCount = 0;
// try fast-tracking ASCII first before falling back to the standard loop
int numLeadingAsciiBytes = (int)ASCIIUtility.GetIndexOfFirstNonAsciiByte(pInputBuffer, (uint)inputLength);
var input = new ReadOnlySpan<byte>(pInputBuffer, inputLength).Slice(numLeadingAsciiBytes);
int cumulativeUtf16CodeUnitCount = numLeadingAsciiBytes;
int cumulativeScalarValueCount = numLeadingAsciiBytes;

while (!input.IsEmpty)
{
if (Rune.DecodeFromUtf8(input, out Rune rune, out int bytesConsumed) != OperationStatus.Done)
Expand Down

0 comments on commit d7eae3b

Please sign in to comment.