From c15b4969e9f79cbe6d436a223390dbacb5329dfc Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Mon, 5 Aug 2019 13:26:29 +0200 Subject: stream: encapsulate buffer-list PR-URL: https://github.com/nodejs/node/pull/28974 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell Reviewed-By: Luigi Pinca Reviewed-By: Matteo Collina Reviewed-By: Rich Trott --- lib/_stream_readable.js | 13 ++++++------- lib/internal/streams/buffer_list.js | 6 ++++++ test/parallel/test-stream-buffer-list.js | 18 ++++++++++++++++++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js index 754e45da64..1830eea66d 100644 --- a/lib/_stream_readable.js +++ b/lib/_stream_readable.js @@ -337,16 +337,15 @@ Readable.prototype.setEncoding = function(enc) { // If setEncoding(null), decoder.encoding equals utf8 this._readableState.encoding = this._readableState.decoder.encoding; + const buffer = this._readableState.buffer; // Iterate over current buffer to convert already stored Buffers: - let p = this._readableState.buffer.head; let content = ''; - while (p !== null) { - content += decoder.write(p.data); - p = p.next; + for (const data of buffer) { + content += decoder.write(data); } - this._readableState.buffer.clear(); + buffer.clear(); if (content !== '') - this._readableState.buffer.push(content); + buffer.push(content); this._readableState.length = content.length; return this; }; @@ -380,7 +379,7 @@ function howMuchToRead(n, state) { if (Number.isNaN(n)) { // Only flow one buffer at a time if (state.flowing && state.length) - return state.buffer.head.data.length; + return state.buffer.first().length; else return state.length; } diff --git a/lib/internal/streams/buffer_list.js b/lib/internal/streams/buffer_list.js index 5bfa762e85..9dbf6f6769 100644 --- a/lib/internal/streams/buffer_list.js +++ b/lib/internal/streams/buffer_list.js @@ -90,6 +90,12 @@ module.exports = class BufferList { return this.head.data; } + *[Symbol.iterator]() { + for (let p = this.head; p; p = p.next) { + yield p.data; + } + } + // Consumes a specified amount of characters from the buffered data. _getString(n) { var p = this.head; diff --git a/test/parallel/test-stream-buffer-list.js b/test/parallel/test-stream-buffer-list.js index d7728d1171..c78efeea24 100644 --- a/test/parallel/test-stream-buffer-list.js +++ b/test/parallel/test-stream-buffer-list.js @@ -16,11 +16,28 @@ assert.deepStrictEqual(emptyList.concat(0), Buffer.alloc(0)); const buf = Buffer.from('foo'); +function testIterator(list, count) { + // test iterator + let len = 0; + // eslint-disable-next-line no-unused-vars + for (const x of list) { + len++; + } + assert.strictEqual(len, count); +} + // Test buffer list with one element. const list = new BufferList(); +testIterator(list, 0); + list.push(buf); +testIterator(list, 1); +for (const x of list) { + assert.strictEqual(x, buf); +} const copy = list.concat(3); +testIterator(copy, 3); assert.notStrictEqual(copy, buf); assert.deepStrictEqual(copy, buf); @@ -28,5 +45,6 @@ assert.deepStrictEqual(copy, buf); assert.strictEqual(list.join(','), 'foo'); const shifted = list.shift(); +testIterator(list, 0); assert.strictEqual(shifted, buf); assert.deepStrictEqual(list, new BufferList()); -- cgit v1.2.3