summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOjas Shirekar <ojas.shirekar@gmail.com>2016-09-12 12:03:34 +0530
committerBrian White <mscdex@mscdex.net>2016-09-17 04:55:09 -0400
commit2a2ec9dbc3375cd1b8be58fb2ed522247474bc20 (patch)
tree23adca5f53744a1ebce693738ae07a4777353a95
parenta89c23f8ebb8d47e2f577d3594bfb465c1861d25 (diff)
downloadandroid-node-v8-2a2ec9dbc3375cd1b8be58fb2ed522247474bc20.tar.gz
android-node-v8-2a2ec9dbc3375cd1b8be58fb2ed522247474bc20.tar.bz2
android-node-v8-2a2ec9dbc3375cd1b8be58fb2ed522247474bc20.zip
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 <mscdex@mscdex.net> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net>
-rw-r--r--lib/buffer.js11
-rw-r--r--src/node_util.cc1
-rw-r--r--test/parallel/test-buffer-sharedarraybuffer.js29
3 files changed, 37 insertions, 4 deletions
diff --git a/lib/buffer.js b/lib/buffer.js
index cefec86e9a..f43ec7acd8 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 cfbd250170..b228af0050 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 0000000000..47b3a59b86
--- /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);