diff --git a/lib/internal/source_map/source_map_cache.js b/lib/internal/source_map/source_map_cache.js index 2813da21dfdc63..963b34ebcd241e 100644 --- a/lib/internal/source_map/source_map_cache.js +++ b/lib/internal/source_map/source_map_cache.js @@ -1,12 +1,12 @@ 'use strict'; const { - ArrayPrototypeMap, + ArrayPrototypePush, JSONParse, ObjectKeys, RegExpPrototypeExec, - RegExpPrototypeSymbolSplit, SafeMap, + StringPrototypeCodePointAt, StringPrototypeSplit, } = primordials; @@ -205,14 +205,26 @@ function dataFromUrl(sourceURL, sourceMappingURL) { // from. This allows translation from byte offset V8 coverage reports, // to line/column offset Source Map V3. function lineLengths(content) { - // We purposefully keep \r as part of the line-length calculation, in - // cases where there is a \r\n separator, so that this can be taken into - // account in coverage calculations. - return ArrayPrototypeMap(RegExpPrototypeSymbolSplit(/\n|\u2028|\u2029/, content), (line) => { - return line.length; - }); + const contentLength = content.length; + const output = []; + let lineLength = 0; + for (let i = 0; i < contentLength; i++, lineLength++) { + const codePoint = StringPrototypeCodePointAt(content, i); + + // We purposefully keep \r as part of the line-length calculation, in + // cases where there is a \r\n separator, so that this can be taken into + // account in coverage calculations. + // codepoints for \n (new line), \u2028 (line separator) and \u2029 (paragraph separator) + if (codePoint === 10 || codePoint === 0x2028 || codePoint === 0x2029) { + ArrayPrototypePush(output, lineLength); + lineLength = -1; // To not count the matched codePoint such as \n character + } + } + ArrayPrototypePush(output, lineLength); + return output; } + function sourceMapFromFile(mapURL) { try { const fs = require('fs');