]> zoso.dev Git - buffer.git/commitdiff
support out of range slice
authorAndreas Madsen <amwebdk@gmail.com>
Wed, 21 Aug 2013 16:52:54 +0000 (18:52 +0200)
committerAndreas Madsen <amwebdk@gmail.com>
Wed, 21 Aug 2013 16:52:54 +0000 (18:52 +0200)
index.js
test/buffer.js

index 3272ce8ceeaac480e15a39bb3b45481399e332f6..08a15a96118f54809157f69c04cda91bdd6a3bba 100644 (file)
--- a/index.js
+++ b/index.js
@@ -292,18 +292,21 @@ Buffer.prototype.write = function(string, offset, length, encoding) {
   }
 };
 
-
 // slice(start, end)
-Buffer.prototype.slice = function(start, end) {
-  if (end === undefined) end = this.length;
-
-  if (end > this.length) {
-    throw new Error('oob');
-  }
-  if (start > end) {
-    throw new Error('oob');
-  }
+function clamp(index, len, defaultValue) {
+  if (typeof index !== 'number') return defaultValue;
+  index = ~~index;  // Coerce to integer.
+  if (index >= len) return len;
+  if (index >= 0) return index;
+  index += len;
+  if (index >= 0) return index;
+  return 0;
+}
 
+Buffer.prototype.slice = function(start, end) {
+  var len = this.length;
+  start = clamp(start, len, 0);
+  end = clamp(end, len, len);
   return new Buffer(this, end - start, +start);
 };
 
index d4ddbaea20fdfb916d0815f429a37c6fd31e6ed7..74c939ef5cb89a71685006af620854f0f9c3c3c8 100644 (file)
@@ -246,3 +246,10 @@ test('buffer.slice sets indexes', function (t) {
   t.equal((new B('hallo')).slice(0, 5).toString(), 'hallo');
   t.end();
 });
+
+test('buffer.slice out of range', function (t) {
+  t.plan(2);
+  t.equal((new B('hallo')).slice(0, 10).toString(), 'hallo');
+  t.equal((new B('hallo')).slice(10, 2).toString(), '');
+  t.end();
+});