buffer: remove duplicated code in fromObject

Add fromArrayLike() to handle logic of copying in values from array-like
argument.

PR-URL: https://github.com/nodejs/node/pull/4948
Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
pull/5097/head
HUANG Wei 2016-01-29 18:15:32 +08:00 committed by Trevor Norris
parent 25751bedfe
commit c0bfac6ba9
2 changed files with 19 additions and 23 deletions

View File

@ -122,6 +122,13 @@ function fromString(string, encoding) {
return b;
}
function fromArrayLike(obj) {
const length = obj.length;
const b = allocate(length);
for (let i = 0; i < length; i++)
b[i] = obj[i] & 255;
return b;
}
function fromObject(obj) {
if (obj instanceof Buffer) {
@ -134,14 +141,6 @@ function fromObject(obj) {
return b;
}
if (Array.isArray(obj)) {
const length = obj.length;
const b = allocate(length);
for (let i = 0; i < length; i++)
b[i] = obj[i] & 255;
return b;
}
if (obj == null) {
throw new TypeError('Must start with number, buffer, array or string');
}
@ -150,25 +149,15 @@ function fromObject(obj) {
return binding.createFromArrayBuffer(obj);
}
if (obj.buffer instanceof ArrayBuffer || obj.length) {
let length;
if (typeof obj.length !== 'number' || obj.length !== obj.length)
length = 0;
else
length = obj.length;
const b = allocate(length);
for (let i = 0; i < length; i++) {
b[i] = obj[i] & 255;
if (obj.buffer instanceof ArrayBuffer || 'length' in obj) {
if (typeof obj.length !== 'number' || obj.length !== obj.length) {
return allocate(0);
}
return b;
return fromArrayLike(obj);
}
if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
var array = obj.data;
const b = allocate(array.length);
for (let i = 0; i < array.length; i++)
b[i] = array[i] & 255;
return b;
return fromArrayLike(obj.data);
}
throw new TypeError('Must start with number, buffer, array or string');

View File

@ -28,6 +28,13 @@ var c = new Buffer(512);
console.log('c.length == %d', c.length);
assert.strictEqual(512, c.length);
var d = new Buffer([]);
assert.strictEqual(0, d.length);
var ui32 = new Uint32Array(4).fill(42);
var e = Buffer(ui32);
assert.deepEqual(ui32, e);
// First check Buffer#fill() works as expected.
assert.throws(function() {