From 2ab0573ee2c0940f6a3d3035cda8abcd00cfd25e Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Sat, 10 May 2025 23:13:05 +0300 Subject: [PATCH 1/3] buffer: avoid unnecessary copy in Buffer.concat for single FastBuffer --- lib/buffer.js | 9 +++++++++ test/parallel/test-buffer-concat.js | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/buffer.js b/lib/buffer.js index 22bbb95eaf79e6..4b755e1e3f0d22 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -593,6 +593,15 @@ Buffer.concat = function concat(list, length) { validateOffset(length, 'length'); } + // If there is only one FastBuffer, rotate without copying + if ( + list.length === 1 && + list[0] instanceof FastBuffer && + list[0].length === length + ) { + return Buffer.from(list[0]); + } + const buffer = Buffer.allocUnsafe(length); let pos = 0; for (let i = 0; i < list.length; i++) { diff --git a/test/parallel/test-buffer-concat.js b/test/parallel/test-buffer-concat.js index 2e7541fb58b063..444644e03bab1d 100644 --- a/test/parallel/test-buffer-concat.js +++ b/test/parallel/test-buffer-concat.js @@ -44,6 +44,15 @@ assert.notStrictEqual(flatOne, one[0]); assert.strictEqual(flatLong.toString(), check); assert.strictEqual(flatLongLen.toString(), check); +{ + const original = Buffer.from('fast'); + const result = Buffer.concat([original], original.length); + assert.notStrictEqual(result, original, + 'Buffer.concat should return a new Buffer instance even with single FastBuffer'); + assert.deepStrictEqual(result, original, + 'Buffer.concat output should equal original content'); +} + [undefined, null, Buffer.from('hello')].forEach((value) => { assert.throws(() => { Buffer.concat(value); From 44d56f1439e7b1370b5e3606ca78229d2d9c3740 Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Sat, 10 May 2025 23:19:26 +0300 Subject: [PATCH 2/3] lint --- test/parallel/test-buffer-concat.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/test/parallel/test-buffer-concat.js b/test/parallel/test-buffer-concat.js index 444644e03bab1d..3b928c52a221b8 100644 --- a/test/parallel/test-buffer-concat.js +++ b/test/parallel/test-buffer-concat.js @@ -47,10 +47,16 @@ assert.strictEqual(flatLongLen.toString(), check); { const original = Buffer.from('fast'); const result = Buffer.concat([original], original.length); - assert.notStrictEqual(result, original, - 'Buffer.concat should return a new Buffer instance even with single FastBuffer'); - assert.deepStrictEqual(result, original, - 'Buffer.concat output should equal original content'); + assert.notStrictEqual( + result, + original, + 'Buffer.concat should return a new Buffer instance even with single FastBuffer' + ); + assert.deepStrictEqual( + result, + original, + 'Buffer.concat output should equal original content' + ); } [undefined, null, Buffer.from('hello')].forEach((value) => { From 62de85d0ba5f45af689aabc7ad466021204a177f Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Sat, 10 May 2025 23:26:01 +0300 Subject: [PATCH 3/3] lint --- test/parallel/test-buffer-concat.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/test/parallel/test-buffer-concat.js b/test/parallel/test-buffer-concat.js index 3b928c52a221b8..3531f98de8059d 100644 --- a/test/parallel/test-buffer-concat.js +++ b/test/parallel/test-buffer-concat.js @@ -47,16 +47,13 @@ assert.strictEqual(flatLongLen.toString(), check); { const original = Buffer.from('fast'); const result = Buffer.concat([original], original.length); - assert.notStrictEqual( - result, - original, - 'Buffer.concat should return a new Buffer instance even with single FastBuffer' - ); - assert.deepStrictEqual( - result, - original, - 'Buffer.concat output should equal original content' - ); + + const msgRef = + 'Buffer.concat should return a new Buffer instance even with single FastBuffer'; + const msgEq = 'Buffer.concat output should equal original content'; + + assert.notStrictEqual(result, original, msgRef); + assert.deepStrictEqual(result, original, msgEq); } [undefined, null, Buffer.from('hello')].forEach((value) => {