From fde8cbc171d35ab1990d2060a47df603bda928ec Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 2 Aug 2021 11:29:53 +0200 Subject: [PATCH] improve performance of mappings serialization --- lib/helpers/createMappingsSerializer.js | 87 +++++++++++++++++-------- 1 file changed, 59 insertions(+), 28 deletions(-) diff --git a/lib/helpers/createMappingsSerializer.js b/lib/helpers/createMappingsSerializer.js index e554b16..8dafe43 100644 --- a/lib/helpers/createMappingsSerializer.js +++ b/lib/helpers/createMappingsSerializer.js @@ -70,10 +70,6 @@ const createFullMappingsSerializer = () => { } const writeValue = value => { - if (value === 0) { - str += "A"; - return; - } const sign = (value >>> 31) & 1; const mask = value >> 31; const absValue = (value + mask) ^ mask; @@ -93,12 +89,20 @@ const createFullMappingsSerializer = () => { currentColumn = generatedColumn; if (sourceIndex >= 0) { activeMapping = true; - writeValue(sourceIndex - currentSourceIndex); - currentSourceIndex = sourceIndex; + if (sourceIndex === currentSourceIndex) { + str += "A"; + } else { + writeValue(sourceIndex - currentSourceIndex); + currentSourceIndex = sourceIndex; + } writeValue(originalLine - currentOriginalLine); currentOriginalLine = originalLine; - writeValue(originalColumn - currentOriginalColumn); - currentOriginalColumn = originalColumn; + if (originalColumn === currentOriginalColumn) { + str += "A"; + } else { + writeValue(originalColumn - currentOriginalColumn); + currentOriginalColumn = originalColumn; + } if (nameIndex >= 0) { writeValue(nameIndex - currentNameIndex); currentNameIndex = nameIndex; @@ -126,24 +130,16 @@ const createLinesOnlyMappingsSerializer = () => { _originalColumn, _nameIndex ) => { - let str = ""; if (sourceIndex < 0) { // avoid writing generated mappings at all - return str; + return ""; } if (lastWrittenLine === generatedLine) { // avoid writing multiple original mappings per line - return str; - } - while (currentLine < generatedLine) { - str += ";"; - currentLine++; + return ""; } + let str; const writeValue = value => { - if (value === 0) { - str += "A"; - return; - } const sign = (value >>> 31) & 1; const mask = value >> 31; const absValue = (value + mask) ^ mask; @@ -159,16 +155,51 @@ const createLinesOnlyMappingsSerializer = () => { } } }; - str += "A"; - if (sourceIndex >= 0) { - lastWrittenLine = currentLine; - writeValue(sourceIndex - currentSourceIndex); - currentSourceIndex = sourceIndex; - writeValue(originalLine - currentOriginalLine); - currentOriginalLine = originalLine; - str += "A"; + lastWrittenLine = generatedLine; + if (generatedLine === currentLine + 1) { + currentLine = generatedLine; + if (sourceIndex === currentSourceIndex) { + currentSourceIndex = sourceIndex; + if (originalLine === currentOriginalLine + 1) { + currentOriginalLine = originalLine; + return ";AACA"; + } else { + str = ";AA"; + writeValue(originalLine - currentOriginalLine); + currentOriginalLine = originalLine; + return str + "A"; + } + } else { + str = ";A"; + writeValue(sourceIndex - currentSourceIndex); + currentSourceIndex = sourceIndex; + writeValue(originalLine - currentOriginalLine); + currentOriginalLine = originalLine; + return str + "A"; + } + } else { + str = ";".repeat(generatedLine - currentLine); + currentLine = generatedLine; + if (sourceIndex === currentSourceIndex) { + currentSourceIndex = sourceIndex; + if (originalLine === currentOriginalLine + 1) { + currentOriginalLine = originalLine; + return str + "AACA"; + } else { + str += "AA"; + writeValue(originalLine - currentOriginalLine); + currentOriginalLine = originalLine; + return str + "A"; + } + } else { + str += "A"; + writeValue(sourceIndex - currentSourceIndex); + currentSourceIndex = sourceIndex; + writeValue(originalLine - currentOriginalLine); + currentOriginalLine = originalLine; + return str + "A"; + } } - return str; }; };