]> zoso.dev Git - buffer.git/commitdiff
descending copy from end
authorkawanet <u-suke@kawa.net>
Thu, 6 Aug 2015 10:13:09 +0000 (19:13 +0900)
committerkawanet <u-suke@kawa.net>
Thu, 6 Aug 2015 10:19:10 +0000 (19:19 +0900)
index.js
test/methods.js

index d72a18097241a04101b3c471cd65670ebef04404..6c6be996a04f7244ea973b3f4b5c09744a4aa4e9 100644 (file)
--- a/index.js
+++ b/index.js
@@ -1171,9 +1171,16 @@ Buffer.prototype.copy = function copy (target, targetStart, start, end) {
   }
 
   var len = end - start
+  var i
 
-  if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
-    for (var i = 0; i < len; i++) {
+  if (this === target && start < targetStart && targetStart < end) {
+    // descending copy from end
+    for (i = len - 1; i >= 0; i--) {
+      target[i + targetStart] = this[i + start]
+    }
+  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
+    // ascending copy from start
+    for (i = 0; i < len; i++) {
       target[i + targetStart] = this[i + start]
     }
   } else {
index b6b7c741d0d1062782ad5b38ae4afcd6075d6f15..be92568499cf47d8a2dd7f5ee9c10feebf65a66b 100644 (file)
@@ -100,6 +100,17 @@ test('copy() after slice()', function (t) {
   t.end()
 })
 
+test('copy() ascending and descending', function (t) {
+  var b
+  b = new B('abcdefghij')
+  b.copy(b, 0, 3, 10) // ascending copy
+  t.equal(b.toString(), 'defghijhij')
+  b = new B('abcdefghij')
+  b.copy(b, 3, 0, 7) // descending copy
+  t.equal(b.toString(), 'abcabcdefg')
+  t.end()
+})
+
 test('buffer.slice sets indexes', function (t) {
   t.equal((new B('hallo')).slice(0, 5).toString(), 'hallo')
   t.end()