diff --git a/lib/buffer.js b/lib/buffer.js index d605829d735..098406bc46d 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -573,8 +573,8 @@ Buffer.prototype.copy = function(target, target_start, start, end) { end = target.length - target_start + start; } - return this.parent.copy(target.parent, - target_start + target.offset, + return this.parent.copy(target.parent || target, + target_start + (target.offset || 0), start + this.offset, end + this.offset); }; diff --git a/src/node_buffer.cc b/src/node_buffer.cc index 70c9c808764..d808dbf9788 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -402,10 +402,10 @@ Handle Buffer::Copy(const Arguments &args) { Local target = args[0]->ToObject(); char* target_data = Buffer::Data(target); size_t target_length = Buffer::Length(target); - size_t target_start = args[1]->Uint32Value(); - size_t source_start = args[2]->Uint32Value(); - size_t source_end = args[3]->IsUint32() ? args[3]->Uint32Value() - : source->length_; + size_t target_start = args[1]->IsUndefined() ? 0 : args[1]->Uint32Value(); + size_t source_start = args[2]->IsUndefined() ? 0 : args[2]->Uint32Value(); + size_t source_end = args[3]->IsUndefined() ? source->length_ + : args[3]->Uint32Value(); if (source_end < source_start) { return ThrowException(Exception::Error(String::New( diff --git a/test/simple/test-buffer.js b/test/simple/test-buffer.js index e221a53e0b2..387973d9366 100644 --- a/test/simple/test-buffer.js +++ b/test/simple/test-buffer.js @@ -85,6 +85,14 @@ for (var i = 0; i < c.length; i++) { assert.equal(i % 256, c[i]); } +// copy from fast to slow buffer +var sb = new SlowBuffer(b.length); +var copied = b.copy(sb); +console.log('copied %d bytes from b into sb'); +for (var i = 0; i < sb.length; i++) { + assert.strictEqual(sb[i], b[i]); +} + var caught_error = null; // try to copy from before the beginning of b