From 448259a65455c38df1b8144c03420c634d8ad01d Mon Sep 17 00:00:00 2001 From: Valentin Semirulnik Date: Sun, 1 Feb 2026 19:15:37 +0400 Subject: [PATCH] perf: optimize _parseMappings with charCodeAt and remove dead code - Replace charAt() + string comparison with charCodeAt() + numeric comparison - Inline _charIsMappingSeparator function call in hot loop - Remove unused cachedSegments variable - Remove dead str = aStr.slice() that created garbage Benchmark shows ~1.3% parsing improvement (~4.6ms on 2.35M mappings). Co-Authored-By: Claude Opus 4.5 --- lib/source-map-consumer.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/source-map-consumer.js b/lib/source-map-consumer.js index ee661146..d3c4b1a8 100644 --- a/lib/source-map-consumer.js +++ b/lib/source-map-consumer.js @@ -512,15 +512,15 @@ BasicSourceMapConsumer.prototype._parseMappings = var previousName = 0; var length = aStr.length; var index = 0; - var cachedSegments = {}; var temp = {}; var originalMappings = []; var generatedMappings = []; - var mapping, str, segment, end, value; + var mapping, segment, end, value, charCode; let subarrayStart = 0; while (index < length) { - if (aStr.charAt(index) === ';') { + charCode = aStr.charCodeAt(index); + if (charCode === 59) { // ';' generatedLine++; index++; previousGeneratedColumn = 0; @@ -528,19 +528,20 @@ BasicSourceMapConsumer.prototype._parseMappings = sortGenerated(generatedMappings, subarrayStart); subarrayStart = generatedMappings.length; } - else if (aStr.charAt(index) === ',') { + else if (charCode === 44) { // ',' index++; } else { mapping = new Mapping(); mapping.generatedLine = generatedLine; + // Find end of segment (next ';' or ',') for (end = index; end < length; end++) { - if (this._charIsMappingSeparator(aStr, end)) { + charCode = aStr.charCodeAt(end); + if (charCode === 44 || charCode === 59) { // ',' or ';' break; } } - str = aStr.slice(index, end); segment = []; while (index < end) {