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>
This commit is contained in:
parent
a89c23f8eb
commit
2a2ec9dbc3
@ -2,7 +2,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const binding = process.binding('buffer');
|
const binding = process.binding('buffer');
|
||||||
const { isArrayBuffer } = process.binding('util');
|
const { isArrayBuffer, isSharedArrayBuffer } = process.binding('util');
|
||||||
const bindingObj = {};
|
const bindingObj = {};
|
||||||
const internalUtil = require('internal/util');
|
const internalUtil = require('internal/util');
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ Buffer.from = function(value, encodingOrOffset, length) {
|
|||||||
if (typeof value === 'number')
|
if (typeof value === 'number')
|
||||||
throw new TypeError('"value" argument must not be a number');
|
throw new TypeError('"value" argument must not be a number');
|
||||||
|
|
||||||
if (isArrayBuffer(value))
|
if (isArrayBuffer(value) || isSharedArrayBuffer(value))
|
||||||
return fromArrayBuffer(value, encodingOrOffset, length);
|
return fromArrayBuffer(value, encodingOrOffset, length);
|
||||||
|
|
||||||
if (typeof value === 'string')
|
if (typeof value === 'string')
|
||||||
@ -264,7 +264,8 @@ function fromObject(obj) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (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) {
|
if (typeof obj.length !== 'number' || obj.length !== obj.length) {
|
||||||
return new FastBuffer();
|
return new FastBuffer();
|
||||||
}
|
}
|
||||||
@ -351,8 +352,10 @@ function base64ByteLength(str, bytes) {
|
|||||||
|
|
||||||
function byteLength(string, encoding) {
|
function byteLength(string, encoding) {
|
||||||
if (typeof string !== 'string') {
|
if (typeof string !== 'string') {
|
||||||
if (ArrayBuffer.isView(string) || isArrayBuffer(string))
|
if (ArrayBuffer.isView(string) || isArrayBuffer(string) ||
|
||||||
|
isSharedArrayBuffer(string)) {
|
||||||
return string.byteLength;
|
return string.byteLength;
|
||||||
|
}
|
||||||
|
|
||||||
string = '' + string;
|
string = '' + string;
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ using v8::Value;
|
|||||||
|
|
||||||
#define VALUE_METHOD_MAP(V) \
|
#define VALUE_METHOD_MAP(V) \
|
||||||
V(isArrayBuffer, IsArrayBuffer) \
|
V(isArrayBuffer, IsArrayBuffer) \
|
||||||
|
V(isSharedArrayBuffer, IsSharedArrayBuffer) \
|
||||||
V(isDataView, IsDataView) \
|
V(isDataView, IsDataView) \
|
||||||
V(isDate, IsDate) \
|
V(isDate, IsDate) \
|
||||||
V(isMap, IsMap) \
|
V(isMap, IsMap) \
|
||||||
|
29
test/parallel/test-buffer-sharedarraybuffer.js
Normal file
29
test/parallel/test-buffer-sharedarraybuffer.js
Normal file
@ -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);
|
Loading…
x
Reference in New Issue
Block a user