buffer: remove duplicated code in fromObject
authorHUANG Wei <grubbyfans@gmail.com>
Fri, 29 Jan 2016 10:15:32 +0000 (18:15 +0800)
committerMyles Borins <mborins@us.ibm.com>
Mon, 21 Mar 2016 19:57:53 +0000 (12:57 -0700)
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>
lib/buffer.js
test/parallel/test-buffer.js

index 3fb24bef648d48fa65da5702a44ec4672c61938c..f8ab2b222823386d5e31b36f1afaabb879d344b2 100644 (file)
@@ -117,6 +117,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) {
@@ -129,14 +136,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');
   }
@@ -145,25 +144,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');
index 30023471404e2871edda3855d1f2d0042f7a7df5..61f3aa08b70736fddb06563e49eadf34cfd76f4d 100644 (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() {