]> zoso.dev Git - buffer.git/commitdiff
have a dedicated function for decoding code point arrays
authorJesse Tane <jesse.tane@gmail.com>
Sat, 22 Aug 2015 10:56:23 +0000 (06:56 -0400)
committerJesse Tane <jesse.tane@gmail.com>
Sat, 22 Aug 2015 10:56:23 +0000 (06:56 -0400)
index.js

index ba5eab02ead1e9750a4f4bbc3064ca833442fbd0..06f75620dbf10a38f16fe6f73d03203a41d90051 100644 (file)
--- a/index.js
+++ b/index.js
@@ -692,7 +692,30 @@ function utf8Slice (buf, start, end) {
     i += bytesPerSequence
   }
 
-  return binarySlice(res, 0, res.length)
+  return decodeCodePointsArray(res)
+}
+
+// Based on http://stackoverflow.com/a/22747272/680742, the browser with
+// the lowest limit is Chrome, with 0x10000 args.
+// We go 1 magnitude less, for safety
+var MAX_ARGUMENTS_LENGTH = 0x1000
+
+function decodeCodePointsArray (codePoints) {
+  var len = codePoints.length
+  if (len <= MAX_ARGUMENTS_LENGTH) {
+    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
+  }
+
+  // Decode in chunks to avoid "call stack size exceeded".
+  var res = ''
+  var i = 0
+  while (i < len) {
+    res += String.fromCharCode.apply(
+      String,
+      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
+    )
+  }
+  return res
 }
 
 function asciiSlice (buf, start, end) {