lib: remove inherits() usage

This switches all `util.inherits()` calls to use
`Object.setPrototypeOf()` instead. In fact, `util.inherits()` is
mainly a small wrapper around exactly this function while adding
the `_super` property on the object as well.

Refs: #24395

PR-URL: https://github.com/nodejs/node/pull/24755
Refs: https://github.com/nodejs/node/issues/24395
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
This commit is contained in:
Ruben Bridgewater 2018-11-30 17:55:48 +01:00 committed by Anna Henningsen
parent 6ccc80c82a
commit dcc82b37b6
No known key found for this signature in database
GPG Key ID: 9C63F3A6CD2AD8F9
26 changed files with 50 additions and 72 deletions

View File

@ -105,8 +105,7 @@ function Agent(options) {
}
});
}
util.inherits(Agent, EventEmitter);
Object.setPrototypeOf(Agent.prototype, EventEmitter.prototype);
Agent.defaultMaxSockets = Infinity;

View File

@ -279,9 +279,7 @@ function ClientRequest(input, options, cb) {
this._deferToConnect(null, null, () => this._flush());
}
util.inherits(ClientRequest, OutgoingMessage);
Object.setPrototypeOf(ClientRequest.prototype, OutgoingMessage.prototype);
ClientRequest.prototype._finish = function _finish() {
DTRACE_HTTP_CLIENT_REQUEST(this, this.connection);

View File

@ -21,7 +21,6 @@
'use strict';
const util = require('util');
const Stream = require('stream');
function readStart(socket) {
@ -72,8 +71,7 @@ function IncomingMessage(socket) {
// read by the user, so there's no point continuing to handle it.
this._dumped = false;
}
util.inherits(IncomingMessage, Stream.Readable);
Object.setPrototypeOf(IncomingMessage.prototype, Stream.Readable.prototype);
IncomingMessage.prototype.setTimeout = function setTimeout(msecs, callback) {
if (callback)

View File

@ -106,7 +106,7 @@ function OutgoingMessage() {
this._onPendingData = noopPendingOutput;
}
util.inherits(OutgoingMessage, Stream);
Object.setPrototypeOf(OutgoingMessage.prototype, Stream.prototype);
Object.defineProperty(OutgoingMessage.prototype, '_headers', {

View File

@ -137,7 +137,7 @@ function ServerResponse(req) {
this.shouldKeepAlive = false;
}
}
util.inherits(ServerResponse, OutgoingMessage);
Object.setPrototypeOf(ServerResponse.prototype, OutgoingMessage.prototype);
ServerResponse.prototype._finish = function _finish() {
DTRACE_HTTP_SERVER_RESPONSE(this.connection);

View File

@ -28,11 +28,10 @@
module.exports = Duplex;
const util = require('util');
const Readable = require('_stream_readable');
const Writable = require('_stream_writable');
util.inherits(Duplex, Readable);
Object.setPrototypeOf(Duplex.prototype, Readable.prototype);
{
// Allow the keys array to be GC'ed.

View File

@ -28,8 +28,7 @@
module.exports = PassThrough;
const Transform = require('_stream_transform');
const util = require('util');
util.inherits(PassThrough, Transform);
Object.setPrototypeOf(PassThrough.prototype, Transform.prototype);
function PassThrough(options) {
if (!(this instanceof PassThrough))

View File

@ -44,7 +44,7 @@ const { emitExperimentalWarning } = require('internal/util');
let StringDecoder;
let createReadableStreamAsyncIterator;
util.inherits(Readable, Stream);
Object.setPrototypeOf(Readable.prototype, Stream.prototype);
const { errorOrDestroy } = destroyImpl;
const kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];

View File

@ -71,8 +71,7 @@ const {
ERR_TRANSFORM_WITH_LENGTH_0
} = require('internal/errors').codes;
const Duplex = require('_stream_duplex');
const util = require('util');
util.inherits(Transform, Duplex);
Object.setPrototypeOf(Transform.prototype, Duplex.prototype);
function afterTransform(er, data) {

View File

@ -28,7 +28,6 @@
module.exports = Writable;
Writable.WritableState = WritableState;
const util = require('util');
const internalUtil = require('internal/util');
const Stream = require('stream');
const { Buffer } = require('buffer');
@ -47,7 +46,7 @@ const {
const { errorOrDestroy } = destroyImpl;
util.inherits(Writable, Stream);
Object.setPrototypeOf(Writable.prototype, Stream.prototype);
function nop() {}

View File

@ -108,7 +108,7 @@ function Socket(type, listener) {
sendBufferSize
};
}
util.inherits(Socket, EventEmitter);
Object.setPrototypeOf(Socket.prototype, EventEmitter.prototype);
function createSocket(type, listener) {

View File

@ -149,7 +149,7 @@ function Agent(options) {
list: []
};
}
inherits(Agent, HttpAgent);
Object.setPrototypeOf(Agent.prototype, HttpAgent.prototype);
Agent.prototype.createConnection = createConnection;
Agent.prototype.getName = function getName(options) {

View File

@ -265,7 +265,7 @@ function ChildProcess() {
maybeClose(this);
};
}
util.inherits(ChildProcess, EventEmitter);
Object.setPrototypeOf(ChildProcess.prototype, EventEmitter.prototype);
function flushStdio(subprocess) {

View File

@ -1,6 +1,5 @@
'use strict';
const EventEmitter = require('events');
const util = require('util');
module.exports = Worker;
@ -30,7 +29,7 @@ function Worker(options) {
}
}
util.inherits(Worker, EventEmitter);
Object.setPrototypeOf(Worker.prototype, EventEmitter.prototype);
Worker.prototype.kill = function() {
this.destroy.apply(this, arguments);

View File

@ -32,7 +32,6 @@ const {
const assert = require('assert');
const LazyTransform = require('internal/streams/lazy_transform');
const { inherits } = require('util');
const { deprecate, normalizeEncoding } = require('internal/util');
// Lazy loaded for startup performance.
@ -124,7 +123,7 @@ function Cipher(cipher, password, options) {
createCipher.call(this, cipher, password, options, true);
}
inherits(Cipher, LazyTransform);
Object.setPrototypeOf(Cipher.prototype, LazyTransform.prototype);
Cipher.prototype._transform = function _transform(chunk, encoding, callback) {
this.push(this[kHandle].update(chunk, encoding));
@ -254,7 +253,7 @@ function addCipherPrototypeFunctions(constructor) {
constructor.prototype.setAAD = Cipher.prototype.setAAD;
}
inherits(Cipheriv, LazyTransform);
Object.setPrototypeOf(Cipheriv.prototype, LazyTransform.prototype);
addCipherPrototypeFunctions(Cipheriv);
legacyNativeHandle(Cipheriv);
@ -265,7 +264,7 @@ function Decipher(cipher, password, options) {
createCipher.call(this, cipher, password, options, false);
}
inherits(Decipher, LazyTransform);
Object.setPrototypeOf(Decipher.prototype, LazyTransform.prototype);
addCipherPrototypeFunctions(Decipher);
legacyNativeHandle(Decipher);
@ -277,7 +276,7 @@ function Decipheriv(cipher, key, iv, options) {
createCipherWithIV.call(this, cipher, key, options, false, iv);
}
inherits(Decipheriv, LazyTransform);
Object.setPrototypeOf(Decipheriv.prototype, LazyTransform.prototype);
addCipherPrototypeFunctions(Decipheriv);
legacyNativeHandle(Decipheriv);

View File

@ -21,7 +21,6 @@ const {
ERR_INVALID_ARG_TYPE
} = require('internal/errors').codes;
const { validateString } = require('internal/validators');
const { inherits } = require('util');
const { normalizeEncoding } = require('internal/util');
const { isArrayBufferView } = require('internal/util/types');
const LazyTransform = require('internal/streams/lazy_transform');
@ -39,7 +38,7 @@ function Hash(algorithm, options) {
LazyTransform.call(this, options);
}
inherits(Hash, LazyTransform);
Object.setPrototypeOf(Hash.prototype, LazyTransform.prototype);
Hash.prototype._transform = function _transform(chunk, encoding, callback) {
this[kHandle].update(chunk, encoding);
@ -100,7 +99,7 @@ function Hmac(hmac, key, options) {
LazyTransform.call(this, options);
}
inherits(Hmac, LazyTransform);
Object.setPrototypeOf(Hmac.prototype, LazyTransform.prototype);
Hmac.prototype.update = Hash.prototype.update;

View File

@ -18,7 +18,6 @@ const {
validateArrayBufferView,
} = require('internal/crypto/util');
const { Writable } = require('stream');
const { inherits } = require('util');
function Sign(algorithm, options) {
if (!(this instanceof Sign))
@ -30,7 +29,7 @@ function Sign(algorithm, options) {
Writable.call(this, options);
}
inherits(Sign, Writable);
Object.setPrototypeOf(Sign.prototype, Writable.prototype);
Sign.prototype._write = function _write(chunk, encoding, callback) {
this.update(chunk, encoding);
@ -101,7 +100,7 @@ function Verify(algorithm, options) {
Writable.call(this, options);
}
inherits(Verify, Writable);
Object.setPrototypeOf(Verify.prototype, Writable.prototype);
Verify.prototype._write = Sign.prototype._write;
Verify.prototype.update = Sign.prototype.update;

View File

@ -17,7 +17,6 @@ const {
} = require('internal/fs/utils');
const { Readable, Writable } = require('stream');
const { toPathIfFileURL } = require('internal/url');
const util = require('util');
const kMinPoolSpace = 128;
@ -119,7 +118,7 @@ function ReadStream(path, options) {
}
});
}
util.inherits(ReadStream, Readable);
Object.setPrototypeOf(ReadStream.prototype, Readable.prototype);
ReadStream.prototype.open = function() {
fs.open(this.path, this.flags, this.mode, (er, fd) => {
@ -273,7 +272,7 @@ function WriteStream(path, options) {
if (typeof this.fd !== 'number')
this.open();
}
util.inherits(WriteStream, Writable);
Object.setPrototypeOf(WriteStream.prototype, Writable.prototype);
WriteStream.prototype._final = function(callback) {
if (this.autoClose) {

View File

@ -1,7 +1,6 @@
'use strict';
const { Writable } = require('stream');
const { inherits } = require('util');
const { closeSync, writeSync } = require('fs');
function SyncWriteStream(fd, options) {
@ -16,7 +15,7 @@ function SyncWriteStream(fd, options) {
this.on('end', () => this._destroy());
}
inherits(SyncWriteStream, Writable);
Object.setPrototypeOf(SyncWriteStream.prototype, Writable.prototype);
SyncWriteStream.prototype._write = function(chunk, encoding, cb) {
writeSync(this.fd, chunk, 0, chunk.length);

View File

@ -19,7 +19,6 @@ const {
const { toNamespacedPath } = require('path');
const { validateUint32 } = require('internal/validators');
const { toPathIfFileURL } = require('internal/url');
const util = require('util');
const assert = require('assert');
const kOldStatus = Symbol('kOldStatus');
@ -36,7 +35,7 @@ function StatWatcher(bigint) {
this[kOldStatus] = -1;
this[kUseBigint] = bigint;
}
util.inherits(StatWatcher, EventEmitter);
Object.setPrototypeOf(StatWatcher.prototype, EventEmitter.prototype);
function onchange(newStatus, stats) {
const self = this[owner_symbol];
@ -132,7 +131,7 @@ function FSWatcher() {
}
};
}
util.inherits(FSWatcher, EventEmitter);
Object.setPrototypeOf(FSWatcher.prototype, EventEmitter.prototype);
// FIXME(joyeecheung): this method is not documented.

View File

@ -1,12 +1,11 @@
'use strict';
const EE = require('events');
const util = require('util');
function Stream() {
EE.call(this);
}
util.inherits(Stream, EE);
Object.setPrototypeOf(Stream.prototype, EE.prototype);
Stream.prototype.pipe = function(dest, options) {
var source = this;

View File

@ -1145,7 +1145,7 @@ function Server(options, connectionListener) {
this.allowHalfOpen = options.allowHalfOpen || false;
this.pauseOnConnect = !!options.pauseOnConnect;
}
util.inherits(Server, EventEmitter);
Object.setPrototypeOf(Server.prototype, EventEmitter.prototype);
function toNumber(x) { return (x = Number(x)) >= 0 ? x : false; }

View File

@ -33,7 +33,6 @@ const {
const { AsyncResource } = require('async_hooks');
const L = require('internal/linkedlist');
const kInspect = require('internal/util').customInspectSymbol;
const { inherits } = require('util');
const kCallback = Symbol('callback');
const kTypes = Symbol('types');
@ -208,10 +207,8 @@ class PerformanceNodeTiming {
};
}
}
// Use this instead of Extends because we want PerformanceEntry in the
// prototype chain but we do not want to use the PerformanceEntry
// constructor for this.
inherits(PerformanceNodeTiming, PerformanceEntry);
Object.setPrototypeOf(
PerformanceNodeTiming.prototype, PerformanceEntry.prototype);
const nodeTiming = new PerformanceNodeTiming();

View File

@ -32,7 +32,7 @@ const {
ERR_INVALID_CURSOR_POS,
ERR_INVALID_OPT_VALUE
} = require('internal/errors').codes;
const { debug, inherits } = require('util');
const { debug } = require('util');
const { emitExperimentalWarning } = require('internal/util');
const { Buffer } = require('buffer');
const EventEmitter = require('events');
@ -245,7 +245,7 @@ function Interface(input, output, completer, terminal) {
input.resume();
}
inherits(Interface, EventEmitter);
Object.setPrototypeOf(Interface.prototype, EventEmitter.prototype);
Object.defineProperty(Interface.prototype, 'columns', {
configurable: true,

View File

@ -53,7 +53,6 @@ const {
} = require('internal/deps/acorn/dist/acorn');
const internalUtil = require('internal/util');
const util = require('util');
const { inherits } = util;
const Stream = require('stream');
const vm = require('vm');
const path = require('path');
@ -669,9 +668,9 @@ function REPLServer(prompt,
// handle multiline history
if (self[kBufferedCommandSymbol].length)
REPLServer.super_.prototype.multilineHistory.call(self, false);
Interface.prototype.multilineHistory.call(self, false);
else {
REPLServer.super_.prototype.multilineHistory.call(self, true);
Interface.prototype.multilineHistory.call(self, true);
}
// Clear buffer if no SyntaxErrors
@ -753,7 +752,7 @@ function REPLServer(prompt,
self.displayPrompt();
}
inherits(REPLServer, Interface);
Object.setPrototypeOf(REPLServer.prototype, Interface.prototype);
exports.REPLServer = REPLServer;
exports.REPL_MODE_SLOPPY = Symbol('repl-sloppy');
@ -894,18 +893,18 @@ REPLServer.prototype.displayPrompt = function(preserveCursor) {
const len = this.lines.level.length ? this.lines.level.length - 1 : 0;
const levelInd = '..'.repeat(len);
prompt += levelInd + ' ';
REPLServer.super_.prototype.undoHistory.call(this);
Interface.prototype.undoHistory.call(this);
}
// Do not overwrite `_initialPrompt` here
REPLServer.super_.prototype.setPrompt.call(this, prompt);
Interface.prototype.setPrompt.call(this, prompt);
this.prompt(preserveCursor);
};
// When invoked as an API method, overwrite _initialPrompt
REPLServer.prototype.setPrompt = function setPrompt(prompt) {
this._initialPrompt = prompt;
REPLServer.super_.prototype.setPrompt.call(this, prompt);
Interface.prototype.setPrompt.call(this, prompt);
};
REPLServer.prototype.turnOffEditorMode = util.deprecate(
@ -923,7 +922,7 @@ function ArrayStream() {
this.emit('data', `${data[n]}\n`);
};
}
util.inherits(ArrayStream, Stream);
Object.setPrototypeOf(ArrayStream.prototype, Stream.prototype);
ArrayStream.prototype.readable = true;
ArrayStream.prototype.writable = true;
ArrayStream.prototype.resume = function() {};
@ -1396,7 +1395,7 @@ function addStandardGlobals(completionGroups, filter) {
function _turnOnEditorMode(repl) {
repl.editorMode = true;
REPLServer.super_.prototype.setPrompt.call(repl, '');
Interface.prototype.setPrompt.call(repl, '');
}
function _turnOffEditorMode(repl) {
@ -1514,5 +1513,5 @@ function regexpEscape(s) {
function Recoverable(err) {
this.err = err;
}
inherits(Recoverable, SyntaxError);
Object.setPrototypeOf(Recoverable.prototype, SyntaxError.prototype);
exports.Recoverable = Recoverable;

View File

@ -31,7 +31,6 @@ const Transform = require('_stream_transform');
const {
deprecate,
_extend,
inherits,
types: {
isAnyArrayBuffer,
isArrayBufferView
@ -318,7 +317,7 @@ function Zlib(opts, mode) {
this._info = opts && opts.info;
this.once('end', this.close);
}
inherits(Zlib, Transform);
Object.setPrototypeOf(Zlib.prototype, Transform.prototype);
Object.defineProperty(Zlib.prototype, '_closed', {
configurable: true,
@ -648,28 +647,28 @@ function Deflate(opts) {
return new Deflate(opts);
Zlib.call(this, opts, DEFLATE);
}
inherits(Deflate, Zlib);
Object.setPrototypeOf(Deflate.prototype, Zlib.prototype);
function Inflate(opts) {
if (!(this instanceof Inflate))
return new Inflate(opts);
Zlib.call(this, opts, INFLATE);
}
inherits(Inflate, Zlib);
Object.setPrototypeOf(Inflate.prototype, Zlib.prototype);
function Gzip(opts) {
if (!(this instanceof Gzip))
return new Gzip(opts);
Zlib.call(this, opts, GZIP);
}
inherits(Gzip, Zlib);
Object.setPrototypeOf(Gzip.prototype, Zlib.prototype);
function Gunzip(opts) {
if (!(this instanceof Gunzip))
return new Gunzip(opts);
Zlib.call(this, opts, GUNZIP);
}
inherits(Gunzip, Zlib);
Object.setPrototypeOf(Gunzip.prototype, Zlib.prototype);
function DeflateRaw(opts) {
if (opts && opts.windowBits === 8) opts.windowBits = 9;
@ -677,21 +676,21 @@ function DeflateRaw(opts) {
return new DeflateRaw(opts);
Zlib.call(this, opts, DEFLATERAW);
}
inherits(DeflateRaw, Zlib);
Object.setPrototypeOf(DeflateRaw.prototype, Zlib.prototype);
function InflateRaw(opts) {
if (!(this instanceof InflateRaw))
return new InflateRaw(opts);
Zlib.call(this, opts, INFLATERAW);
}
inherits(InflateRaw, Zlib);
Object.setPrototypeOf(InflateRaw.prototype, Zlib.prototype);
function Unzip(opts) {
if (!(this instanceof Unzip))
return new Unzip(opts);
Zlib.call(this, opts, UNZIP);
}
inherits(Unzip, Zlib);
Object.setPrototypeOf(Unzip.prototype, Zlib.prototype);
function createConvenienceMethod(ctor, sync) {
if (sync) {