diff --git a/lib/buffer.js b/lib/buffer.js index 64caa7e97a2..25db4a54b65 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -147,8 +147,8 @@ function Buffer(subject, encoding, offset) { pool.used += this.length; } - // Assume object is an array - if (Array.isArray(subject)) { + // Treat array-ish objects as a byte array. + if (isArrayIsh(subject)) { for (var i = 0; i < this.length; i++) { this.parent[i + this.offset] = subject[i]; } @@ -161,6 +161,12 @@ function Buffer(subject, encoding, offset) { SlowBuffer.makeFastBuffer(this.parent, this, this.offset, this.length); } +function isArrayIsh(subject) { + return Array.isArray(subject) || Buffer.isBuffer(subject) || + subject && typeof subject === 'object' && + typeof subject.length === 'number'; +} + exports.SlowBuffer = SlowBuffer; exports.Buffer = Buffer; diff --git a/test/simple/test-buffer.js b/test/simple/test-buffer.js index 176e5a463c4..0aad8149f79 100644 --- a/test/simple/test-buffer.js +++ b/test/simple/test-buffer.js @@ -216,6 +216,7 @@ assert.equal(d.length, 3); assert.equal(d[0], 23); assert.equal(d[1], 42); assert.equal(d[2], 255); +assert.deepEqual(d, new Buffer(d)); var e = new Buffer('über'); console.error('uber: \'%s\'', e.toString()); @@ -234,6 +235,15 @@ console.error('f.length: %d (should be 12)', f.length); assert.deepEqual(f, new Buffer([63, 4, 64, 4, 56, 4, 50, 4, 53, 4, 66, 4])); assert.equal(f.toString('ucs2'), 'привет'); + +var arrayIsh = {0: 0, 1: 1, 2: 2, 3: 3, length: 4}; +var g = new Buffer(arrayIsh); +assert.deepEqual(g, new Buffer([0, 1, 2, 3])); +var strArrayIsh = {0: '0', 1: '1', 2: '2', 3: '3', length: 4}; +g = new Buffer(strArrayIsh); +assert.deepEqual(g, new Buffer([0, 1, 2, 3])); + + // // Test toString('base64') //