src: only memcmp if length > 0 in Buffer::Compare
authorKarl Skomski <karl@skomski.com>
Fri, 21 Aug 2015 11:31:24 +0000 (13:31 +0200)
committerRod Vagg <rod@vagg.org>
Wed, 2 Sep 2015 11:32:16 +0000 (21:32 +1000)
Both pointer arguments to memcmp are defined as non-null
and compiler optimizes upon that.

PR-URL: https://github.com/nodejs/node/pull/2544
Reviewed-By: trevnorris - Trevor Norris <trev.norris@gmail.com>
Reviewed-By: thefourtheye - Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
src/node_buffer.cc
test/parallel/test-buffer.js

index c8be5b5..54c4711 100644 (file)
@@ -835,7 +835,7 @@ void Compare(const FunctionCallbackInfo<Value> &args) {
 
   size_t cmp_length = MIN(obj_a_length, obj_b_length);
 
-  int32_t val = memcmp(obj_a_data, obj_b_data, cmp_length);
+  int val = cmp_length > 0 ? memcmp(obj_a_data, obj_b_data, cmp_length) : 0;
 
   // Normalize val to be an integer in the range of [1, -1] since
   // implementations of memcmp() can vary by platform.
index a6730de..c8f9dce 100644 (file)
@@ -1137,6 +1137,9 @@ assert.equal(Buffer.compare(d, b), 1);
 assert.equal(Buffer.compare(b, d), -1);
 assert.equal(Buffer.compare(c, c), 0);
 
+assert.equal(Buffer.compare(Buffer(0), Buffer(0)), 0);
+assert.equal(Buffer.compare(Buffer(0), Buffer(1)), -1);
+assert.equal(Buffer.compare(Buffer(1), Buffer(0)), 1);
 
 assert.throws(function() {
   var b = new Buffer(1);