Permalink
Browse files

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: #6533
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Fedor Indutny <fedor.indutny@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
  • Loading branch information...
1 parent 8a2a763 commit aed5e2745117dad40c43bcb687d7dddc4906ae16 @mscdex mscdex committed with evanlucas Dec 19, 2016
Showing with 21 additions and 21 deletions.
  1. +4 −3 lib/_http_outgoing.js
  2. +17 −18 lib/_stream_writable.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) {
@@ -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;
+ }
}

0 comments on commit aed5e27

Please sign in to comment.