]> zoso.dev Git - buffer.git/commitdiff
fix call stack exceeded in #69
authorNolan Lawson <nolan.lawson@gmail.com>
Sat, 15 Aug 2015 15:11:02 +0000 (11:11 -0400)
committerNolan Lawson <nolan.lawson@gmail.com>
Sat, 15 Aug 2015 15:37:05 +0000 (11:37 -0400)
index.js

index 86ef1a30b09748b8facbc31d0ef4049e4745abdd..ec7b75d081ca49421eda7dd170ca639fe0ce920c 100644 (file)
--- a/index.js
+++ b/index.js
@@ -622,6 +622,28 @@ function base64Slice (buf, start, end) {
   }
 }
 
+function decodeLargeCodePointsArray (array) {
+  var res = ''
+  var i
+  var end = array.length
+
+  for (i = 0; i < end; i++) {
+    res += String.fromCharCode(array[i])
+  }
+
+  return res
+}
+
+function decodeCodePointsArray (array) {
+  if (array.length < 0x10000) {
+    return String.fromCharCode.apply(String, array)
+  }
+  // Decode using string concatenation to avoid "call stack size exceeded".
+  // Based on http://stackoverflow.com/a/22747272/680742, the browser with
+  // the lowest limit is Chrome, with 0x10000 args.
+  return decodeLargeCodePointsArray(array)
+}
+
 function utf8Slice (buf, start, end) {
   end = Math.min(buf.length, end)
   var firstByte
@@ -700,7 +722,7 @@ function utf8Slice (buf, start, end) {
     res.push(codePoint)
   }
 
-  return String.fromCharCode.apply(String, res)
+  return decodeCodePointsArray(res)
 }
 
 function asciiSlice (buf, start, end) {