From 2a2ec9dbc3375cd1b8be58fb2ed522247474bc20 Mon Sep 17 00:00:00 2001 From: Ojas Shirekar Date: Mon, 12 Sep 2016 12:03:34 +0530 Subject: [PATCH] buffer: add isSharedArrayBuffer checks Fixes: https://github.com/nodejs/node/issues/8440 PR-URL: https://github.com/nodejs/node/pull/8510 Reviewed-By: Brian White Reviewed-By: James M Snell Reviewed-By: Anna Henningsen --- lib/buffer.js | 11 ++++--- src/node_util.cc | 1 + .../parallel/test-buffer-sharedarraybuffer.js | 29 +++++++++++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 test/parallel/test-buffer-sharedarraybuffer.js diff --git a/lib/buffer.js b/lib/buffer.js index cefec86e9abb67..f43ec7acd8643f 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -2,7 +2,7 @@ 'use strict'; const binding = process.binding('buffer'); -const { isArrayBuffer } = process.binding('util'); +const { isArrayBuffer, isSharedArrayBuffer } = process.binding('util'); const bindingObj = {}; const internalUtil = require('internal/util'); @@ -103,7 +103,7 @@ Buffer.from = function(value, encodingOrOffset, length) { if (typeof value === 'number') throw new TypeError('"value" argument must not be a number'); - if (isArrayBuffer(value)) + if (isArrayBuffer(value) || isSharedArrayBuffer(value)) return fromArrayBuffer(value, encodingOrOffset, length); if (typeof value === 'string') @@ -264,7 +264,8 @@ function fromObject(obj) { } if (obj) { - if (isArrayBuffer(obj.buffer) || 'length' in obj) { + if (isArrayBuffer(obj.buffer) || 'length' in obj || + isSharedArrayBuffer(obj)) { if (typeof obj.length !== 'number' || obj.length !== obj.length) { return new FastBuffer(); } @@ -351,8 +352,10 @@ function base64ByteLength(str, bytes) { function byteLength(string, encoding) { if (typeof string !== 'string') { - if (ArrayBuffer.isView(string) || isArrayBuffer(string)) + if (ArrayBuffer.isView(string) || isArrayBuffer(string) || + isSharedArrayBuffer(string)) { return string.byteLength; + } string = '' + string; } diff --git a/src/node_util.cc b/src/node_util.cc index cfbd2501706173..b228af005077a4 100644 --- a/src/node_util.cc +++ b/src/node_util.cc @@ -20,6 +20,7 @@ using v8::Value; #define VALUE_METHOD_MAP(V) \ V(isArrayBuffer, IsArrayBuffer) \ + V(isSharedArrayBuffer, IsSharedArrayBuffer) \ V(isDataView, IsDataView) \ V(isDate, IsDate) \ V(isMap, IsMap) \ diff --git a/test/parallel/test-buffer-sharedarraybuffer.js b/test/parallel/test-buffer-sharedarraybuffer.js new file mode 100644 index 00000000000000..47b3a59b8653d0 --- /dev/null +++ b/test/parallel/test-buffer-sharedarraybuffer.js @@ -0,0 +1,29 @@ +/*global SharedArrayBuffer*/ +'use strict'; +// Flags: --harmony-sharedarraybuffer + +require('../common'); +const assert = require('assert'); +const Buffer = require('buffer').Buffer; + +const sab = new SharedArrayBuffer(24); +const arr1 = new Uint16Array(sab); +const arr2 = new Uint16Array(12); +arr2[0] = 5000; +arr1[0] = 5000; +arr1[1] = 4000; +arr2[1] = 4000; + +const arr_buf = Buffer.from(arr1.buffer); +const ar_buf = Buffer.from(arr2.buffer); + +assert.deepStrictEqual(arr_buf, ar_buf, 0); + +arr1[1] = 6000; +arr2[1] = 6000; + +assert.deepStrictEqual(arr_buf, ar_buf, 0); + +// Checks for calling Buffer.byteLength on a SharedArrayBuffer + +assert.strictEqual(Buffer.byteLength(sab), sab.byteLength, 0);