Skip to content

Commit

Permalink
buffer: remove duplicated code in fromObject
Browse files Browse the repository at this point in the history
Add fromArrayLike() to handle logic of copying in values from array-like
argument.

PR-URL: nodejs#4948
Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
  • Loading branch information
entertainyou authored and Michael Scovetta committed Apr 2, 2016
1 parent 6b95c87 commit 471ddd0
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 23 deletions.
35 changes: 12 additions & 23 deletions lib/buffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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');
}
Expand All @@ -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');
Expand Down
7 changes: 7 additions & 0 deletions test/parallel/test-buffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down

0 comments on commit 471ddd0

Please sign in to comment.