summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrevor Norris <trev.norris@gmail.com>2013-01-22 09:09:12 -0800
committerNathan Rajlich <nathan@tootallnate.net>2013-01-25 10:42:38 -0800
commit65249ccd9bb7edae8bbaafc2e00cd25c9c5d640d (patch)
treed8356a9dd7154b00e2d07cd964874c14bb6874dd
parent72dd3b4e2521b4913f0a44117e6b69d70786e43d (diff)
downloadnode-new-65249ccd9bb7edae8bbaafc2e00cd25c9c5d640d.tar.gz
buffer: slow buffer copy compatibility fix
Fix issue where SlowBuffers couldn't be passed as target to Buffer copy(). Also included checks to see if Argument parameters are defined before assigning their values. This offered ~3x's performance gain. Backport of 16bbecc from master branch. Closes #4633.
-rw-r--r--lib/buffer.js4
-rw-r--r--src/node_buffer.cc8
-rw-r--r--test/simple/test-buffer.js8
3 files changed, 14 insertions, 6 deletions
diff --git a/lib/buffer.js b/lib/buffer.js
index 978a566bc1..6bfbc93cd9 100644
--- a/lib/buffer.js
+++ b/lib/buffer.js
@@ -545,8 +545,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 4a6e836653..3f8ebefe06 100644
--- a/src/node_buffer.cc
+++ b/src/node_buffer.cc
@@ -412,10 +412,10 @@ Handle<Value> Buffer::Copy(const Arguments &args) {
Local<Object> 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 c1f5dea8c4..11165f88c1 100644
--- a/test/simple/test-buffer.js
+++ b/test/simple/test-buffer.js
@@ -79,6 +79,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