From a7fdfc005419473d298db0f853d5ae690cb2ce0c Mon Sep 17 00:00:00 2001 From: Brian White Date: Sun, 18 Dec 2016 21:25:31 -0500 Subject: [PATCH] lib: avoid recompilation of anonymous functions Since at least V8 5.4, using function.bind() is now fast enough to use to avoid recompiling/reoptimizing the same anonymous functions. These changes especially impact http servers. PR-URL: https://github.com/nodejs/node/pull/6533 Reviewed-By: Matteo Collina Reviewed-By: James M Snell Reviewed-By: Fedor Indutny Reviewed-By: Benjamin Gruenbaum --- lib/_http_outgoing.js | 7 ++++--- lib/_stream_writable.js | 35 +++++++++++++++++------------------ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index 8d134ecc501083..5a9e34bedd7903 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -545,6 +545,9 @@ OutgoingMessage.prototype.addTrailers = function addTrailers(headers) { const crlf_buf = Buffer.from('\r\n'); +function onFinish(outmsg) { + outmsg.emit('finish'); +} OutgoingMessage.prototype.end = function end(data, encoding, callback) { if (typeof data === 'function') { @@ -592,9 +595,7 @@ OutgoingMessage.prototype.end = function end(data, encoding, callback) { if (typeof callback === 'function') this.once('finish', callback); - const finish = () => { - this.emit('finish'); - }; + var finish = onFinish.bind(undefined, this); var ret; if (this._hasBody && this.chunkedEncoding) { diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index 06499fc947fe30..b20fe8d2ea91ed 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -86,9 +86,7 @@ function WritableState(options, stream) { this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) - this.onwrite = function(er) { - onwrite(stream, er); - }; + this.onwrite = onwrite.bind(undefined, stream); // the callback that the user supplies to write(chunk,encoding,cb) this.writecb = null; @@ -538,20 +536,21 @@ function endWritable(stream, state, cb) { function CorkedRequest(state) { this.next = null; this.entry = null; + this.finish = onCorkedFinish.bind(undefined, this, state); +} - this.finish = (err) => { - var entry = this.entry; - this.entry = null; - while (entry) { - var cb = entry.callback; - state.pendingcb--; - cb(err); - entry = entry.next; - } - if (state.corkedRequestsFree) { - state.corkedRequestsFree.next = this; - } else { - state.corkedRequestsFree = this; - } - }; +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } }