]> zoso.dev Git - buffer.git/commitdiff
Ensure ES2016 engines construct Uint8Array (not Buffer) from Buffer.prototype.slice
authorDan Ehrenberg <littledan@chromium.org>
Thu, 14 Jan 2016 19:53:22 +0000 (11:53 -0800)
committerDan Ehrenberg <littledan@chromium.org>
Thu, 28 Jan 2016 18:56:29 +0000 (10:56 -0800)
In the ES2016 draft specification, TypedArray methods like
%TypedArray%.prototype.subarray() call out to a constructor for the result
based on the receiver. Ordinarily, the constructor is instance.constructor,
but subclasses can override this using the Symbol.species property on the
constructor.

Buffer.prototype.slice calls out to %TypedArray%.prototype.subarray, which
calls this calculated constructor with three arguments. The argument pattern
doesn't correspond to a constructor for Buffer, so without setting
Symbol.species appropriately, the wrong kind of result is created.

This patch sets Buffer[Symbol.species] to Uint8Array when appropriate, to
address the issue.

index.js

index 15d7c50f8e30de4f0eb8b2fc7afa57440a466ce6..fee0dc7ccad357e1e21627c0b5e291260fe8c049 100644 (file)
--- a/index.js
+++ b/index.js
@@ -217,6 +217,11 @@ function fromJsonObject (that, object) {
 if (Buffer.TYPED_ARRAY_SUPPORT) {
   Buffer.prototype.__proto__ = Uint8Array.prototype
   Buffer.__proto__ = Uint8Array
+  if (typeof Symbol !== 'undefined' && Symbol.species &&
+      Buffer[Symbol.species] === Buffer) {
+    Object.defineProperty(Buffer, Symbol.species,
+                          { value: null, configurable: true })
+  }
 } else {
   // pre-set for values that may exist in the future
   Buffer.prototype.length = undefined