From aa8a753d645fff640bd4d9867f702f1081502132 Mon Sep 17 00:00:00 2001 From: JoostK Date: Sat, 29 May 2021 23:01:46 +0200 Subject: [PATCH] Implement `SourceMapSource.buffer` for efficient size computation The `Source.size` method computes the size from the buffer length, where the default `Source.buffer` method allocates a new buffer from the string source. By implementing `SourceMapSource.buffer` this allocation is avoided, as a buffer representation is available on the instance. This results in a noticeable performance improvement for stats computation in Webpack, where chunk sizes are obtained from `Source.size`. --- lib/SourceMapSource.js | 5 +++++ test/SourceMapSource.js | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/SourceMapSource.js b/lib/SourceMapSource.js index fd4a8f2..88a7cb8 100644 --- a/lib/SourceMapSource.js +++ b/lib/SourceMapSource.js @@ -158,6 +158,11 @@ class SourceMapSource extends Source { ]; } + buffer() { + this._ensureValueBuffer(); + return this._valueAsBuffer; + } + source() { this._ensureValueString(); return this._valueAsString; diff --git a/test/SourceMapSource.js b/test/SourceMapSource.js index 0c5b878..875c6b8 100644 --- a/test/SourceMapSource.js +++ b/test/SourceMapSource.js @@ -426,4 +426,27 @@ describe("SourceMapSource", () => { } `); }); + + it("provides buffer when backed by string", () => { + const sourceMapSource = new SourceMapSource("source", "name"); + + const buffer1 = sourceMapSource.buffer(); + expect(buffer1.length).toBe(6); + + const buffer2 = sourceMapSource.buffer(); + expect(buffer2).toBe(buffer1); + }); + + it("provides buffer when backed by buffer", () => { + const sourceMapSource = new SourceMapSource( + Buffer.from("source", "utf-8"), + "name" + ); + + const buffer1 = sourceMapSource.buffer(); + expect(buffer1.length).toBe(6); + + const buffer2 = sourceMapSource.buffer(); + expect(buffer2).toBe(buffer1); + }); });