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');