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 <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>
This commit is contained in:
parent
a54972c195
commit
b6ea857c7d
@ -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 = (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;
|
||||
}
|
||||
};
|
||||
this.finish = onCorkedFinish.bind(undefined, this, state);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user