From 471ddd0293b3822c60790f7e98aed166d6e63ce4 Mon Sep 17 00:00:00 2001 From: HUANG Wei Date: Fri, 29 Jan 2016 18:15:32 +0800 Subject: [PATCH] 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 Reviewed-By: James M Snell Reviewed-By: Trevor Norris --- lib/buffer.js | 35 ++++++++++++----------------------- test/parallel/test-buffer.js | 7 +++++++ 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/lib/buffer.js b/lib/buffer.js index c1f240edb4241c..dcf1302206c080 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -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'); diff --git a/test/parallel/test-buffer.js b/test/parallel/test-buffer.js index 6ab84fd8809289..2e85fe556d78d1 100644 --- a/test/parallel/test-buffer.js +++ b/test/parallel/test-buffer.js @@ -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() {