From 0646eda4fc0affb98e13c30acb522e63b7fd6dde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Fri, 22 Nov 2019 18:04:46 +0100 Subject: [PATCH] lib: flatten access to primordials Store all primordials as properties of the primordials object. Static functions are prefixed by the constructor's name and prototype methods are prefixed by the constructor's name followed by "Prototype". For example: primordials.Object.keys becomes primordials.ObjectKeys. PR-URL: https://github.com/nodejs/node/pull/30610 Refs: https://github.com/nodejs/node/issues/29766 Reviewed-By: Anna Henningsen Reviewed-By: Matteo Collina Reviewed-By: Colin Ihrig Reviewed-By: Trivikram Kamat --- lib/_http_agent.js | 8 +- lib/_http_client.js | 14 +- lib/_http_common.js | 6 +- lib/_http_incoming.js | 11 +- lib/_http_outgoing.js | 56 +++--- lib/_http_server.js | 8 +- lib/_stream_duplex.js | 26 +-- lib/_stream_passthrough.js | 8 +- lib/_stream_readable.js | 27 +-- lib/_stream_transform.js | 8 +- lib/_stream_writable.js | 29 +-- lib/_tls_common.js | 6 +- lib/_tls_wrap.js | 20 +- lib/assert.js | 17 +- lib/async_hooks.js | 6 +- lib/buffer.js | 18 +- lib/child_process.js | 14 +- lib/constants.js | 21 +- lib/crypto.js | 6 +- lib/dgram.js | 21 +- lib/dns.js | 20 +- lib/domain.js | 27 +-- lib/events.js | 20 +- lib/fs.js | 35 ++-- lib/http.js | 8 +- lib/https.js | 15 +- lib/inspector.js | 9 +- lib/internal/assert/assertion_error.js | 18 +- lib/internal/async_hooks.js | 9 +- lib/internal/bootstrap/loaders.js | 22 ++- lib/internal/bootstrap/node.js | 45 +++-- lib/internal/bootstrap/pre_execution.js | 17 +- lib/internal/buffer.js | 14 +- lib/internal/child_process.js | 11 +- lib/internal/child_process/serialization.js | 9 +- lib/internal/cli_table.js | 14 +- lib/internal/cluster/child.js | 6 +- lib/internal/cluster/master.js | 13 +- lib/internal/cluster/worker.js | 4 +- lib/internal/console/constructor.js | 38 ++-- lib/internal/console/global.js | 15 +- lib/internal/crypto/cipher.js | 20 +- lib/internal/crypto/diffiehellman.js | 8 +- lib/internal/crypto/hash.js | 12 +- lib/internal/crypto/keygen.js | 6 +- lib/internal/crypto/keys.js | 6 +- lib/internal/crypto/random.js | 8 +- lib/internal/crypto/sig.js | 12 +- lib/internal/dns/promises.js | 9 +- lib/internal/encoding.js | 18 +- lib/internal/error-serdes.js | 42 ++-- lib/internal/errors.js | 26 +-- lib/internal/freelist.js | 6 +- lib/internal/fs/dir.js | 6 +- lib/internal/fs/promises.js | 11 +- lib/internal/fs/read_file_context.js | 6 +- lib/internal/fs/streams.js | 24 ++- lib/internal/fs/sync_write_stream.js | 8 +- lib/internal/fs/utils.js | 15 +- lib/internal/fs/watchers.js | 15 +- lib/internal/http2/compat.js | 26 ++- lib/internal/http2/core.js | 36 ++-- lib/internal/http2/util.js | 16 +- lib/internal/main/worker_thread.js | 8 +- lib/internal/modules/cjs/helpers.js | 9 +- lib/internal/modules/cjs/loader.js | 97 ++++----- .../modules/esm/create_dynamic_module.js | 17 +- lib/internal/modules/esm/default_resolve.js | 6 +- lib/internal/modules/esm/loader.js | 17 +- lib/internal/modules/esm/module_job.js | 6 +- lib/internal/modules/esm/module_map.js | 2 +- lib/internal/modules/esm/translators.js | 15 +- lib/internal/per_context/domexception.js | 13 +- lib/internal/per_context/primordials.js | 33 +++- lib/internal/policy/manifest.js | 33 ++-- lib/internal/policy/sri.js | 22 ++- lib/internal/process/execution.js | 10 +- lib/internal/process/per_thread.js | 35 ++-- lib/internal/process/policy.js | 14 +- lib/internal/process/promises.js | 6 +- lib/internal/process/report.js | 6 +- lib/internal/process/task_queues.js | 6 +- lib/internal/repl.js | 6 +- lib/internal/repl/await.js | 6 +- lib/internal/source_map/source_map_cache.js | 33 ++-- lib/internal/streams/async_iterator.js | 14 +- lib/internal/streams/lazy_transform.js | 14 +- lib/internal/streams/legacy.js | 8 +- lib/internal/streams/state.js | 6 +- lib/internal/timers.js | 12 +- lib/internal/tls.js | 6 +- lib/internal/trace_events_async_hooks.js | 8 +- lib/internal/url.js | 45 +++-- lib/internal/util.js | 37 ++-- lib/internal/util/comparisons.js | 87 ++++---- lib/internal/util/inspect.js | 185 ++++++++++-------- lib/internal/util/inspector.js | 6 +- lib/internal/util/types.js | 19 +- lib/internal/v8_prof_processor.js | 6 +- lib/internal/vm/module.js | 11 +- lib/internal/worker.js | 12 +- lib/internal/worker/io.js | 43 ++-- lib/net.js | 6 +- lib/os.js | 6 +- lib/perf_hooks.js | 18 +- lib/querystring.js | 9 +- lib/readline.js | 22 ++- lib/repl.js | 67 ++++--- lib/string_decoder.js | 6 +- lib/timers.js | 6 +- lib/tls.js | 9 +- lib/tty.js | 12 +- lib/url.js | 16 +- lib/util.js | 26 ++- lib/v8.js | 8 +- lib/vm.js | 15 +- lib/zlib.js | 80 ++++---- 117 files changed, 1317 insertions(+), 943 deletions(-) diff --git a/lib/_http_agent.js b/lib/_http_agent.js index 270569eab9..af25b2bba7 100644 --- a/lib/_http_agent.js +++ b/lib/_http_agent.js @@ -22,11 +22,9 @@ 'use strict'; const { - Object: { - setPrototypeOf: ObjectSetPrototypeOf, - keys: ObjectKeys, - values: ObjectValues - } + ObjectKeys, + ObjectSetPrototypeOf, + ObjectValues, } = primordials; const net = require('net'); diff --git a/lib/_http_client.js b/lib/_http_client.js index 30a6366f35..43a60ca1f5 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -21,7 +21,11 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectAssign, + ObjectKeys, + ObjectSetPrototypeOf, +} = primordials; const net = require('net'); const url = require('url'); @@ -107,7 +111,7 @@ function ClientRequest(input, options, cb) { cb = options; options = input || {}; } else { - options = Object.assign(input || {}, options); + options = ObjectAssign(input || {}, options); } let agent = options.agent; @@ -216,7 +220,7 @@ function ClientRequest(input, options, cb) { const headersArray = Array.isArray(options.headers); if (!headersArray) { if (options.headers) { - const keys = Object.keys(options.headers); + const keys = ObjectKeys(options.headers); for (let i = 0; i < keys.length; i++) { const key = keys[i]; this.setHeader(key, options.headers[key]); @@ -295,8 +299,8 @@ function ClientRequest(input, options, cb) { this._deferToConnect(null, null, () => this._flush()); } -Object.setPrototypeOf(ClientRequest.prototype, OutgoingMessage.prototype); -Object.setPrototypeOf(ClientRequest, OutgoingMessage); +ObjectSetPrototypeOf(ClientRequest.prototype, OutgoingMessage.prototype); +ObjectSetPrototypeOf(ClientRequest, OutgoingMessage); ClientRequest.prototype._finish = function _finish() { DTRACE_HTTP_CLIENT_REQUEST(this, this.socket); diff --git a/lib/_http_common.js b/lib/_http_common.js index 8c88a90568..d0f07d3b69 100644 --- a/lib/_http_common.js +++ b/lib/_http_common.js @@ -21,7 +21,9 @@ 'use strict'; -const { Math } = primordials; +const { + MathMin, +} = primordials; const { setImmediate } = require('timers'); const { methods, HTTPParser } = internalBinding('http_parser'); @@ -95,7 +97,7 @@ function parserOnHeadersComplete(versionMajor, versionMinor, headers, method, // If parser.maxHeaderPairs <= 0 assume that there's no limit. if (parser.maxHeaderPairs > 0) - n = Math.min(n, parser.maxHeaderPairs); + n = MathMin(n, parser.maxHeaderPairs); incoming._addHeaderLines(headers, n); diff --git a/lib/_http_incoming.js b/lib/_http_incoming.js index 36d81153fe..bc04e8779f 100644 --- a/lib/_http_incoming.js +++ b/lib/_http_incoming.js @@ -21,7 +21,10 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperty, + ObjectSetPrototypeOf, +} = primordials; const Stream = require('stream'); @@ -80,10 +83,10 @@ function IncomingMessage(socket) { // read by the user, so there's no point continuing to handle it. this._dumped = false; } -Object.setPrototypeOf(IncomingMessage.prototype, Stream.Readable.prototype); -Object.setPrototypeOf(IncomingMessage, Stream.Readable); +ObjectSetPrototypeOf(IncomingMessage.prototype, Stream.Readable.prototype); +ObjectSetPrototypeOf(IncomingMessage, Stream.Readable); -Object.defineProperty(IncomingMessage.prototype, 'connection', { +ObjectDefineProperty(IncomingMessage.prototype, 'connection', { get: function() { return this.socket; }, diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index 0dc13f19fe..466d634acb 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -21,7 +21,13 @@ 'use strict'; -const { Object, ObjectPrototype } = primordials; +const { + ObjectCreate, + ObjectDefineProperty, + ObjectKeys, + ObjectPrototypeHasOwnProperty, + ObjectSetPrototypeOf, +} = primordials; const { getDefaultHighWaterMark } = require('internal/streams/state'); const assert = require('internal/assert'); @@ -109,10 +115,10 @@ function OutgoingMessage() { this._onPendingData = noopPendingOutput; } -Object.setPrototypeOf(OutgoingMessage.prototype, Stream.prototype); -Object.setPrototypeOf(OutgoingMessage, Stream); +ObjectSetPrototypeOf(OutgoingMessage.prototype, Stream.prototype); +ObjectSetPrototypeOf(OutgoingMessage, Stream); -Object.defineProperty(OutgoingMessage.prototype, 'writableFinished', { +ObjectDefineProperty(OutgoingMessage.prototype, 'writableFinished', { get() { return ( this.finished && @@ -122,32 +128,32 @@ Object.defineProperty(OutgoingMessage.prototype, 'writableFinished', { } }); -Object.defineProperty(OutgoingMessage.prototype, 'writableObjectMode', { +ObjectDefineProperty(OutgoingMessage.prototype, 'writableObjectMode', { get() { return false; } }); -Object.defineProperty(OutgoingMessage.prototype, 'writableLength', { +ObjectDefineProperty(OutgoingMessage.prototype, 'writableLength', { get() { return this.outputSize + (this.socket ? this.socket.writableLength : 0); } }); -Object.defineProperty(OutgoingMessage.prototype, 'writableHighWaterMark', { +ObjectDefineProperty(OutgoingMessage.prototype, 'writableHighWaterMark', { get() { return this.socket ? this.socket.writableHighWaterMark : HIGH_WATER_MARK; } }); -Object.defineProperty(OutgoingMessage.prototype, 'writableCorked', { +ObjectDefineProperty(OutgoingMessage.prototype, 'writableCorked', { get() { const corked = this.socket ? this.socket.writableCorked : 0; return corked + this[kCorked]; } }); -Object.defineProperty(OutgoingMessage.prototype, '_headers', { +ObjectDefineProperty(OutgoingMessage.prototype, '_headers', { get: internalUtil.deprecate(function() { return this.getHeaders(); }, 'OutgoingMessage.prototype._headers is deprecated', 'DEP0066'), @@ -155,8 +161,8 @@ Object.defineProperty(OutgoingMessage.prototype, '_headers', { if (val == null) { this[kOutHeaders] = null; } else if (typeof val === 'object') { - const headers = this[kOutHeaders] = Object.create(null); - const keys = Object.keys(val); + const headers = this[kOutHeaders] = ObjectCreate(null); + const keys = ObjectKeys(val); for (var i = 0; i < keys.length; ++i) { const name = keys[i]; headers[name.toLowerCase()] = [name, val[name]]; @@ -165,7 +171,7 @@ Object.defineProperty(OutgoingMessage.prototype, '_headers', { }, 'OutgoingMessage.prototype._headers is deprecated', 'DEP0066') }); -Object.defineProperty(OutgoingMessage.prototype, 'connection', { +ObjectDefineProperty(OutgoingMessage.prototype, 'connection', { get: function() { return this.socket; }, @@ -174,12 +180,12 @@ Object.defineProperty(OutgoingMessage.prototype, 'connection', { } }); -Object.defineProperty(OutgoingMessage.prototype, '_headerNames', { +ObjectDefineProperty(OutgoingMessage.prototype, '_headerNames', { get: internalUtil.deprecate(function() { const headers = this[kOutHeaders]; if (headers !== null) { - const out = Object.create(null); - const keys = Object.keys(headers); + const out = ObjectCreate(null); + const keys = ObjectKeys(headers); for (var i = 0; i < keys.length; ++i) { const key = keys[i]; const val = headers[key][0]; @@ -194,7 +200,7 @@ Object.defineProperty(OutgoingMessage.prototype, '_headerNames', { const headers = this[kOutHeaders]; if (!headers) return; - const keys = Object.keys(val); + const keys = ObjectKeys(val); for (var i = 0; i < keys.length; ++i) { const header = headers[keys[i]]; if (header) @@ -214,7 +220,7 @@ OutgoingMessage.prototype._renderHeaders = function _renderHeaders() { const headers = {}; if (headersMap !== null) { - const keys = Object.keys(headersMap); + const keys = ObjectKeys(headersMap); for (var i = 0, l = keys.length; i < l; i++) { const key = keys[i]; headers[headersMap[key][0]] = headersMap[key][1]; @@ -359,7 +365,7 @@ function _storeHeader(firstLine, headers) { } } else { for (const key in headers) { - if (ObjectPrototype.hasOwnProperty(headers, key)) { + if (ObjectPrototypeHasOwnProperty(headers, key)) { processHeader(this, state, key, headers[key], true); } } @@ -520,7 +526,7 @@ OutgoingMessage.prototype.setHeader = function setHeader(name, value) { let headers = this[kOutHeaders]; if (headers === null) - this[kOutHeaders] = headers = Object.create(null); + this[kOutHeaders] = headers = ObjectCreate(null); headers[name.toLowerCase()] = [name, value]; }; @@ -540,16 +546,16 @@ OutgoingMessage.prototype.getHeader = function getHeader(name) { // Returns an array of the names of the current outgoing headers. OutgoingMessage.prototype.getHeaderNames = function getHeaderNames() { - return this[kOutHeaders] !== null ? Object.keys(this[kOutHeaders]) : []; + return this[kOutHeaders] !== null ? ObjectKeys(this[kOutHeaders]) : []; }; // Returns a shallow copy of the current outgoing headers. OutgoingMessage.prototype.getHeaders = function getHeaders() { const headers = this[kOutHeaders]; - const ret = Object.create(null); + const ret = ObjectCreate(null); if (headers) { - const keys = Object.keys(headers); + const keys = ObjectKeys(headers); for (var i = 0; i < keys.length; ++i) { const key = keys[i]; const val = headers[key][1]; @@ -601,13 +607,13 @@ OutgoingMessage.prototype._implicitHeader = function _implicitHeader() { this.emit('error', new ERR_METHOD_NOT_IMPLEMENTED('_implicitHeader()')); }; -Object.defineProperty(OutgoingMessage.prototype, 'headersSent', { +ObjectDefineProperty(OutgoingMessage.prototype, 'headersSent', { configurable: true, enumerable: true, get: function() { return !!this._header; } }); -Object.defineProperty(OutgoingMessage.prototype, 'writableEnded', { +ObjectDefineProperty(OutgoingMessage.prototype, 'writableEnded', { get: function() { return this.finished; } }); @@ -688,7 +694,7 @@ function connectionCorkNT(conn) { OutgoingMessage.prototype.addTrailers = function addTrailers(headers) { this._trailer = ''; - const keys = Object.keys(headers); + const keys = ObjectKeys(headers); const isArray = Array.isArray(headers); var field, value; for (var i = 0, l = keys.length; i < l; i++) { diff --git a/lib/_http_server.js b/lib/_http_server.js index 59d1960297..bb9e654668 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -22,10 +22,8 @@ 'use strict'; const { - Object: { - setPrototypeOf: ObjectSetPrototypeOf, - keys: ObjectKeys, - } + ObjectKeys, + ObjectSetPrototypeOf, } = primordials; const net = require('net'); @@ -260,7 +258,7 @@ function writeHead(statusCode, reason, obj) { let k; if (obj) { const keys = ObjectKeys(obj); - for (var i = 0; i < keys.length; i++) { + for (let i = 0; i < keys.length; i++) { k = keys[i]; if (k) this.setHeader(k, obj[k]); } diff --git a/lib/_stream_duplex.js b/lib/_stream_duplex.js index 858dc938f0..572e6da94d 100644 --- a/lib/_stream_duplex.js +++ b/lib/_stream_duplex.js @@ -26,19 +26,23 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperty, + ObjectKeys, + ObjectSetPrototypeOf, +} = primordials; module.exports = Duplex; const Readable = require('_stream_readable'); const Writable = require('_stream_writable'); -Object.setPrototypeOf(Duplex.prototype, Readable.prototype); -Object.setPrototypeOf(Duplex, Readable); +ObjectSetPrototypeOf(Duplex.prototype, Readable.prototype); +ObjectSetPrototypeOf(Duplex, Readable); { // Allow the keys array to be GC'ed. - const keys = Object.keys(Writable.prototype); + const keys = ObjectKeys(Writable.prototype); for (let v = 0; v < keys.length; v++) { const method = keys[v]; if (!Duplex.prototype[method]) @@ -68,7 +72,7 @@ function Duplex(options) { } } -Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { +ObjectDefineProperty(Duplex.prototype, 'writableHighWaterMark', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -78,7 +82,7 @@ Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { } }); -Object.defineProperty(Duplex.prototype, 'writableBuffer', { +ObjectDefineProperty(Duplex.prototype, 'writableBuffer', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -88,7 +92,7 @@ Object.defineProperty(Duplex.prototype, 'writableBuffer', { } }); -Object.defineProperty(Duplex.prototype, 'writableLength', { +ObjectDefineProperty(Duplex.prototype, 'writableLength', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -98,7 +102,7 @@ Object.defineProperty(Duplex.prototype, 'writableLength', { } }); -Object.defineProperty(Duplex.prototype, 'writableFinished', { +ObjectDefineProperty(Duplex.prototype, 'writableFinished', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -108,7 +112,7 @@ Object.defineProperty(Duplex.prototype, 'writableFinished', { } }); -Object.defineProperty(Duplex.prototype, 'writableCorked', { +ObjectDefineProperty(Duplex.prototype, 'writableCorked', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -118,7 +122,7 @@ Object.defineProperty(Duplex.prototype, 'writableCorked', { } }); -Object.defineProperty(Duplex.prototype, 'writableEnded', { +ObjectDefineProperty(Duplex.prototype, 'writableEnded', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -143,7 +147,7 @@ function onEndNT(self) { self.end(); } -Object.defineProperty(Duplex.prototype, 'destroyed', { +ObjectDefineProperty(Duplex.prototype, 'destroyed', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail diff --git a/lib/_stream_passthrough.js b/lib/_stream_passthrough.js index 205a14b65f..279df5ac2d 100644 --- a/lib/_stream_passthrough.js +++ b/lib/_stream_passthrough.js @@ -25,13 +25,15 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectSetPrototypeOf, +} = primordials; module.exports = PassThrough; const Transform = require('_stream_transform'); -Object.setPrototypeOf(PassThrough.prototype, Transform.prototype); -Object.setPrototypeOf(PassThrough, Transform); +ObjectSetPrototypeOf(PassThrough.prototype, Transform.prototype); +ObjectSetPrototypeOf(PassThrough, Transform); function PassThrough(options) { if (!(this instanceof PassThrough)) diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js index 71fd74b07b..69f46f80a0 100644 --- a/lib/_stream_readable.js +++ b/lib/_stream_readable.js @@ -21,7 +21,10 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperty, + ObjectSetPrototypeOf, +} = primordials; module.exports = Readable; Readable.ReadableState = ReadableState; @@ -49,8 +52,8 @@ let StringDecoder; let createReadableStreamAsyncIterator; let from; -Object.setPrototypeOf(Readable.prototype, Stream.prototype); -Object.setPrototypeOf(Readable, Stream); +ObjectSetPrototypeOf(Readable.prototype, Stream.prototype); +ObjectSetPrototypeOf(Readable, Stream); const { errorOrDestroy } = destroyImpl; const kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; @@ -157,7 +160,7 @@ function ReadableState(options, stream, isDuplex) { } // Legacy getter for `pipesCount` -Object.defineProperty(ReadableState.prototype, 'pipesCount', { +ObjectDefineProperty(ReadableState.prototype, 'pipesCount', { get() { return this.pipes.length; } @@ -187,7 +190,7 @@ function Readable(options) { Stream.call(this); } -Object.defineProperty(Readable.prototype, 'destroyed', { +ObjectDefineProperty(Readable.prototype, 'destroyed', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -211,7 +214,7 @@ Object.defineProperty(Readable.prototype, 'destroyed', { } }); -Object.defineProperty(Readable.prototype, 'readableEnded', { +ObjectDefineProperty(Readable.prototype, 'readableEnded', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -1089,7 +1092,7 @@ Readable.prototype[Symbol.asyncIterator] = function() { return createReadableStreamAsyncIterator(this); }; -Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { +ObjectDefineProperty(Readable.prototype, 'readableHighWaterMark', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -1099,7 +1102,7 @@ Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { } }); -Object.defineProperty(Readable.prototype, 'readableBuffer', { +ObjectDefineProperty(Readable.prototype, 'readableBuffer', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -1109,7 +1112,7 @@ Object.defineProperty(Readable.prototype, 'readableBuffer', { } }); -Object.defineProperty(Readable.prototype, 'readableFlowing', { +ObjectDefineProperty(Readable.prototype, 'readableFlowing', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -1127,7 +1130,7 @@ Object.defineProperty(Readable.prototype, 'readableFlowing', { // Exposed for testing purposes only. Readable._fromList = fromList; -Object.defineProperty(Readable.prototype, 'readableLength', { +ObjectDefineProperty(Readable.prototype, 'readableLength', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -1137,14 +1140,14 @@ Object.defineProperty(Readable.prototype, 'readableLength', { } }); -Object.defineProperty(Readable.prototype, 'readableObjectMode', { +ObjectDefineProperty(Readable.prototype, 'readableObjectMode', { enumerable: false, get() { return this._readableState ? this._readableState.objectMode : false; } }); -Object.defineProperty(Readable.prototype, 'readableEncoding', { +ObjectDefineProperty(Readable.prototype, 'readableEncoding', { enumerable: false, get() { return this._readableState ? this._readableState.encoding : null; diff --git a/lib/_stream_transform.js b/lib/_stream_transform.js index b4fffaa988..cb4aae2e6d 100644 --- a/lib/_stream_transform.js +++ b/lib/_stream_transform.js @@ -63,7 +63,9 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectSetPrototypeOf, +} = primordials; module.exports = Transform; const { @@ -73,8 +75,8 @@ const { ERR_TRANSFORM_WITH_LENGTH_0 } = require('internal/errors').codes; const Duplex = require('_stream_duplex'); -Object.setPrototypeOf(Transform.prototype, Duplex.prototype); -Object.setPrototypeOf(Transform, Duplex); +ObjectSetPrototypeOf(Transform.prototype, Duplex.prototype); +ObjectSetPrototypeOf(Transform, Duplex); function afterTransform(er, data) { diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index c7a3047dc7..5eb34dc213 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -25,7 +25,10 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperty, + ObjectSetPrototypeOf, +} = primordials; module.exports = Writable; Writable.WritableState = WritableState; @@ -52,8 +55,8 @@ const { const { errorOrDestroy } = destroyImpl; -Object.setPrototypeOf(Writable.prototype, Stream.prototype); -Object.setPrototypeOf(Writable, Stream); +ObjectSetPrototypeOf(Writable.prototype, Stream.prototype); +ObjectSetPrototypeOf(Writable, Stream); function nop() {} @@ -183,7 +186,7 @@ WritableState.prototype.getBuffer = function getBuffer() { return out; }; -Object.defineProperty(WritableState.prototype, 'buffer', { +ObjectDefineProperty(WritableState.prototype, 'buffer', { get: internalUtil.deprecate(function writableStateBufferGetter() { return this.getBuffer(); }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + @@ -195,7 +198,7 @@ Object.defineProperty(WritableState.prototype, 'buffer', { var realHasInstance; if (typeof Symbol === 'function' && Symbol.hasInstance) { realHasInstance = Function.prototype[Symbol.hasInstance]; - Object.defineProperty(Writable, Symbol.hasInstance, { + ObjectDefineProperty(Writable, Symbol.hasInstance, { value: function(object) { if (realHasInstance.call(this, object)) return true; @@ -346,7 +349,7 @@ Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { return this; }; -Object.defineProperty(Writable.prototype, 'writableBuffer', { +ObjectDefineProperty(Writable.prototype, 'writableBuffer', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -365,7 +368,7 @@ function decodeChunk(state, chunk, encoding) { return chunk; } -Object.defineProperty(Writable.prototype, 'writableEnded', { +ObjectDefineProperty(Writable.prototype, 'writableEnded', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -375,7 +378,7 @@ Object.defineProperty(Writable.prototype, 'writableEnded', { } }); -Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { +ObjectDefineProperty(Writable.prototype, 'writableHighWaterMark', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -385,7 +388,7 @@ Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { } }); -Object.defineProperty(Writable.prototype, 'writableCorked', { +ObjectDefineProperty(Writable.prototype, 'writableCorked', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -624,7 +627,7 @@ Writable.prototype.end = function(chunk, encoding, cb) { return this; }; -Object.defineProperty(Writable.prototype, 'writableLength', { +ObjectDefineProperty(Writable.prototype, 'writableLength', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -741,7 +744,7 @@ function onFinished(stream, state, cb) { stream.prependListener('error', onerror); } -Object.defineProperty(Writable.prototype, 'destroyed', { +ObjectDefineProperty(Writable.prototype, 'destroyed', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail @@ -765,14 +768,14 @@ Object.defineProperty(Writable.prototype, 'destroyed', { } }); -Object.defineProperty(Writable.prototype, 'writableObjectMode', { +ObjectDefineProperty(Writable.prototype, 'writableObjectMode', { enumerable: false, get() { return this._writableState ? this._writableState.objectMode : false; } }); -Object.defineProperty(Writable.prototype, 'writableFinished', { +ObjectDefineProperty(Writable.prototype, 'writableFinished', { // Making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail diff --git a/lib/_tls_common.js b/lib/_tls_common.js index 981503e6e9..13ff850c99 100644 --- a/lib/_tls_common.js +++ b/lib/_tls_common.js @@ -21,7 +21,9 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectCreate, +} = primordials; const { parseCertString } = require('internal/tls'); const { isArrayBufferView } = require('internal/util/types'); @@ -314,7 +316,7 @@ exports.translatePeerCertificate = function translatePeerCertificate(c) { if (c.subject != null) c.subject = parseCertString(c.subject); if (c.infoAccess != null) { const info = c.infoAccess; - c.infoAccess = Object.create(null); + c.infoAccess = ObjectCreate(null); // XXX: More key validation? info.replace(/([^\n:]*):([^\n]*)(?:\n|$)/g, (all, key, val) => { diff --git a/lib/_tls_wrap.js b/lib/_tls_wrap.js index 69fc054758..6f08f91c43 100644 --- a/lib/_tls_wrap.js +++ b/lib/_tls_wrap.js @@ -21,7 +21,11 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectAssign, + ObjectDefineProperty, + ObjectSetPrototypeOf, +} = primordials; const { assertCrypto, @@ -437,8 +441,8 @@ function TLSSocket(socket, opts) { // Read on next tick so the caller has a chance to setup listeners process.nextTick(initRead, this, socket); } -Object.setPrototypeOf(TLSSocket.prototype, net.Socket.prototype); -Object.setPrototypeOf(TLSSocket, net.Socket); +ObjectSetPrototypeOf(TLSSocket.prototype, net.Socket.prototype); +ObjectSetPrototypeOf(TLSSocket, net.Socket); exports.TLSSocket = TLSSocket; const proxiedMethods = [ @@ -531,7 +535,7 @@ TLSSocket.prototype._wrapHandle = function(wrap) { // This eliminates a cyclic reference to TLSWrap // Ref: https://github.com/nodejs/node/commit/f7620fb96d339f704932f9bb9a0dceb9952df2d4 function defineHandleReading(socket, handle) { - Object.defineProperty(handle, 'reading', { + ObjectDefineProperty(handle, 'reading', { get: () => { return socket[kRes].reading; }, @@ -1077,8 +1081,8 @@ function Server(options, listener) { this[kEnableTrace] = options.enableTrace; } -Object.setPrototypeOf(Server.prototype, net.Server.prototype); -Object.setPrototypeOf(Server, net.Server); +ObjectSetPrototypeOf(Server.prototype, net.Server.prototype); +ObjectSetPrototypeOf(Server, net.Server); exports.Server = Server; exports.createServer = function createServer(options, listener) { return new Server(options, listener); @@ -1318,9 +1322,9 @@ function normalizeConnectArgs(listArgs) { // the host/port/path args that it knows about, not the tls options. // This means that options.host overrides a host arg. if (listArgs[1] !== null && typeof listArgs[1] === 'object') { - Object.assign(options, listArgs[1]); + ObjectAssign(options, listArgs[1]); } else if (listArgs[2] !== null && typeof listArgs[2] === 'object') { - Object.assign(options, listArgs[2]); + ObjectAssign(options, listArgs[2]); } return cb ? [options, cb] : [options]; diff --git a/lib/assert.js b/lib/assert.js index 4ce3c3bfde..c3faba0905 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -20,7 +20,12 @@ 'use strict'; -const { Object, ObjectPrototype } = primordials; +const { + ObjectAssign, + ObjectIs, + ObjectKeys, + ObjectPrototypeIsPrototypeOf, +} = primordials; const { Buffer } = require('buffer'); const { @@ -494,7 +499,7 @@ assert.strictEqual = function strictEqual(actual, expected, message) { if (arguments.length < 2) { throw new ERR_MISSING_ARGS('actual', 'expected'); } - if (!Object.is(actual, expected)) { + if (!ObjectIs(actual, expected)) { innerFail({ actual, expected, @@ -509,7 +514,7 @@ assert.notStrictEqual = function notStrictEqual(actual, expected, message) { if (arguments.length < 2) { throw new ERR_MISSING_ARGS('actual', 'expected'); } - if (Object.is(actual, expected)) { + if (ObjectIs(actual, expected)) { innerFail({ actual, expected, @@ -595,7 +600,7 @@ function expectedException(actual, expected, message, fn) { throw err; } else { // Handle validation objects. - const keys = Object.keys(expected); + const keys = ObjectKeys(expected); // Special handle errors to make sure the name and the message are // compared as well. if (expected instanceof Error) { @@ -619,7 +624,7 @@ function expectedException(actual, expected, message, fn) { // Check for matching Error classes. } else if (expected.prototype !== undefined && actual instanceof expected) { return; - } else if (ObjectPrototype.isPrototypeOf(Error, expected)) { + } else if (ObjectPrototypeIsPrototypeOf(Error, expected)) { if (!message) { generatedMessage = true; message = 'The error is expected to be an instance of ' + @@ -883,7 +888,7 @@ assert.ifError = function ifError(err) { function strict(...args) { innerOk(strict, args.length, ...args); } -assert.strict = Object.assign(strict, assert, { +assert.strict = ObjectAssign(strict, assert, { equal: assert.strictEqual, deepEqual: assert.deepStrictEqual, notEqual: assert.notStrictEqual, diff --git a/lib/async_hooks.js b/lib/async_hooks.js index c18a902c2a..a567e1599f 100644 --- a/lib/async_hooks.js +++ b/lib/async_hooks.js @@ -1,6 +1,8 @@ 'use strict'; -const { Reflect } = primordials; +const { + ReflectApply, +} = primordials; const { ERR_ASYNC_CALLBACK, @@ -171,7 +173,7 @@ class AsyncResource { try { if (thisArg === undefined) return fn(...args); - return Reflect.apply(fn, thisArg, args); + return ReflectApply(fn, thisArg, args); } finally { if (hasAsyncIdStack()) emitAfter(asyncId); diff --git a/lib/buffer.js b/lib/buffer.js index a751677a73..6c70cd61c8 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -22,17 +22,13 @@ 'use strict'; const { - Object: { - defineProperties: ObjectDefineProperties, - defineProperty: ObjectDefineProperty, - setPrototypeOf: ObjectSetPrototypeOf, - create: ObjectCreate - }, - Math: { - floor: MathFloor, - trunc: MathTrunc, - min: MathMin - } + MathFloor, + MathMin, + MathTrunc, + ObjectCreate, + ObjectDefineProperties, + ObjectDefineProperty, + ObjectSetPrototypeOf, } = primordials; const { diff --git a/lib/child_process.js b/lib/child_process.js index 16dc30856a..e31a95141f 100644 --- a/lib/child_process.js +++ b/lib/child_process.js @@ -21,7 +21,11 @@ 'use strict'; -const { Object, ObjectPrototype } = primordials; +const { + ObjectAssign, + ObjectDefineProperty, + ObjectPrototypeHasOwnProperty, +} = primordials; const { promisify, @@ -170,7 +174,7 @@ const customPromiseExecFunction = (orig) => { }; }; -Object.defineProperty(exec, promisify.custom, { +ObjectDefineProperty(exec, promisify.custom, { enumerable: false, value: customPromiseExecFunction(exec) }); @@ -389,7 +393,7 @@ function execFile(file /* , args, options, callback */) { return child; } -Object.defineProperty(execFile, promisify.custom, { +ObjectDefineProperty(execFile, promisify.custom, { enumerable: false, value: customPromiseExecFunction(execFile) }); @@ -507,7 +511,7 @@ function normalizeSpawnArguments(file, args, options) { // process.env.NODE_V8_COVERAGE always propagates, making it possible to // collect coverage for programs that spawn with white-listed environment. if (process.env.NODE_V8_COVERAGE && - !ObjectPrototype.hasOwnProperty(options.env || {}, 'NODE_V8_COVERAGE')) { + !ObjectPrototypeHasOwnProperty(options.env || {}, 'NODE_V8_COVERAGE')) { env.NODE_V8_COVERAGE = process.env.NODE_V8_COVERAGE; } @@ -603,7 +607,7 @@ function checkExecSyncError(ret, args, cmd) { err = new Error(msg); } if (err) { - Object.assign(err, ret); + ObjectAssign(err, ret); } return err; } diff --git a/lib/constants.js b/lib/constants.js index 77341c0646..cd510f7a37 100644 --- a/lib/constants.js +++ b/lib/constants.js @@ -21,18 +21,21 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectAssign, + ObjectFreeze, +} = primordials; // This module is deprecated in documentation only. Users should be directed // towards using the specific constants exposed by the individual modules on // which they are most relevant. // Deprecation Code: DEP0008 const constants = internalBinding('constants'); -Object.assign(exports, - constants.os.dlopen, - constants.os.errno, - constants.os.priority, - constants.os.signals, - constants.fs, - constants.crypto); -Object.freeze(exports); +ObjectAssign(exports, + constants.os.dlopen, + constants.os.errno, + constants.os.priority, + constants.os.signals, + constants.fs, + constants.crypto); +ObjectFreeze(exports); diff --git a/lib/crypto.js b/lib/crypto.js index 6bfa8319c1..e2d1875d8d 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -24,7 +24,9 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperties, +} = primordials; const { assertCrypto, @@ -220,7 +222,7 @@ function getFipsForced() { return 1; } -Object.defineProperties(module.exports, { +ObjectDefineProperties(module.exports, { createCipher: { enumerable: false, value: deprecate(createCipher, diff --git a/lib/dgram.js b/lib/dgram.js index 94f44d5202..64d57805c3 100644 --- a/lib/dgram.js +++ b/lib/dgram.js @@ -21,7 +21,10 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperty, + ObjectSetPrototypeOf, +} = primordials; const errors = require('internal/errors'); const { @@ -121,8 +124,8 @@ function Socket(type, listener) { sendBufferSize }; } -Object.setPrototypeOf(Socket.prototype, EventEmitter.prototype); -Object.setPrototypeOf(Socket, EventEmitter); +ObjectSetPrototypeOf(Socket.prototype, EventEmitter.prototype); +ObjectSetPrototypeOf(Socket, EventEmitter); function createSocket(type, listener) { @@ -965,7 +968,7 @@ Socket.prototype.getSendBufferSize = function() { // Deprecated private APIs. -Object.defineProperty(Socket.prototype, '_handle', { +ObjectDefineProperty(Socket.prototype, '_handle', { get: deprecate(function() { return this[kStateSymbol].handle; }, 'Socket.prototype._handle is deprecated', 'DEP0112'), @@ -975,7 +978,7 @@ Object.defineProperty(Socket.prototype, '_handle', { }); -Object.defineProperty(Socket.prototype, '_receiving', { +ObjectDefineProperty(Socket.prototype, '_receiving', { get: deprecate(function() { return this[kStateSymbol].receiving; }, 'Socket.prototype._receiving is deprecated', 'DEP0112'), @@ -985,7 +988,7 @@ Object.defineProperty(Socket.prototype, '_receiving', { }); -Object.defineProperty(Socket.prototype, '_bindState', { +ObjectDefineProperty(Socket.prototype, '_bindState', { get: deprecate(function() { return this[kStateSymbol].bindState; }, 'Socket.prototype._bindState is deprecated', 'DEP0112'), @@ -995,7 +998,7 @@ Object.defineProperty(Socket.prototype, '_bindState', { }); -Object.defineProperty(Socket.prototype, '_queue', { +ObjectDefineProperty(Socket.prototype, '_queue', { get: deprecate(function() { return this[kStateSymbol].queue; }, 'Socket.prototype._queue is deprecated', 'DEP0112'), @@ -1005,7 +1008,7 @@ Object.defineProperty(Socket.prototype, '_queue', { }); -Object.defineProperty(Socket.prototype, '_reuseAddr', { +ObjectDefineProperty(Socket.prototype, '_reuseAddr', { get: deprecate(function() { return this[kStateSymbol].reuseAddr; }, 'Socket.prototype._reuseAddr is deprecated', 'DEP0112'), @@ -1027,7 +1030,7 @@ Socket.prototype._stopReceiving = deprecate(function() { // Legacy alias on the C++ wrapper object. This is not public API, so we may // want to runtime-deprecate it at some point. There's no hurry, though. -Object.defineProperty(UDP.prototype, 'owner', { +ObjectDefineProperty(UDP.prototype, 'owner', { get() { return this[owner_symbol]; }, set(v) { return this[owner_symbol] = v; } }); diff --git a/lib/dns.js b/lib/dns.js index 2a4dd15c5e..8a6c7456ba 100644 --- a/lib/dns.js +++ b/lib/dns.js @@ -21,7 +21,11 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectCreate, + ObjectDefineProperties, + ObjectDefineProperty, +} = primordials; const cares = internalBinding('cares_wrap'); const { toASCII } = require('internal/idna'); @@ -152,8 +156,8 @@ function lookup(hostname, options, callback) { return req; } -Object.defineProperty(lookup, customPromisifyArgs, - { value: ['address', 'family'], enumerable: false }); +ObjectDefineProperty(lookup, customPromisifyArgs, + { value: ['address', 'family'], enumerable: false }); function onlookupservice(err, hostname, service) { @@ -190,8 +194,8 @@ function lookupService(address, port, callback) { return req; } -Object.defineProperty(lookupService, customPromisifyArgs, - { value: ['hostname', 'service'], enumerable: false }); +ObjectDefineProperty(lookupService, customPromisifyArgs, + { value: ['hostname', 'service'], enumerable: false }); function onresolve(err, result, ttls) { @@ -227,11 +231,11 @@ function resolver(bindingName) { if (err) throw dnsException(err, bindingName, name); return req; } - Object.defineProperty(query, 'name', { value: bindingName }); + ObjectDefineProperty(query, 'name', { value: bindingName }); return query; } -const resolveMap = Object.create(null); +const resolveMap = ObjectCreate(null); Resolver.prototype.resolveAny = resolveMap.ANY = resolver('queryAny'); Resolver.prototype.resolve4 = resolveMap.A = resolver('queryA'); Resolver.prototype.resolve6 = resolveMap.AAAA = resolver('queryAaaa'); @@ -316,7 +320,7 @@ module.exports = { bindDefaultResolver(module.exports, getDefaultResolver()); -Object.defineProperties(module.exports, { +ObjectDefineProperties(module.exports, { promises: { configurable: true, enumerable: true, diff --git a/lib/domain.js b/lib/domain.js index c3e38ba832..7c35a7c81a 100644 --- a/lib/domain.js +++ b/lib/domain.js @@ -26,7 +26,10 @@ // No new pull requests targeting this module will be accepted // unless they address existing, critical bugs. -const { Object, Reflect } = primordials; +const { + ObjectDefineProperty, + ReflectApply, +} = primordials; const EventEmitter = require('events'); const { @@ -43,7 +46,7 @@ const { WeakReference } = internalBinding('util'); // Overwrite process.domain with a getter/setter that will allow for more // effective optimizations const _domain = [null]; -Object.defineProperty(process, 'domain', { +ObjectDefineProperty(process, 'domain', { enumerable: true, get: function() { return _domain[0]; @@ -59,7 +62,7 @@ const asyncHook = createHook({ if (process.domain !== null && process.domain !== undefined) { // If this operation is created while in a domain, let's mark it pairing.set(asyncId, process.domain[kWeak]); - Object.defineProperty(resource, 'domain', { + ObjectDefineProperty(resource, 'domain', { configurable: true, enumerable: false, value: process.domain, @@ -127,7 +130,7 @@ function topLevelDomainCallback(cb, ...args) { if (domain) domain.enter(); - const ret = Reflect.apply(cb, this, args); + const ret = ReflectApply(cb, this, args); if (domain) domain.exit(); @@ -207,7 +210,7 @@ Domain.prototype._errorHandler = function(er) { let caught = false; if ((typeof er === 'object' && er !== null) || typeof er === 'function') { - Object.defineProperty(er, 'domain', { + ObjectDefineProperty(er, 'domain', { configurable: true, enumerable: false, value: this, @@ -332,7 +335,7 @@ Domain.prototype.add = function(ee) { } } - Object.defineProperty(ee, 'domain', { + ObjectDefineProperty(ee, 'domain', { configurable: true, enumerable: false, value: this, @@ -376,7 +379,7 @@ function intercepted(_this, self, cb, fnargs) { const er = fnargs[0]; er.domainBound = cb; er.domainThrown = false; - Object.defineProperty(er, 'domain', { + ObjectDefineProperty(er, 'domain', { configurable: true, enumerable: false, value: self, @@ -435,7 +438,7 @@ Domain.prototype.bind = function(cb) { return bound(this, self, cb, arguments); } - Object.defineProperty(runBound, 'domain', { + ObjectDefineProperty(runBound, 'domain', { configurable: true, enumerable: false, value: this, @@ -450,7 +453,7 @@ EventEmitter.usingDomains = true; const eventInit = EventEmitter.init; EventEmitter.init = function() { - Object.defineProperty(this, 'domain', { + ObjectDefineProperty(this, 'domain', { configurable: true, enumerable: false, value: null, @@ -475,7 +478,7 @@ EventEmitter.prototype.emit = function(...args) { // handler, there's no active domain or this is process if (shouldEmitError || domain === null || domain === undefined || this === process) { - return Reflect.apply(eventEmit, this, args); + return ReflectApply(eventEmit, this, args); } if (type === 'error') { @@ -484,7 +487,7 @@ EventEmitter.prototype.emit = function(...args) { if (typeof er === 'object') { er.domainEmitter = this; - Object.defineProperty(er, 'domain', { + ObjectDefineProperty(er, 'domain', { configurable: true, enumerable: false, value: domain, @@ -537,7 +540,7 @@ EventEmitter.prototype.emit = function(...args) { } domain.enter(); - const ret = Reflect.apply(eventEmit, this, args); + const ret = ReflectApply(eventEmit, this, args); domain.exit(); return ret; diff --git a/lib/events.js b/lib/events.js index f3fa65153c..5feb76482e 100644 --- a/lib/events.js +++ b/lib/events.js @@ -22,19 +22,13 @@ 'use strict'; const { - Math: { - min: MathMin - }, - Object: { - defineProperty: ObjectDefineProperty, - getPrototypeOf: ObjectGetPrototypeOf, - create: ObjectCreate, - keys: ObjectKeys, - }, - Reflect: { - apply: ReflectApply, - ownKeys: ReflectOwnKeys, - } + MathMin, + ObjectCreate, + ObjectDefineProperty, + ObjectGetPrototypeOf, + ObjectKeys, + ReflectApply, + ReflectOwnKeys, } = primordials; var spliceOne; diff --git a/lib/fs.js b/lib/fs.js index a686b01fff..8d44ee21be 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -24,7 +24,12 @@ 'use strict'; -const { Math, Object } = primordials; +const { + MathMax, + ObjectCreate, + ObjectDefineProperties, + ObjectDefineProperty, +} = primordials; const { fs: constants } = internalBinding('constants'); const { @@ -209,7 +214,7 @@ function exists(path, callback) { } } -Object.defineProperty(exists, internalUtil.promisify.custom, { +ObjectDefineProperty(exists, internalUtil.promisify.custom, { value: (path) => { return new Promise((resolve) => fs.exists(path, resolve)); } @@ -481,8 +486,8 @@ function read(fd, buffer, offset, length, position, callback) { binding.read(fd, buffer, offset, length, position, req); } -Object.defineProperty(read, internalUtil.customPromisifyArgs, - { value: ['bytesRead', 'buffer'], enumerable: false }); +ObjectDefineProperty(read, internalUtil.customPromisifyArgs, + { value: ['bytesRead', 'buffer'], enumerable: false }); function readSync(fd, buffer, offset, length, position) { validateInt32(fd, 'fd', 0); @@ -562,8 +567,8 @@ function write(fd, buffer, offset, length, position, callback) { return binding.writeString(fd, buffer, offset, length, req); } -Object.defineProperty(write, internalUtil.customPromisifyArgs, - { value: ['bytesWritten', 'buffer'], enumerable: false }); +ObjectDefineProperty(write, internalUtil.customPromisifyArgs, + { value: ['bytesWritten', 'buffer'], enumerable: false }); // Usage: // fs.writeSync(fd, buffer[, offset[, length[, position]]]); @@ -619,7 +624,7 @@ function writev(fd, buffers, position, callback) { return binding.writeBuffers(fd, buffers, position, req); } -Object.defineProperty(writev, internalUtil.customPromisifyArgs, { +ObjectDefineProperty(writev, internalUtil.customPromisifyArgs, { value: ['bytesWritten', 'buffer'], enumerable: false }); @@ -713,7 +718,7 @@ function ftruncate(fd, len = 0, callback) { } validateInt32(fd, 'fd', 0); validateInteger(len, 'len'); - len = Math.max(0, len); + len = MathMax(0, len); const req = new FSReqCallback(); req.oncomplete = makeCallback(callback); binding.ftruncate(fd, len, req); @@ -722,7 +727,7 @@ function ftruncate(fd, len = 0, callback) { function ftruncateSync(fd, len = 0) { validateInt32(fd, 'fd', 0); validateInteger(len, 'len'); - len = Math.max(0, len); + len = MathMax(0, len); const ctx = {}; binding.ftruncate(fd, len, undefined, ctx); handleErrorFromBinding(ctx); @@ -1461,7 +1466,7 @@ if (isWindows) { nextPart = function nextPart(p, i) { return p.indexOf('/', i); }; } -const emptyObj = Object.create(null); +const emptyObj = ObjectCreate(null); function realpathSync(p, options) { if (!options) options = emptyObj; @@ -1480,8 +1485,8 @@ function realpathSync(p, options) { return maybeCachedResult; } - const seenLinks = Object.create(null); - const knownHard = Object.create(null); + const seenLinks = ObjectCreate(null); + const knownHard = ObjectCreate(null); const original = p; // Current character position in p @@ -1618,8 +1623,8 @@ function realpath(p, options, callback) { validatePath(p); p = pathModule.resolve(p); - const seenLinks = Object.create(null); - const knownHard = Object.create(null); + const seenLinks = ObjectCreate(null); + const knownHard = ObjectCreate(null); // Current character position in p let pos; @@ -1950,7 +1955,7 @@ module.exports = fs = { _toUnixTimestamp: toUnixTimestamp }; -Object.defineProperties(fs, { +ObjectDefineProperties(fs, { F_OK: { enumerable: true, value: F_OK || 0 }, R_OK: { enumerable: true, value: R_OK || 0 }, W_OK: { enumerable: true, value: W_OK || 0 }, diff --git a/lib/http.js b/lib/http.js index 8582557446..55c655763d 100644 --- a/lib/http.js +++ b/lib/http.js @@ -21,7 +21,9 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperty, +} = primordials; const httpAgent = require('_http_agent'); const { ClientRequest } = require('_http_client'); @@ -65,7 +67,7 @@ module.exports = { request }; -Object.defineProperty(module.exports, 'maxHeaderSize', { +ObjectDefineProperty(module.exports, 'maxHeaderSize', { configurable: true, enumerable: true, get() { @@ -78,7 +80,7 @@ Object.defineProperty(module.exports, 'maxHeaderSize', { } }); -Object.defineProperty(module.exports, 'globalAgent', { +ObjectDefineProperty(module.exports, 'globalAgent', { configurable: true, enumerable: true, get() { diff --git a/lib/https.js b/lib/https.js index 6d799d0c92..d8383a0305 100644 --- a/lib/https.js +++ b/lib/https.js @@ -21,7 +21,10 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectAssign, + ObjectSetPrototypeOf, +} = primordials; require('internal/util').assertCrypto(); @@ -76,8 +79,8 @@ function Server(opts, requestListener) { this.maxHeadersCount = null; this.headersTimeout = 40 * 1000; // 40 seconds } -Object.setPrototypeOf(Server.prototype, tls.Server.prototype); -Object.setPrototypeOf(Server, tls.Server); +ObjectSetPrototypeOf(Server.prototype, tls.Server.prototype); +ObjectSetPrototypeOf(Server, tls.Server); Server.prototype.setTimeout = HttpServer.prototype.setTimeout; @@ -153,8 +156,8 @@ function Agent(options) { list: [] }; } -Object.setPrototypeOf(Agent.prototype, HttpAgent.prototype); -Object.setPrototypeOf(Agent, HttpAgent); +ObjectSetPrototypeOf(Agent.prototype, HttpAgent.prototype); +ObjectSetPrototypeOf(Agent, HttpAgent); Agent.prototype.createConnection = createConnection; Agent.prototype.getName = function getName(options) { @@ -296,7 +299,7 @@ function request(...args) { } if (args[0] && typeof args[0] !== 'function') { - Object.assign(options, args.shift()); + ObjectAssign(options, args.shift()); } options._defaultAgent = module.exports.globalAgent; diff --git a/lib/inspector.js b/lib/inspector.js index 2f29506b91..1075009383 100644 --- a/lib/inspector.js +++ b/lib/inspector.js @@ -1,6 +1,9 @@ 'use strict'; -const { JSON } = primordials; +const { + JSONParse, + JSONStringify, +} = primordials; const { ERR_INSPECTOR_ALREADY_CONNECTED, @@ -61,7 +64,7 @@ class Session extends EventEmitter { } [onMessageSymbol](message) { - const parsed = JSON.parse(message); + const parsed = JSONParse(message); try { if (parsed.id) { const callback = this[messageCallbacksSymbol].get(parsed.id); @@ -107,7 +110,7 @@ class Session extends EventEmitter { if (callback) { this[messageCallbacksSymbol].set(id, callback); } - this[connectionSymbol].dispatch(JSON.stringify(message)); + this[connectionSymbol].dispatch(JSONStringify(message)); } disconnect() { diff --git a/lib/internal/assert/assertion_error.js b/lib/internal/assert/assertion_error.js index 0b57bf2cb2..69a6d8afac 100644 --- a/lib/internal/assert/assertion_error.js +++ b/lib/internal/assert/assertion_error.js @@ -1,6 +1,12 @@ 'use strict'; -const { Math, Object } = primordials; +const { + MathMax, + ObjectCreate, + ObjectDefineProperty, + ObjectGetPrototypeOf, + ObjectKeys, +} = primordials; const { inspect } = require('internal/util/inspect'); const { codes: { @@ -31,12 +37,12 @@ const kReadableOperator = { const kMaxShortLength = 12; function copyError(source) { - const keys = Object.keys(source); - const target = Object.create(Object.getPrototypeOf(source)); + const keys = ObjectKeys(source); + const target = ObjectCreate(ObjectGetPrototypeOf(source)); for (const key of keys) { target[key] = source[key]; } - Object.defineProperty(target, 'message', { value: source.message }); + ObjectDefineProperty(target, 'message', { value: source.message }); return target; } @@ -135,7 +141,7 @@ function createErrDiff(actual, expected, operator) { b = expectedLines[expectedLines.length - 1]; } - const maxLines = Math.max(actualLines.length, expectedLines.length); + const maxLines = MathMax(actualLines.length, expectedLines.length); // Strict equal with identical objects that are not identical by reference. // E.g., assert.deepStrictEqual({ a: Symbol() }, { a: Symbol() }) if (maxLines === 0) { @@ -404,7 +410,7 @@ class AssertionError extends Error { Error.stackTraceLimit = limit; this.generatedMessage = !message; - Object.defineProperty(this, 'name', { + ObjectDefineProperty(this, 'name', { value: 'AssertionError [ERR_ASSERTION]', enumerable: false, writable: true, diff --git a/lib/internal/async_hooks.js b/lib/internal/async_hooks.js index bf803885ca..d5d61bfb15 100644 --- a/lib/internal/async_hooks.js +++ b/lib/internal/async_hooks.js @@ -1,6 +1,9 @@ 'use strict'; -const { FunctionPrototype, Object } = primordials; +const { + FunctionPrototypeBind, + ObjectDefineProperty, +} = primordials; const { ERR_ASYNC_TYPE, @@ -180,10 +183,10 @@ function emitHook(symbol, asyncId) { } function emitHookFactory(symbol, name) { - const fn = FunctionPrototype.bind(emitHook, undefined, symbol); + const fn = FunctionPrototypeBind(emitHook, undefined, symbol); // Set the name property of the function as it looks good in the stack trace. - Object.defineProperty(fn, 'name', { + ObjectDefineProperty(fn, 'name', { value: name }); return fn; diff --git a/lib/internal/bootstrap/loaders.js b/lib/internal/bootstrap/loaders.js index 1915dc6674..cfefc56bd8 100644 --- a/lib/internal/bootstrap/loaders.js +++ b/lib/internal/bootstrap/loaders.js @@ -44,15 +44,17 @@ /* global process, getLinkedBinding, getInternalBinding, primordials */ const { - Reflect, - Object, - ObjectPrototype, - SafeSet + ReflectGet, + ObjectCreate, + ObjectDefineProperty, + ObjectKeys, + ObjectPrototypeHasOwnProperty, + SafeSet, } = primordials; // Set up process.moduleLoadList. const moduleLoadList = []; -Object.defineProperty(process, 'moduleLoadList', { +ObjectDefineProperty(process, 'moduleLoadList', { value: moduleLoadList, configurable: true, enumerable: true, @@ -98,7 +100,7 @@ const internalBindingWhitelist = new SafeSet([ // Set up process.binding() and process._linkedBinding(). { - const bindingObj = Object.create(null); + const bindingObj = ObjectCreate(null); process.binding = function binding(module) { module = String(module); @@ -123,7 +125,7 @@ const internalBindingWhitelist = new SafeSet([ // Set up internalBinding() in the closure. let internalBinding; { - const bindingObj = Object.create(null); + const bindingObj = ObjectCreate(null); // eslint-disable-next-line no-global-assign internalBinding = function internalBinding(module) { let mod = bindingObj[module]; @@ -222,7 +224,7 @@ NativeModule.prototype.compileForPublicLoader = function() { // When using --expose-internals, we do not want to reflect the named // exports from core modules as this can trigger unnecessary getters. const internal = this.id.startsWith('internal/'); - this.exportKeys = internal ? [] : Object.keys(this.exports); + this.exportKeys = internal ? [] : ObjectKeys(this.exports); } this.getESMFacade(); this.syncExports(); @@ -230,8 +232,8 @@ NativeModule.prototype.compileForPublicLoader = function() { }; const getOwn = (target, property, receiver) => { - return ObjectPrototype.hasOwnProperty(target, property) ? - Reflect.get(target, property, receiver) : + return ObjectPrototypeHasOwnProperty(target, property) ? + ReflectGet(target, property, receiver) : undefined; }; diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js index 18acd9d2b6..c586ddfd5e 100644 --- a/lib/internal/bootstrap/node.js +++ b/lib/internal/bootstrap/node.js @@ -35,7 +35,14 @@ setupPrepareStackTrace(); -const { JSON, Object, Symbol } = primordials; +const { + JSONParse, + ObjectDefineProperties, + ObjectDefineProperty, + ObjectGetPrototypeOf, + ObjectSetPrototypeOf, + SymbolToStringTag, +} = primordials; const config = internalBinding('config'); const { deprecate } = require('internal/util'); @@ -64,7 +71,7 @@ if (ownsProcessState) { } // process.config is serialized config.gypi -process.config = JSON.parse(internalBinding('native_module').config); +process.config = JSONParse(internalBinding('native_module').config); const rawMethods = internalBinding('process_methods'); // Set up methods and events on the process object for the main thread @@ -205,7 +212,7 @@ const { setTraceCategoryStateUpdateHandler } = internalBinding('trace_events'); setTraceCategoryStateUpdateHandler(perThreadSetup.toggleTraceCategoryState); // process.allowedNodeEnvironmentFlags -Object.defineProperty(process, 'allowedNodeEnvironmentFlags', { +ObjectDefineProperty(process, 'allowedNodeEnvironmentFlags', { get() { const flags = perThreadSetup.buildAllowedFlags(); process.allowedNodeEnvironmentFlags = flags; @@ -214,7 +221,7 @@ Object.defineProperty(process, 'allowedNodeEnvironmentFlags', { // If the user tries to set this to another value, override // this completely to that value. set(value) { - Object.defineProperty(this, 'allowedNodeEnvironmentFlags', { + ObjectDefineProperty(this, 'allowedNodeEnvironmentFlags', { value, configurable: true, enumerable: true, @@ -234,7 +241,7 @@ process.assert = deprecate( // TODO(joyeecheung): this property has not been well-maintained, should we // deprecate it in favor of a better API? const { isDebugBuild, hasOpenSSL, hasInspector } = config; -Object.defineProperty(process, 'features', { +ObjectDefineProperty(process, 'features', { enumerable: true, writable: false, configurable: false, @@ -318,17 +325,17 @@ function setupPrepareStackTrace() { function setupProcessObject() { const EventEmitter = require('events'); - const origProcProto = Object.getPrototypeOf(process); - Object.setPrototypeOf(origProcProto, EventEmitter.prototype); + const origProcProto = ObjectGetPrototypeOf(process); + ObjectSetPrototypeOf(origProcProto, EventEmitter.prototype); EventEmitter.call(process); - Object.defineProperty(process, Symbol.toStringTag, { + ObjectDefineProperty(process, SymbolToStringTag, { enumerable: false, writable: true, configurable: false, value: 'process' }); // Make process globally available to users by putting it on the global proxy - Object.defineProperty(global, 'process', { + ObjectDefineProperty(global, 'process', { value: process, enumerable: false, writable: true, @@ -337,19 +344,19 @@ function setupProcessObject() { } function setupProcessStdio(getStdout, getStdin, getStderr) { - Object.defineProperty(process, 'stdout', { + ObjectDefineProperty(process, 'stdout', { configurable: true, enumerable: true, get: getStdout }); - Object.defineProperty(process, 'stderr', { + ObjectDefineProperty(process, 'stderr', { configurable: true, enumerable: true, get: getStderr }); - Object.defineProperty(process, 'stdin', { + ObjectDefineProperty(process, 'stdin', { configurable: true, enumerable: true, get: getStdin @@ -362,7 +369,7 @@ function setupProcessStdio(getStdout, getStdin, getStderr) { } function setupGlobalProxy() { - Object.defineProperty(global, Symbol.toStringTag, { + ObjectDefineProperty(global, SymbolToStringTag, { value: 'global', writable: false, enumerable: false, @@ -377,7 +384,7 @@ function setupGlobalProxy() { function makeSetter(name) { return deprecate(function(value) { - Object.defineProperty(this, name, { + ObjectDefineProperty(this, name, { configurable: true, writable: true, enumerable: true, @@ -386,7 +393,7 @@ function setupGlobalProxy() { }, `'${name}' is deprecated, use 'global'`, 'DEP0016'); } - Object.defineProperties(global, { + ObjectDefineProperties(global, { GLOBAL: { configurable: true, get: makeGetter('GLOBAL'), @@ -409,7 +416,7 @@ function setupBuffer() { delete bufferBinding.setBufferPrototype; delete bufferBinding.zeroFill; - Object.defineProperty(global, 'Buffer', { + ObjectDefineProperty(global, 'Buffer', { value: Buffer, enumerable: false, writable: true, @@ -436,7 +443,7 @@ function createGlobalConsole(consoleFromVM) { // https://heycam.github.io/webidl/#es-namespaces function exposeNamespace(target, name, namespaceObject) { - Object.defineProperty(target, name, { + ObjectDefineProperty(target, name, { writable: true, enumerable: false, configurable: true, @@ -446,7 +453,7 @@ function exposeNamespace(target, name, namespaceObject) { // https://heycam.github.io/webidl/#es-interfaces function exposeInterface(target, name, interfaceObject) { - Object.defineProperty(target, name, { + ObjectDefineProperty(target, name, { writable: true, enumerable: false, configurable: true, @@ -456,7 +463,7 @@ function exposeInterface(target, name, interfaceObject) { // https://heycam.github.io/webidl/#define-the-operations function defineOperation(target, name, method) { - Object.defineProperty(target, name, { + ObjectDefineProperty(target, name, { writable: true, enumerable: true, configurable: true, diff --git a/lib/internal/bootstrap/pre_execution.js b/lib/internal/bootstrap/pre_execution.js index db50c3d0ee..b373801592 100644 --- a/lib/internal/bootstrap/pre_execution.js +++ b/lib/internal/bootstrap/pre_execution.js @@ -1,6 +1,9 @@ 'use strict'; -const { Object, SafeWeakMap } = primordials; +const { + ObjectDefineProperty, + SafeWeakMap, +} = primordials; const { getOptionValue } = require('internal/options'); const { Buffer } = require('buffer'); @@ -74,7 +77,7 @@ function patchProcessObject(expandArgv1) { patchProcessObjectNative(process); - Object.defineProperty(process, 'argv0', { + ObjectDefineProperty(process, 'argv0', { enumerable: true, configurable: false, value: process.argv[0] @@ -107,7 +110,7 @@ function patchProcessObject(expandArgv1) { function addReadOnlyProcessAlias(name, option, enumerable = true) { const value = getOptionValue(option); if (value) { - Object.defineProperty(process, name, { + ObjectDefineProperty(process, name, { writable: false, configurable: true, enumerable, @@ -153,7 +156,7 @@ function initializeReport() { } const { report } = require('internal/process/report'); const { emitExperimentalWarning } = require('internal/util'); - Object.defineProperty(process, 'report', { + ObjectDefineProperty(process, 'report', { enumerable: false, configurable: true, get() { @@ -273,7 +276,7 @@ function initializeDeprecations() { // process.features. const { noBrowserGlobals } = internalBinding('config'); if (noBrowserGlobals) { - Object.defineProperty(process, '_noBrowserGlobals', { + ObjectDefineProperty(process, '_noBrowserGlobals', { writable: false, enumerable: true, configurable: true, @@ -295,7 +298,7 @@ function initializeDeprecations() { // deprecation path for these in ES Modules. // See https://github.com/nodejs/node/pull/26334. let _process = process; - Object.defineProperty(global, 'process', { + ObjectDefineProperty(global, 'process', { get() { return _process; }, @@ -307,7 +310,7 @@ function initializeDeprecations() { }); let _Buffer = Buffer; - Object.defineProperty(global, 'Buffer', { + ObjectDefineProperty(global, 'Buffer', { get() { return _Buffer; }, diff --git a/lib/internal/buffer.js b/lib/internal/buffer.js index f3bc0e48d1..9d86a8e722 100644 --- a/lib/internal/buffer.js +++ b/lib/internal/buffer.js @@ -1,6 +1,8 @@ 'use strict'; -const { Math } = primordials; +const { + MathFloor, +} = primordials; const { ERR_BUFFER_OUT_OF_BOUNDS, @@ -61,7 +63,7 @@ function checkInt(value, min, max, buf, offset, byteLength) { } function boundsError(value, length, type) { - if (Math.floor(value) !== value) { + if (MathFloor(value) !== value) { validateNumber(value, type); throw new ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value); } @@ -644,7 +646,7 @@ function writeU_Int48LE(buf, value, offset, min, max) { value = +value; checkInt(value, min, max, buf, offset, 5); - const newVal = Math.floor(value * 2 ** -32); + const newVal = MathFloor(value * 2 ** -32); buf[offset++] = value; value = value >>> 8; buf[offset++] = value; @@ -669,7 +671,7 @@ function writeU_Int40LE(buf, value, offset, min, max) { buf[offset++] = value; value = value >>> 8; buf[offset++] = value; - buf[offset++] = Math.floor(newVal * 2 ** -32); + buf[offset++] = MathFloor(newVal * 2 ** -32); return offset; } @@ -755,7 +757,7 @@ function writeU_Int48BE(buf, value, offset, min, max) { value = +value; checkInt(value, min, max, buf, offset, 5); - const newVal = Math.floor(value * 2 ** -32); + const newVal = MathFloor(value * 2 ** -32); buf[offset++] = (newVal >>> 8); buf[offset++] = newVal; buf[offset + 3] = value; @@ -772,7 +774,7 @@ function writeU_Int40BE(buf, value, offset, min, max) { value = +value; checkInt(value, min, max, buf, offset, 4); - buf[offset++] = Math.floor(value * 2 ** -32); + buf[offset++] = MathFloor(value * 2 ** -32); buf[offset + 3] = value; value = value >>> 8; buf[offset + 2] = value; diff --git a/lib/internal/child_process.js b/lib/internal/child_process.js index 2d4aff982b..05966f9e40 100644 --- a/lib/internal/child_process.js +++ b/lib/internal/child_process.js @@ -1,6 +1,9 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperty, + ObjectSetPrototypeOf, +} = primordials; const { errnoException, @@ -281,8 +284,8 @@ function ChildProcess() { maybeClose(this); }; } -Object.setPrototypeOf(ChildProcess.prototype, EventEmitter.prototype); -Object.setPrototypeOf(ChildProcess, EventEmitter); +ObjectSetPrototypeOf(ChildProcess.prototype, EventEmitter.prototype); +ObjectSetPrototypeOf(ChildProcess, EventEmitter); function flushStdio(subprocess) { @@ -528,7 +531,7 @@ let serialization; function setupChannel(target, channel, serializationMode) { target.channel = channel; - Object.defineProperty(target, '_channel', { + ObjectDefineProperty(target, '_channel', { get: deprecate(() => { return target.channel; }, channelDeprecationMsg, 'DEP0129'), diff --git a/lib/internal/child_process/serialization.js b/lib/internal/child_process/serialization.js index 1381f29926..48b6d7ffe0 100644 --- a/lib/internal/child_process/serialization.js +++ b/lib/internal/child_process/serialization.js @@ -1,6 +1,9 @@ 'use strict'; -const { JSON } = primordials; +const { + JSONParse, + JSONStringify, +} = primordials; const { Buffer } = require('buffer'); const { StringDecoder } = require('string_decoder'); const v8 = require('v8'); @@ -104,14 +107,14 @@ const json = { } else { chunks[0] = channel[kJSONBuffer] + chunks[0]; for (let i = 0; i < numCompleteChunks; i++) - yield JSON.parse(chunks[i]); + yield JSONParse(chunks[i]); channel[kJSONBuffer] = incompleteChunk; } channel.buffering = channel[kJSONBuffer].length !== 0; }, writeChannelMessage(channel, req, message, handle) { - const string = JSON.stringify(message) + '\n'; + const string = JSONStringify(message) + '\n'; return channel.writeUtf8String(req, string, handle); }, }; diff --git a/lib/internal/cli_table.js b/lib/internal/cli_table.js index ca8b206fd7..f0f09b4f8f 100644 --- a/lib/internal/cli_table.js +++ b/lib/internal/cli_table.js @@ -1,6 +1,10 @@ 'use strict'; -const { Math, ObjectPrototype } = primordials; +const { + MathCeil, + MathMax, + ObjectPrototypeHasOwnProperty, +} = primordials; const { getStringWidth } = require('internal/readline/utils'); @@ -36,7 +40,7 @@ const renderRow = (row, columnWidths) => { const needed = (columnWidths[i] - len) / 2; // round(needed) + ceil(needed) will always add up to the amount // of spaces we need while also left justifying the output. - out += `${' '.repeat(needed)}${cell}${' '.repeat(Math.ceil(needed))}`; + out += `${' '.repeat(needed)}${cell}${' '.repeat(MathCeil(needed))}`; if (i !== row.length - 1) out += tableChars.middle; } @@ -47,7 +51,7 @@ const renderRow = (row, columnWidths) => { const table = (head, columns) => { const rows = []; const columnWidths = head.map((h) => getStringWidth(h)); - const longestColumn = columns.reduce((n, a) => Math.max(n, a.length), 0); + const longestColumn = columns.reduce((n, a) => MathMax(n, a.length), 0); for (let i = 0; i < head.length; i++) { const column = columns[i]; @@ -55,10 +59,10 @@ const table = (head, columns) => { if (rows[j] === undefined) rows[j] = []; const value = rows[j][i] = - ObjectPrototype.hasOwnProperty(column, j) ? column[j] : ''; + ObjectPrototypeHasOwnProperty(column, j) ? column[j] : ''; const width = columnWidths[i] || 0; const counted = getStringWidth(value); - columnWidths[i] = Math.max(width, counted); + columnWidths[i] = MathMax(width, counted); } } diff --git a/lib/internal/cluster/child.js b/lib/internal/cluster/child.js index 097c6dafae..9f63b1a1da 100644 --- a/lib/internal/cluster/child.js +++ b/lib/internal/cluster/child.js @@ -1,6 +1,8 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectAssign, +} = primordials; const assert = require('internal/assert'); const path = require('path'); @@ -154,7 +156,7 @@ function rr(message, indexesKey, cb) { function getsockname(out) { if (key) - Object.assign(out, message.sockname); + ObjectAssign(out, message.sockname); return 0; } diff --git a/lib/internal/cluster/master.js b/lib/internal/cluster/master.js index 645d8f1bd8..bee224a67d 100644 --- a/lib/internal/cluster/master.js +++ b/lib/internal/cluster/master.js @@ -1,6 +1,9 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectKeys, + ObjectValues, +} = primordials; const assert = require('internal/assert'); const { fork } = require('child_process'); @@ -82,7 +85,7 @@ cluster.setupMaster = function(options) { if (message.cmd !== 'NODE_DEBUG_ENABLED') return; - for (const worker of Object.values(cluster.workers)) { + for (const worker of ObjectValues(cluster.workers)) { if (worker.state === 'online' || worker.state === 'listening') { process._debugProcess(worker.process.pid); } else { @@ -144,7 +147,7 @@ function removeWorker(worker) { assert(worker); delete cluster.workers[worker.id]; - if (Object.keys(cluster.workers).length === 0) { + if (ObjectKeys(cluster.workers).length === 0) { assert(handles.size === 0, 'Resource leak detected.'); intercom.emit('disconnect'); } @@ -222,12 +225,12 @@ function emitForkNT(worker) { } cluster.disconnect = function(cb) { - const workers = Object.keys(cluster.workers); + const workers = ObjectKeys(cluster.workers); if (workers.length === 0) { process.nextTick(() => intercom.emit('disconnect')); } else { - for (const worker of Object.values(cluster.workers)) { + for (const worker of ObjectValues(cluster.workers)) { if (worker.isConnected()) { worker.disconnect(); } diff --git a/lib/internal/cluster/worker.js b/lib/internal/cluster/worker.js index 4563b2e663..516b7a3b73 100644 --- a/lib/internal/cluster/worker.js +++ b/lib/internal/cluster/worker.js @@ -1,9 +1,7 @@ 'use strict'; const { - Object: { - setPrototypeOf: ObjectSetPrototypeOf - } + ObjectSetPrototypeOf, } = primordials; const EventEmitter = require('events'); diff --git a/lib/internal/console/constructor.js b/lib/internal/console/constructor.js index c3339241aa..43ae0eee41 100644 --- a/lib/internal/console/constructor.js +++ b/lib/internal/console/constructor.js @@ -3,7 +3,15 @@ // The Console constructor is not actually used to construct the global // console. It's exported for backwards compatibility. -const { Object, ObjectPrototype, Reflect, Math } = primordials; +const { + MathFloor, + ObjectDefineProperties, + ObjectDefineProperty, + ObjectKeys, + ObjectPrototypeHasOwnProperty, + ObjectValues, + ReflectOwnKeys, +} = primordials; const { trace } = internalBinding('trace_events'); const { @@ -106,7 +114,7 @@ function Console(options /* or: stdout, stderr, ignoreErrors = true */) { } // Bind the prototype functions to this Console instance - const keys = Object.keys(Console.prototype); + const keys = ObjectKeys(Console.prototype); for (var v = 0; v < keys.length; v++) { var k = keys[v]; // We have to bind the methods grabbed from the instance instead of from @@ -126,7 +134,7 @@ const consolePropAttributes = { }; // Fixup global.console instanceof global.console.Console -Object.defineProperty(Console, Symbol.hasInstance, { +ObjectDefineProperty(Console, Symbol.hasInstance, { value(instance) { return instance[kIsConsole]; } @@ -134,7 +142,7 @@ Object.defineProperty(Console, Symbol.hasInstance, { // Eager version for the Console constructor Console.prototype[kBindStreamsEager] = function(stdout, stderr) { - Object.defineProperties(this, { + ObjectDefineProperties(this, { '_stdout': { ...consolePropAttributes, value: stdout }, '_stderr': { ...consolePropAttributes, value: stderr } }); @@ -145,7 +153,7 @@ Console.prototype[kBindStreamsEager] = function(stdout, stderr) { Console.prototype[kBindStreamsLazy] = function(object) { let stdout; let stderr; - Object.defineProperties(this, { + ObjectDefineProperties(this, { '_stdout': { enumerable: false, configurable: true, @@ -168,7 +176,7 @@ Console.prototype[kBindStreamsLazy] = function(object) { }; Console.prototype[kBindProperties] = function(ignoreErrors, colorMode) { - Object.defineProperties(this, { + ObjectDefineProperties(this, { '_stdoutErrorHandler': { ...consolePropAttributes, value: createWriteErrorHandler(this, kUseStdout) @@ -412,7 +420,7 @@ const consoleMethods = { const depth = v !== null && typeof v === 'object' && !isArray(v) && - Object.keys(v).length > 2 ? -1 : 0; + ObjectKeys(v).length > 2 ? -1 : 0; const opt = { depth, maxArrayLength: 3, @@ -477,7 +485,7 @@ const consoleMethods = { const map = {}; let hasPrimitives = false; const valuesKeyArray = []; - const indexKeyArray = Object.keys(tabularData); + const indexKeyArray = ObjectKeys(tabularData); for (; i < indexKeyArray.length; i++) { const item = tabularData[indexKeyArray[i]]; @@ -487,12 +495,12 @@ const consoleMethods = { hasPrimitives = true; valuesKeyArray[i] = _inspect(item); } else { - const keys = properties || Object.keys(item); + const keys = properties || ObjectKeys(item); for (const key of keys) { if (map[key] === undefined) map[key] = []; if ((primitive && properties) || - !ObjectPrototype.hasOwnProperty(item, key)) + !ObjectPrototypeHasOwnProperty(item, key)) map[key][i] = ''; else map[key][i] = _inspect(item[key]); @@ -500,8 +508,8 @@ const consoleMethods = { } } - const keys = Object.keys(map); - const values = Object.values(map); + const keys = ObjectKeys(map); + const values = ObjectValues(map); if (hasPrimitives) { keys.push(valuesKey); values.push(valuesKeyArray); @@ -545,10 +553,10 @@ function formatTime(ms) { if (ms >= kSecond) { if (ms >= kMinute) { if (ms >= kHour) { - hours = Math.floor(ms / kHour); + hours = MathFloor(ms / kHour); ms = ms % kHour; } - minutes = Math.floor(ms / kMinute); + minutes = MathFloor(ms / kMinute); ms = ms % kMinute; } seconds = ms / kSecond; @@ -576,7 +584,7 @@ const isArray = (v) => ArrayIsArray(v) || isTypedArray(v) || isBuffer(v); function noop() {} -for (const method of Reflect.ownKeys(consoleMethods)) +for (const method of ReflectOwnKeys(consoleMethods)) Console.prototype[method] = consoleMethods[method]; Console.prototype.debug = Console.prototype.log; diff --git a/lib/internal/console/global.js b/lib/internal/console/global.js index bad7478f1e..6a1dc3806f 100644 --- a/lib/internal/console/global.js +++ b/lib/internal/console/global.js @@ -12,7 +12,12 @@ // Therefore, the console.Console.prototype is not // in the global console prototype chain anymore. -const { Object, Reflect } = primordials; +const { + ObjectCreate, + ReflectDefineProperty, + ReflectGetOwnPropertyDescriptor, + ReflectOwnKeys, +} = primordials; const { Console, @@ -20,20 +25,20 @@ const { kBindProperties } = require('internal/console/constructor'); -const globalConsole = Object.create({}); +const globalConsole = ObjectCreate({}); // Since Console is not on the prototype chain of the global console, // the symbol properties on Console.prototype have to be looked up from // the global console itself. In addition, we need to make the global // console a namespace by binding the console methods directly onto // the global console with the receiver fixed. -for (const prop of Reflect.ownKeys(Console.prototype)) { +for (const prop of ReflectOwnKeys(Console.prototype)) { if (prop === 'constructor') { continue; } - const desc = Reflect.getOwnPropertyDescriptor(Console.prototype, prop); + const desc = ReflectGetOwnPropertyDescriptor(Console.prototype, prop); if (typeof desc.value === 'function') { // fix the receiver desc.value = desc.value.bind(globalConsole); } - Reflect.defineProperty(globalConsole, prop, desc); + ReflectDefineProperty(globalConsole, prop, desc); } globalConsole[kBindStreamsLazy](process); diff --git a/lib/internal/crypto/cipher.js b/lib/internal/crypto/cipher.js index 133b1e5153..add56eae68 100644 --- a/lib/internal/crypto/cipher.js +++ b/lib/internal/crypto/cipher.js @@ -1,6 +1,8 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectSetPrototypeOf, +} = primordials; const { RSA_PKCS1_OAEP_PADDING, @@ -126,8 +128,8 @@ function Cipher(cipher, password, options) { createCipher.call(this, cipher, password, options, true); } -Object.setPrototypeOf(Cipher.prototype, LazyTransform.prototype); -Object.setPrototypeOf(Cipher, LazyTransform); +ObjectSetPrototypeOf(Cipher.prototype, LazyTransform.prototype); +ObjectSetPrototypeOf(Cipher, LazyTransform); Cipher.prototype._transform = function _transform(chunk, encoding, callback) { this.push(this[kHandle].update(chunk, encoding)); @@ -239,8 +241,8 @@ function addCipherPrototypeFunctions(constructor) { constructor.prototype.setAAD = Cipher.prototype.setAAD; } -Object.setPrototypeOf(Cipheriv.prototype, LazyTransform.prototype); -Object.setPrototypeOf(Cipheriv, LazyTransform); +ObjectSetPrototypeOf(Cipheriv.prototype, LazyTransform.prototype); +ObjectSetPrototypeOf(Cipheriv, LazyTransform); addCipherPrototypeFunctions(Cipheriv); function Decipher(cipher, password, options) { @@ -250,8 +252,8 @@ function Decipher(cipher, password, options) { createCipher.call(this, cipher, password, options, false); } -Object.setPrototypeOf(Decipher.prototype, LazyTransform.prototype); -Object.setPrototypeOf(Decipher, LazyTransform); +ObjectSetPrototypeOf(Decipher.prototype, LazyTransform.prototype); +ObjectSetPrototypeOf(Decipher, LazyTransform); addCipherPrototypeFunctions(Decipher); @@ -262,8 +264,8 @@ function Decipheriv(cipher, key, iv, options) { createCipherWithIV.call(this, cipher, key, options, false, iv); } -Object.setPrototypeOf(Decipheriv.prototype, LazyTransform.prototype); -Object.setPrototypeOf(Decipheriv, LazyTransform); +ObjectSetPrototypeOf(Decipheriv.prototype, LazyTransform.prototype); +ObjectSetPrototypeOf(Decipheriv, LazyTransform); addCipherPrototypeFunctions(Decipheriv); module.exports = { diff --git a/lib/internal/crypto/diffiehellman.js b/lib/internal/crypto/diffiehellman.js index 7e0fde38bc..da8f87bf16 100644 --- a/lib/internal/crypto/diffiehellman.js +++ b/lib/internal/crypto/diffiehellman.js @@ -1,6 +1,8 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperty, +} = primordials; const { Buffer } = require('buffer'); const { @@ -63,7 +65,7 @@ function DiffieHellman(sizeOrKey, keyEncoding, generator, genEncoding) { generator = toBuf(generator, genEncoding); this[kHandle] = new _DiffieHellman(sizeOrKey, generator); - Object.defineProperty(this, 'verifyError', { + ObjectDefineProperty(this, 'verifyError', { enumerable: true, value: this[kHandle].verifyError, writable: false @@ -75,7 +77,7 @@ function DiffieHellmanGroup(name) { if (!(this instanceof DiffieHellmanGroup)) return new DiffieHellmanGroup(name); this[kHandle] = new _DiffieHellmanGroup(name); - Object.defineProperty(this, 'verifyError', { + ObjectDefineProperty(this, 'verifyError', { enumerable: true, value: this[kHandle].verifyError, writable: false diff --git a/lib/internal/crypto/hash.js b/lib/internal/crypto/hash.js index b28f9fca13..56784275f9 100644 --- a/lib/internal/crypto/hash.js +++ b/lib/internal/crypto/hash.js @@ -1,6 +1,8 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectSetPrototypeOf, +} = primordials; const { Hash: _Hash, @@ -47,8 +49,8 @@ function Hash(algorithm, options) { LazyTransform.call(this, options); } -Object.setPrototypeOf(Hash.prototype, LazyTransform.prototype); -Object.setPrototypeOf(Hash, LazyTransform); +ObjectSetPrototypeOf(Hash.prototype, LazyTransform.prototype); +ObjectSetPrototypeOf(Hash, LazyTransform); Hash.prototype.copy = function copy(options) { const state = this[kState]; @@ -118,8 +120,8 @@ function Hmac(hmac, key, options) { LazyTransform.call(this, options); } -Object.setPrototypeOf(Hmac.prototype, LazyTransform.prototype); -Object.setPrototypeOf(Hmac, LazyTransform); +ObjectSetPrototypeOf(Hmac.prototype, LazyTransform.prototype); +ObjectSetPrototypeOf(Hmac, LazyTransform); Hmac.prototype.update = Hash.prototype.update; diff --git a/lib/internal/crypto/keygen.js b/lib/internal/crypto/keygen.js index 0a4bde77fa..88d2822fa6 100644 --- a/lib/internal/crypto/keygen.js +++ b/lib/internal/crypto/keygen.js @@ -1,6 +1,8 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperty, +} = primordials; const { AsyncWrap, Providers } = internalBinding('async_wrap'); const { @@ -63,7 +65,7 @@ function generateKeyPair(type, options, callback) { handleError(impl(wrap)); } -Object.defineProperty(generateKeyPair, customPromisifyArgs, { +ObjectDefineProperty(generateKeyPair, customPromisifyArgs, { value: ['publicKey', 'privateKey'], enumerable: false }); diff --git a/lib/internal/crypto/keys.js b/lib/internal/crypto/keys.js index 250147d752..25ef888495 100644 --- a/lib/internal/crypto/keys.js +++ b/lib/internal/crypto/keys.js @@ -1,6 +1,8 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperty, +} = primordials; const { KeyObject: KeyObjectHandle, @@ -48,7 +50,7 @@ class KeyObject { this[kKeyType] = type; - Object.defineProperty(this, kHandle, { + ObjectDefineProperty(this, kHandle, { value: handle, enumerable: false, configurable: false, diff --git a/lib/internal/crypto/random.js b/lib/internal/crypto/random.js index f42458aa78..425b65e268 100644 --- a/lib/internal/crypto/random.js +++ b/lib/internal/crypto/random.js @@ -1,6 +1,8 @@ 'use strict'; -const { Math } = primordials; +const { + MathMin, +} = primordials; const { AsyncWrap, Providers } = internalBinding('async_wrap'); const { Buffer, kMaxLength } = require('buffer'); @@ -14,13 +16,13 @@ const { validateNumber } = require('internal/validators'); const { isArrayBufferView } = require('internal/util/types'); const kMaxUint32 = 2 ** 32 - 1; -const kMaxPossibleLength = Math.min(kMaxLength, kMaxUint32); +const kMaxPossibleLength = MathMin(kMaxLength, kMaxUint32); function assertOffset(offset, elementSize, length) { validateNumber(offset, 'offset'); offset *= elementSize; - const maxLength = Math.min(length, kMaxPossibleLength); + const maxLength = MathMin(length, kMaxPossibleLength); if (Number.isNaN(offset) || offset > maxLength || offset < 0) { throw new ERR_OUT_OF_RANGE('offset', `>= 0 && <= ${maxLength}`, offset); } diff --git a/lib/internal/crypto/sig.js b/lib/internal/crypto/sig.js index 6eda845564..27930ce1ac 100644 --- a/lib/internal/crypto/sig.js +++ b/lib/internal/crypto/sig.js @@ -1,6 +1,8 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectSetPrototypeOf, +} = primordials; const { ERR_CRYPTO_SIGN_KEY_REQUIRED, @@ -38,8 +40,8 @@ function Sign(algorithm, options) { Writable.call(this, options); } -Object.setPrototypeOf(Sign.prototype, Writable.prototype); -Object.setPrototypeOf(Sign, Writable); +ObjectSetPrototypeOf(Sign.prototype, Writable.prototype); +ObjectSetPrototypeOf(Sign, Writable); Sign.prototype._write = function _write(chunk, encoding, callback) { this.update(chunk, encoding); @@ -153,8 +155,8 @@ function Verify(algorithm, options) { Writable.call(this, options); } -Object.setPrototypeOf(Verify.prototype, Writable.prototype); -Object.setPrototypeOf(Verify, Writable); +ObjectSetPrototypeOf(Verify.prototype, Writable.prototype); +ObjectSetPrototypeOf(Verify, Writable); Verify.prototype._write = Sign.prototype._write; Verify.prototype.update = Sign.prototype.update; diff --git a/lib/internal/dns/promises.js b/lib/internal/dns/promises.js index 306d5eee47..c4bbc21ae5 100644 --- a/lib/internal/dns/promises.js +++ b/lib/internal/dns/promises.js @@ -1,6 +1,9 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectCreate, + ObjectDefineProperty, +} = primordials; const { bindDefaultResolver, @@ -203,12 +206,12 @@ function resolver(bindingName) { return createResolverPromise(this, bindingName, name, ttl); } - Object.defineProperty(query, 'name', { value: bindingName }); + ObjectDefineProperty(query, 'name', { value: bindingName }); return query; } -const resolveMap = Object.create(null); +const resolveMap = ObjectCreate(null); // Resolver instances correspond 1:1 to c-ares channels. class Resolver { diff --git a/lib/internal/encoding.js b/lib/internal/encoding.js index 16de0c986e..d1b4cbfe9b 100644 --- a/lib/internal/encoding.js +++ b/lib/internal/encoding.js @@ -3,7 +3,11 @@ // An implementation of the WHATWG Encoding Standard // https://encoding.spec.whatwg.org -const { Object } = primordials; +const { + ObjectCreate, + ObjectDefineProperties, + ObjectGetOwnPropertyDescriptors, +} = primordials; const { ERR_ENCODING_INVALID_ENCODED_DATA, @@ -339,7 +343,7 @@ class TextEncoder { if (typeof depth === 'number' && depth < 0) return this; const ctor = getConstructorOf(this); - const obj = Object.create({ + const obj = ObjectCreate({ constructor: ctor === null ? TextEncoder : ctor }); obj.encoding = this.encoding; @@ -348,7 +352,7 @@ class TextEncoder { } } -Object.defineProperties( +ObjectDefineProperties( TextEncoder.prototype, { 'encode': { enumerable: true }, 'encodeInto': { enumerable: true }, @@ -508,9 +512,9 @@ function makeTextDecoderJS() { // Mix in some shared properties. { - Object.defineProperties( + ObjectDefineProperties( TextDecoder.prototype, - Object.getOwnPropertyDescriptors({ + ObjectGetOwnPropertyDescriptors({ get encoding() { validateDecoder(this); return this[kEncoding]; @@ -532,7 +536,7 @@ function makeTextDecoderJS() { if (typeof depth === 'number' && depth < 0) return this; const ctor = getConstructorOf(this); - const obj = Object.create({ + const obj = ObjectCreate({ constructor: ctor === null ? TextDecoder : ctor }); obj.encoding = this.encoding; @@ -546,7 +550,7 @@ function makeTextDecoderJS() { return require('internal/util/inspect').inspect(obj, opts); } })); - Object.defineProperties(TextDecoder.prototype, { + ObjectDefineProperties(TextDecoder.prototype, { decode: { enumerable: true }, [inspect]: { enumerable: false }, [Symbol.toStringTag]: { diff --git a/lib/internal/error-serdes.js b/lib/internal/error-serdes.js index 8647e3b78d..744098af53 100644 --- a/lib/internal/error-serdes.js +++ b/lib/internal/error-serdes.js @@ -2,10 +2,16 @@ const Buffer = require('buffer').Buffer; const { - ArrayPrototype, - FunctionPrototype, - Object, - ObjectPrototype, + ArrayPrototypeForEach, + FunctionPrototypeCall, + ObjectAssign, + ObjectCreate, + ObjectDefineProperty, + ObjectGetOwnPropertyDescriptor, + ObjectGetOwnPropertyNames, + ObjectGetPrototypeOf, + ObjectKeys, + ObjectPrototypeToString, SafeSet, } = primordials; @@ -16,24 +22,24 @@ const kInspectedError = 2; const errors = { Error, TypeError, RangeError, URIError, SyntaxError, ReferenceError, EvalError }; -const errorConstructorNames = new SafeSet(Object.keys(errors)); +const errorConstructorNames = new SafeSet(ObjectKeys(errors)); function TryGetAllProperties(object, target = object) { - const all = Object.create(null); + const all = ObjectCreate(null); if (object === null) return all; - Object.assign(all, - TryGetAllProperties(Object.getPrototypeOf(object), target)); - const keys = Object.getOwnPropertyNames(object); - ArrayPrototype.forEach(keys, (key) => { + ObjectAssign(all, + TryGetAllProperties(ObjectGetPrototypeOf(object), target)); + const keys = ObjectGetOwnPropertyNames(object); + ArrayPrototypeForEach(keys, (key) => { let descriptor; try { - descriptor = Object.getOwnPropertyDescriptor(object, key); + descriptor = ObjectGetOwnPropertyDescriptor(object, key); } catch { return; } const getter = descriptor.get; if (getter && key !== '__proto__') { try { - descriptor.value = FunctionPrototype.call(getter, target); + descriptor.value = FunctionPrototypeCall(getter, target); } catch {} } if ('value' in descriptor && typeof descriptor.value !== 'function') { @@ -50,10 +56,10 @@ function GetConstructors(object) { for (var current = object; current !== null; - current = Object.getPrototypeOf(current)) { - const desc = Object.getOwnPropertyDescriptor(current, 'constructor'); + current = ObjectGetPrototypeOf(current)) { + const desc = ObjectGetOwnPropertyDescriptor(current, 'constructor'); if (desc && desc.value) { - Object.defineProperty(constructors, constructors.length, { + ObjectDefineProperty(constructors, constructors.length, { value: desc.value, enumerable: true }); } @@ -63,7 +69,7 @@ function GetConstructors(object) { } function GetName(object) { - const desc = Object.getOwnPropertyDescriptor(object, 'name'); + const desc = ObjectGetOwnPropertyDescriptor(object, 'name'); return desc && desc.value; } @@ -80,7 +86,7 @@ function serializeError(error) { if (!serialize) serialize = require('v8').serialize; try { if (typeof error === 'object' && - ObjectPrototype.toString(error) === '[object Error]') { + ObjectPrototypeToString(error) === '[object Error]') { const constructors = GetConstructors(error); for (var i = 0; i < constructors.length; i++) { const name = GetName(constructors[i]); @@ -109,7 +115,7 @@ function deserializeError(error) { case kSerializedError: const { constructor, properties } = deserialize(error.subarray(1)); const ctor = errors[constructor]; - return Object.create(ctor.prototype, properties); + return ObjectCreate(ctor.prototype, properties); case kSerializedObject: return deserialize(error.subarray(1)); case kInspectedError: diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 6d4a582631..a5155d936b 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -10,7 +10,11 @@ // value statically and permanently identifies the error. While the error // message may change, the code should not. -const { Object, Math } = primordials; +const { + MathAbs, + ObjectDefineProperty, + ObjectKeys, +} = primordials; const messages = new Map(); const codes = {}; @@ -113,7 +117,7 @@ class SystemError extends Error { if (context.dest !== undefined) message += ` => ${context.dest}`; - Object.defineProperty(this, 'message', { + ObjectDefineProperty(this, 'message', { value: message, enumerable: false, writable: true, @@ -123,14 +127,14 @@ class SystemError extends Error { this.code = key; - Object.defineProperty(this, 'info', { + ObjectDefineProperty(this, 'info', { value: context, enumerable: true, configurable: true, writable: false }); - Object.defineProperty(this, 'errno', { + ObjectDefineProperty(this, 'errno', { get() { return context.errno; }, @@ -141,7 +145,7 @@ class SystemError extends Error { configurable: true }); - Object.defineProperty(this, 'syscall', { + ObjectDefineProperty(this, 'syscall', { get() { return context.syscall; }, @@ -158,7 +162,7 @@ class SystemError extends Error { // always be of type string. We should probably just remove the // `.toString()` and `Buffer.from()` operations and set the value on the // context as the user did. - Object.defineProperty(this, 'path', { + ObjectDefineProperty(this, 'path', { get() { return context.path != null ? context.path.toString() : context.path; @@ -173,7 +177,7 @@ class SystemError extends Error { } if (context.dest !== undefined) { - Object.defineProperty(this, 'dest', { + ObjectDefineProperty(this, 'dest', { get() { return context.dest != null ? context.dest.toString() : context.dest; @@ -222,7 +226,7 @@ function makeNodeErrorWithCode(Base, key) { Error.stackTraceLimit = limit; } const message = getMessage(key, args, this); - Object.defineProperty(this, 'message', { + ObjectDefineProperty(this, 'message', { value: message, enumerable: false, writable: true, @@ -270,7 +274,7 @@ function addCodeToName(err, name, code) { err.stack; // Reset the name to the actual name. if (name === 'SystemError') { - Object.defineProperty(err, 'name', { + ObjectDefineProperty(err, 'name', { value: name, enumerable: false, writable: true, @@ -383,7 +387,7 @@ function uvException(ctx) { const err = new Error(message); Error.stackTraceLimit = tmpLimit; - for (const prop of Object.keys(ctx)) { + for (const prop of ObjectKeys(ctx)) { if (prop === 'message' || prop === 'path' || prop === 'dest') { continue; } @@ -1103,7 +1107,7 @@ E('ERR_OUT_OF_RANGE', let msg = replaceDefaultBoolean ? str : `The value of "${str}" is out of range.`; let received; - if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) { + if (Number.isInteger(input) && MathAbs(input) > 2 ** 32) { received = addNumericalSeparator(String(input)); } else if (typeof input === 'bigint') { received = String(input); diff --git a/lib/internal/freelist.js b/lib/internal/freelist.js index 16437b2b8a..3e93e04f8d 100644 --- a/lib/internal/freelist.js +++ b/lib/internal/freelist.js @@ -1,6 +1,8 @@ 'use strict'; -const { Reflect } = primordials; +const { + ReflectApply, +} = primordials; class FreeList { constructor(name, max, ctor) { @@ -17,7 +19,7 @@ class FreeList { alloc() { return this.list.length > 0 ? this.list.pop() : - Reflect.apply(this.ctor, this, arguments); + ReflectApply(this.ctor, this, arguments); } free(obj) { diff --git a/lib/internal/fs/dir.js b/lib/internal/fs/dir.js index 90ab31fe5a..c4e0a3746c 100644 --- a/lib/internal/fs/dir.js +++ b/lib/internal/fs/dir.js @@ -1,6 +1,8 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperty, +} = primordials; const pathModule = require('path'); const binding = internalBinding('fs'); @@ -172,7 +174,7 @@ class Dir { } } -Object.defineProperty(Dir.prototype, Symbol.asyncIterator, { +ObjectDefineProperty(Dir.prototype, Symbol.asyncIterator, { value: Dir.prototype.entries, enumerable: false, writable: true, diff --git a/lib/internal/fs/promises.js b/lib/internal/fs/promises.js index 31613780a7..a4ac18ba45 100644 --- a/lib/internal/fs/promises.js +++ b/lib/internal/fs/promises.js @@ -1,6 +1,9 @@ 'use strict'; -const { Math } = primordials; +const { + MathMax, + MathMin, +} = primordials; const { F_OK, @@ -134,7 +137,7 @@ async function writeFileHandle(filehandle, data, options) { do { const { bytesWritten } = await write(filehandle, buffer, 0, - Math.min(16384, buffer.length)); + MathMin(16384, buffer.length)); remaining -= bytesWritten; buffer = buffer.slice(bytesWritten); } while (remaining > 0); @@ -160,7 +163,7 @@ async function readFileHandle(filehandle, options) { const chunks = []; const chunkSize = size === 0 ? kReadFileMaxChunkSize : - Math.min(size, kReadFileMaxChunkSize); + MathMin(size, kReadFileMaxChunkSize); let endOfFile = false; do { const buf = Buffer.alloc(chunkSize); @@ -299,7 +302,7 @@ async function truncate(path, len = 0) { async function ftruncate(handle, len = 0) { validateFileHandle(handle); validateInteger(len, 'len'); - len = Math.max(0, len); + len = MathMax(0, len); return binding.ftruncate(handle.fd, len, kUsePromises); } diff --git a/lib/internal/fs/read_file_context.js b/lib/internal/fs/read_file_context.js index e1de8fc7cd..d7b0e36800 100644 --- a/lib/internal/fs/read_file_context.js +++ b/lib/internal/fs/read_file_context.js @@ -1,6 +1,8 @@ 'use strict'; -const { Math } = primordials; +const { + MathMin, +} = primordials; const { Buffer } = require('buffer'); @@ -87,7 +89,7 @@ class ReadFileContext { } else { buffer = this.buffer; offset = this.pos; - length = Math.min(kReadFileBufferLength, this.size - this.pos); + length = MathMin(kReadFileBufferLength, this.size - this.pos); } const req = new FSReqCallback(); diff --git a/lib/internal/fs/streams.js b/lib/internal/fs/streams.js index 0eb90cfd6d..c8447191b5 100644 --- a/lib/internal/fs/streams.js +++ b/lib/internal/fs/streams.js @@ -1,6 +1,10 @@ 'use strict'; -const { Math, Object } = primordials; +const { + MathMin, + ObjectDefineProperty, + ObjectSetPrototypeOf, +} = primordials; const { ERR_OUT_OF_RANGE @@ -109,8 +113,8 @@ function ReadStream(path, options) { } }); } -Object.setPrototypeOf(ReadStream.prototype, Readable.prototype); -Object.setPrototypeOf(ReadStream, Readable); +ObjectSetPrototypeOf(ReadStream.prototype, Readable.prototype); +ObjectSetPrototypeOf(ReadStream, Readable); const openReadFs = internalUtil.deprecate(function() { _openReadFs(this); @@ -157,13 +161,13 @@ ReadStream.prototype._read = function(n) { // in the thread pool another read() finishes up the pool, and // allocates a new one. const thisPool = pool; - let toRead = Math.min(pool.length - pool.used, n); + let toRead = MathMin(pool.length - pool.used, n); const start = pool.used; if (this.pos !== undefined) - toRead = Math.min(this.end - this.pos + 1, toRead); + toRead = MathMin(this.end - this.pos + 1, toRead); else - toRead = Math.min(this.end - this.bytesRead + 1, toRead); + toRead = MathMin(this.end - this.bytesRead + 1, toRead); // Already read everything we were supposed to read! // treat as EOF. @@ -235,7 +239,7 @@ ReadStream.prototype.close = function(cb) { this.destroy(null, cb); }; -Object.defineProperty(ReadStream.prototype, 'pending', { +ObjectDefineProperty(ReadStream.prototype, 'pending', { get() { return this.fd === null; }, configurable: true }); @@ -280,8 +284,8 @@ function WriteStream(path, options) { if (typeof this.fd !== 'number') _openWriteFs(this); } -Object.setPrototypeOf(WriteStream.prototype, Writable.prototype); -Object.setPrototypeOf(WriteStream, Writable); +ObjectSetPrototypeOf(WriteStream.prototype, Writable.prototype); +ObjectSetPrototypeOf(WriteStream, Writable); WriteStream.prototype._final = function(callback) { if (typeof this.fd !== 'number') { @@ -406,7 +410,7 @@ WriteStream.prototype.close = function(cb) { // There is no shutdown() for files. WriteStream.prototype.destroySoon = WriteStream.prototype.end; -Object.defineProperty(WriteStream.prototype, 'pending', { +ObjectDefineProperty(WriteStream.prototype, 'pending', { get() { return this.fd === null; }, configurable: true }); diff --git a/lib/internal/fs/sync_write_stream.js b/lib/internal/fs/sync_write_stream.js index 522bfc829d..7d1209ba2d 100644 --- a/lib/internal/fs/sync_write_stream.js +++ b/lib/internal/fs/sync_write_stream.js @@ -1,6 +1,8 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectSetPrototypeOf, +} = primordials; const { Writable } = require('stream'); const { closeSync, writeSync } = require('fs'); @@ -15,8 +17,8 @@ function SyncWriteStream(fd, options) { this.autoClose = options.autoClose === undefined ? true : options.autoClose; } -Object.setPrototypeOf(SyncWriteStream.prototype, Writable.prototype); -Object.setPrototypeOf(SyncWriteStream, Writable); +ObjectSetPrototypeOf(SyncWriteStream.prototype, Writable.prototype); +ObjectSetPrototypeOf(SyncWriteStream, Writable); SyncWriteStream.prototype._write = function(chunk, encoding, cb) { writeSync(this.fd, chunk, 0, chunk.length); diff --git a/lib/internal/fs/utils.js b/lib/internal/fs/utils.js index 3324ec5080..6a4717e664 100644 --- a/lib/internal/fs/utils.js +++ b/lib/internal/fs/utils.js @@ -1,6 +1,9 @@ 'use strict'; -const { Object, Reflect } = primordials; +const { + ObjectSetPrototypeOf, + ReflectOwnKeys, +} = primordials; const { Buffer } = require('buffer'); const { @@ -118,7 +121,7 @@ class DirentFromStats extends Dirent { } } -for (const name of Reflect.ownKeys(Dirent.prototype)) { +for (const name of ReflectOwnKeys(Dirent.prototype)) { if (name === 'constructor') { continue; } @@ -353,8 +356,8 @@ function BigIntStats(dev, mode, nlink, uid, gid, rdev, blksize, this.birthtime = dateFromMs(this.birthtimeMs); } -Object.setPrototypeOf(BigIntStats.prototype, StatsBase.prototype); -Object.setPrototypeOf(BigIntStats, StatsBase); +ObjectSetPrototypeOf(BigIntStats.prototype, StatsBase.prototype); +ObjectSetPrototypeOf(BigIntStats, StatsBase); BigIntStats.prototype._checkModeProperty = function(property) { if (isWindows && (property === S_IFIFO || property === S_IFBLK || @@ -379,8 +382,8 @@ function Stats(dev, mode, nlink, uid, gid, rdev, blksize, this.birthtime = dateFromMs(birthtimeMs); } -Object.setPrototypeOf(Stats.prototype, StatsBase.prototype); -Object.setPrototypeOf(Stats, StatsBase); +ObjectSetPrototypeOf(Stats.prototype, StatsBase.prototype); +ObjectSetPrototypeOf(Stats, StatsBase); // HACK: Workaround for https://github.com/standard-things/esm/issues/821. // TODO(ronag): Remove this as soon as `esm` publishes a fixed version. diff --git a/lib/internal/fs/watchers.js b/lib/internal/fs/watchers.js index 0685bcef4d..c94739d718 100644 --- a/lib/internal/fs/watchers.js +++ b/lib/internal/fs/watchers.js @@ -1,6 +1,9 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperty, + ObjectSetPrototypeOf, +} = primordials; const errors = require('internal/errors'); const { @@ -39,8 +42,8 @@ function StatWatcher(bigint) { this[kOldStatus] = -1; this[kUseBigint] = bigint; } -Object.setPrototypeOf(StatWatcher.prototype, EventEmitter.prototype); -Object.setPrototypeOf(StatWatcher, EventEmitter); +ObjectSetPrototypeOf(StatWatcher.prototype, EventEmitter.prototype); +ObjectSetPrototypeOf(StatWatcher, EventEmitter); function onchange(newStatus, stats) { const self = this[owner_symbol]; @@ -143,8 +146,8 @@ function FSWatcher() { } }; } -Object.setPrototypeOf(FSWatcher.prototype, EventEmitter.prototype); -Object.setPrototypeOf(FSWatcher, EventEmitter); +ObjectSetPrototypeOf(FSWatcher.prototype, EventEmitter.prototype); +ObjectSetPrototypeOf(FSWatcher, EventEmitter); // At the moment if filename is undefined, we // 1. Throw an Error if it's the first time Symbol('kFSWatchStart') is called @@ -210,7 +213,7 @@ function emitCloseNT(self) { // Legacy alias on the C++ wrapper object. This is not public API, so we may // want to runtime-deprecate it at some point. There's no hurry, though. -Object.defineProperty(FSEvent.prototype, 'owner', { +ObjectDefineProperty(FSEvent.prototype, 'owner', { get() { return this[owner_symbol]; }, set(v) { return this[owner_symbol] = v; } }); diff --git a/lib/internal/http2/compat.js b/lib/internal/http2/compat.js index 5bc64504cd..5d9484f204 100644 --- a/lib/internal/http2/compat.js +++ b/lib/internal/http2/compat.js @@ -1,6 +1,12 @@ 'use strict'; -const { Object, ObjectPrototype, Reflect } = primordials; +const { + ObjectAssign, + ObjectCreate, + ObjectKeys, + ObjectPrototypeHasOwnProperty, + ReflectGetPrototypeOf, +} = primordials; const assert = require('internal/assert'); const Stream = require('stream'); @@ -120,7 +126,7 @@ function onStreamData(chunk) { function onStreamTrailers(trailers, flags, rawTrailers) { const request = this[kRequest]; if (request !== undefined) { - Object.assign(request[kTrailers], trailers); + ObjectAssign(request[kTrailers], trailers); request[kRawTrailers].push(...rawTrailers); } } @@ -206,8 +212,8 @@ const proxySocketHandler = { }, getPrototypeOf(stream) { if (stream.session !== undefined) - return Reflect.getPrototypeOf(stream.session[kSocket]); - return Reflect.getPrototypeOf(stream); + return ReflectGetPrototypeOf(stream.session[kSocket]); + return ReflectGetPrototypeOf(stream); }, set(stream, prop, value) { switch (prop) { @@ -434,8 +440,8 @@ class Http2ServerResponse extends Stream { sendDate: true, statusCode: HTTP_STATUS_OK, }; - this[kHeaders] = Object.create(null); - this[kTrailers] = Object.create(null); + this[kHeaders] = ObjectCreate(null); + this[kTrailers] = ObjectCreate(null); this[kStream] = stream; stream[kProxySocket] = null; stream[kResponse] = this; @@ -524,7 +530,7 @@ class Http2ServerResponse extends Stream { } addTrailers(headers) { - const keys = Object.keys(headers); + const keys = ObjectKeys(headers); let key = ''; for (var i = 0; i < keys.length; i++) { key = keys[i]; @@ -539,7 +545,7 @@ class Http2ServerResponse extends Stream { } getHeaderNames() { - return Object.keys(this[kHeaders]); + return ObjectKeys(this[kHeaders]); } getHeaders() { @@ -549,7 +555,7 @@ class Http2ServerResponse extends Stream { hasHeader(name) { validateString(name, 'name'); name = name.trim().toLowerCase(); - return ObjectPrototype.hasOwnProperty(this[kHeaders], name); + return ObjectPrototypeHasOwnProperty(this[kHeaders], name); } removeHeader(name) { @@ -617,7 +623,7 @@ class Http2ServerResponse extends Stream { this[kSetHeader](header[0], header[1]); } } else if (typeof headers === 'object') { - const keys = Object.keys(headers); + const keys = ObjectKeys(headers); let key = ''; for (i = 0; i < keys.length; i++) { key = keys[i]; diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index dfcc9cd5df..94b66d424e 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -2,7 +2,14 @@ /* eslint-disable no-use-before-define */ -const { Math, Object, Reflect } = primordials; +const { + MathMin, + ObjectAssign, + ObjectCreate, + ObjectDefineProperty, + ObjectPrototypeHasOwnProperty, + ReflectGetPrototypeOf, +} = primordials; const { assertCrypto, @@ -124,8 +131,6 @@ const { kTimeout } = require('internal/timers'); const { isArrayBufferView } = require('internal/util/types'); const { format } = require('internal/util/inspect'); -const hasOwnProperty = Object.prototype.hasOwnProperty; - const { FileHandle } = internalBinding('fs'); const binding = internalBinding('http2'); const { @@ -813,7 +818,7 @@ const proxySocketHandler = { const socket = session[kSocket]; if (socket === undefined) throw new ERR_HTTP2_SOCKET_UNBOUND(); - return Reflect.getPrototypeOf(socket); + return ReflectGetPrototypeOf(socket); }, set(session, prop, value) { switch (prop) { @@ -1545,7 +1550,7 @@ class ClientHttp2Session extends Http2Session { assertIsObject(headers, 'headers'); assertIsObject(options, 'options'); - headers = Object.assign(Object.create(null), headers); + headers = ObjectAssign(ObjectCreate(null), headers); options = { ...options }; if (headers[HTTP2_HEADER_METHOD] === undefined) @@ -1992,7 +1997,7 @@ class Http2Stream extends Duplex { throw new ERR_HTTP2_TRAILERS_NOT_READY(); assertIsObject(headers, 'headers'); - headers = Object.assign(Object.create(null), headers); + headers = ObjectAssign(ObjectCreate(null), headers); debugStreamObj(this, 'sending trailers'); @@ -2123,13 +2128,12 @@ class Http2Stream extends Duplex { function processHeaders(oldHeaders) { assertIsObject(oldHeaders, 'headers'); - const headers = Object.create(null); + const headers = ObjectCreate(null); if (oldHeaders !== null && oldHeaders !== undefined) { - const hop = hasOwnProperty.bind(oldHeaders); // This loop is here for performance reason. Do not change. for (const key in oldHeaders) { - if (hop(key)) { + if (ObjectPrototypeHasOwnProperty(oldHeaders, key)) { headers[key] = oldHeaders[key]; } } @@ -2309,8 +2313,8 @@ function doSendFileFD(session, options, fd, headers, streamOptions, err, stat) { if (stat.isFile()) { statOptions.length = statOptions.length < 0 ? stat.size - (+statOptions.offset) : - Math.min(stat.size - (+statOptions.offset), - statOptions.length); + MathMin(stat.size - (+statOptions.offset), + statOptions.length); headers[HTTP2_HEADER_CONTENT_LENGTH] = statOptions.length; } @@ -2387,7 +2391,7 @@ class ServerHttp2Stream extends Http2Stream { options.endStream = !!options.endStream; assertIsObject(headers, 'headers'); - headers = Object.assign(Object.create(null), headers); + headers = ObjectAssign(ObjectCreate(null), headers); if (headers[HTTP2_HEADER_METHOD] === undefined) headers[HTTP2_HEADER_METHOD] = HTTP2_METHOD_GET; @@ -2619,7 +2623,7 @@ class ServerHttp2Stream extends Http2Stream { throw new ERR_HTTP2_HEADERS_AFTER_RESPOND(); assertIsObject(headers, 'headers'); - headers = Object.assign(Object.create(null), headers); + headers = ObjectAssign(ObjectCreate(null), headers); debugStreamObj(this, 'sending additional headers'); @@ -2669,8 +2673,8 @@ const setTimeout = { writable: true, value: setStreamTimeout }; -Object.defineProperty(Http2Stream.prototype, 'setTimeout', setTimeout); -Object.defineProperty(Http2Session.prototype, 'setTimeout', setTimeout); +ObjectDefineProperty(Http2Stream.prototype, 'setTimeout', setTimeout); +ObjectDefineProperty(Http2Session.prototype, 'setTimeout', setTimeout); // When the socket emits an error, destroy the associated Http2Session and @@ -2923,7 +2927,7 @@ function connect(authority, options, listener) { } // Support util.promisify -Object.defineProperty(connect, promisify.custom, { +ObjectDefineProperty(connect, promisify.custom, { value: (authority, options) => { return new Promise((resolve) => { const server = connect(authority, options, () => resolve(server)); diff --git a/lib/internal/http2/util.js b/lib/internal/http2/util.js index a0640b242c..482ae8546a 100644 --- a/lib/internal/http2/util.js +++ b/lib/internal/http2/util.js @@ -1,6 +1,10 @@ 'use strict'; -const { Math, Object } = primordials; +const { + MathMax, + ObjectCreate, + ObjectKeys, +} = primordials; const binding = internalBinding('http2'); const { @@ -236,12 +240,12 @@ function updateOptionsBuffer(options) { if (typeof options.maxOutstandingSettings === 'number') { flags |= (1 << IDX_OPTIONS_MAX_OUTSTANDING_SETTINGS); optionsBuffer[IDX_OPTIONS_MAX_OUTSTANDING_SETTINGS] = - Math.max(1, options.maxOutstandingSettings); + MathMax(1, options.maxOutstandingSettings); } if (typeof options.maxSessionMemory === 'number') { flags |= (1 << IDX_OPTIONS_MAX_SESSION_MEMORY); optionsBuffer[IDX_OPTIONS_MAX_SESSION_MEMORY] = - Math.max(1, options.maxSessionMemory); + MathMax(1, options.maxSessionMemory); } optionsBuffer[IDX_OPTIONS_FLAGS] = flags; } @@ -249,7 +253,7 @@ function updateOptionsBuffer(options) { function getDefaultSettings() { settingsBuffer[IDX_SETTINGS_FLAGS] = 0; binding.refreshDefaultSettings(); - const holder = Object.create(null); + const holder = ObjectCreate(null); const flags = settingsBuffer[IDX_SETTINGS_FLAGS]; @@ -430,7 +434,7 @@ function mapToHeaders(map, assertValuePseudoHeader = assertValidPseudoHeader) { let ret = ''; let count = 0; - const keys = Object.keys(map); + const keys = ObjectKeys(map); const singles = new Set(); let i; let isArray; @@ -525,7 +529,7 @@ const assertWithinRange = hideStackFrames( ); function toHeaderObject(headers) { - const obj = Object.create(null); + const obj = ObjectCreate(null); for (var n = 0; n < headers.length; n = n + 2) { const name = headers[n]; let value = headers[n + 1]; diff --git a/lib/internal/main/worker_thread.js b/lib/internal/main/worker_thread.js index 13d7e8de0e..95fa3026fd 100644 --- a/lib/internal/main/worker_thread.js +++ b/lib/internal/main/worker_thread.js @@ -3,7 +3,9 @@ // In worker threads, execute the script sent through the // message port. -const { Object } = primordials; +const { + ObjectDefineProperty, +} = primordials; const { patchProcessObject, @@ -72,12 +74,12 @@ const port = getEnvMessagePort(); // related IPC properties as unavailable. if (process.env.NODE_CHANNEL_FD) { const workerThreadSetup = require('internal/process/worker_thread_only'); - Object.defineProperty(process, 'channel', { + ObjectDefineProperty(process, 'channel', { enumerable: false, get: workerThreadSetup.unavailable('process.channel') }); - Object.defineProperty(process, 'connected', { + ObjectDefineProperty(process, 'connected', { enumerable: false, get: workerThreadSetup.unavailable('process.connected') }); diff --git a/lib/internal/modules/cjs/helpers.js b/lib/internal/modules/cjs/helpers.js index b75f67c0a4..f7155c4aa1 100644 --- a/lib/internal/modules/cjs/helpers.js +++ b/lib/internal/modules/cjs/helpers.js @@ -1,6 +1,9 @@ 'use strict'; -const { Object, SafeMap } = primordials; +const { + ObjectDefineProperty, + SafeMap, +} = primordials; const { ERR_MANIFEST_DEPENDENCY_MISSING, ERR_UNKNOWN_BUILTIN_MODULE @@ -135,14 +138,14 @@ function addBuiltinLibsToObject(object) { object[name] = val; }; - Object.defineProperty(object, name, { + ObjectDefineProperty(object, name, { get: () => { const lib = require(name); // Disable the current getter/setter and set up a new // non-enumerable property. delete object[name]; - Object.defineProperty(object, name, { + ObjectDefineProperty(object, name, { get: () => lib, set: setReal, configurable: true, diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index 9728cd2cb9..671006f9a9 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -22,12 +22,21 @@ 'use strict'; const { - JSON, - Object, - ObjectPrototype, - Reflect, + JSONParse, + ObjectCreate, + ObjectDefineProperty, + ObjectFreeze, + ObjectGetOwnPropertyDescriptor, + ObjectGetPrototypeOf, + ObjectKeys, + ObjectPrototypeHasOwnProperty, + ObjectSetPrototypeOf, + ReflectSet, SafeMap, - StringPrototype, + StringPrototypeIndexOf, + StringPrototypeMatch, + StringPrototypeSlice, + StringPrototypeStartsWith, } = primordials; const { NativeModule } = require('internal/bootstrap/loaders'); @@ -93,7 +102,7 @@ const { const isWindows = process.platform === 'win32'; -const relativeResolveCache = Object.create(null); +const relativeResolveCache = ObjectCreate(null); let requireDepth = 0; let statCache = null; @@ -155,12 +164,12 @@ for (const [id, mod] of NativeModule.map) { } } -Object.freeze(builtinModules); +ObjectFreeze(builtinModules); Module.builtinModules = builtinModules; -Module._cache = Object.create(null); -Module._pathCache = Object.create(null); -Module._extensions = Object.create(null); +Module._cache = ObjectCreate(null); +Module._pathCache = ObjectCreate(null); +Module._extensions = ObjectCreate(null); let modulePaths = []; Module.globalPaths = []; @@ -179,16 +188,16 @@ const wrapper = [ let wrapperProxy = new Proxy(wrapper, { set(target, property, value, receiver) { patched = true; - return Reflect.set(target, property, value, receiver); + return ReflectSet(target, property, value, receiver); }, defineProperty(target, property, descriptor) { patched = true; - return Object.defineProperty(target, property, descriptor); + return ObjectDefineProperty(target, property, descriptor); } }); -Object.defineProperty(Module, 'wrap', { +ObjectDefineProperty(Module, 'wrap', { get() { return wrap; }, @@ -199,7 +208,7 @@ Object.defineProperty(Module, 'wrap', { } }); -Object.defineProperty(Module, 'wrapper', { +ObjectDefineProperty(Module, 'wrapper', { get() { return wrapperProxy; }, @@ -244,7 +253,7 @@ function readPackage(requestPath) { } try { - const parsed = JSON.parse(json); + const parsed = JSONParse(json); const filtered = { name: parsed.name, main: parsed.main, @@ -406,7 +415,7 @@ function resolveBasePath(basePath, exts, isMain, trailingSlash, request) { if (!filename) { // Try it with each of the extensions if (exts === undefined) - exts = Object.keys(Module._extensions); + exts = ObjectKeys(Module._extensions); filename = tryExtensions(basePath, exts, isMain); } } @@ -414,7 +423,7 @@ function resolveBasePath(basePath, exts, isMain, trailingSlash, request) { if (!filename && rc === 1) { // Directory. // try it with each of the extensions at "index" if (exts === undefined) - exts = Object.keys(Module._extensions); + exts = ObjectKeys(Module._extensions); filename = tryPackage(basePath, exts, isMain, request); } @@ -433,14 +442,14 @@ function trySelf(paths, exts, isMain, trailingSlash, request) { let expansion; if (request === pkg.name) { expansion = ''; - } else if (StringPrototype.startsWith(request, `${pkg.name}/`)) { - expansion = StringPrototype.slice(request, pkg.name.length); + } else if (StringPrototypeStartsWith(request, `${pkg.name}/`)) { + expansion = StringPrototypeSlice(request, pkg.name.length); } else { return false; } if (exts === undefined) - exts = Object.keys(Module._extensions); + exts = ObjectKeys(Module._extensions); if (expansion) { // Use exports @@ -461,7 +470,7 @@ function isConditionalDotExportSugar(exports, basePath) { return false; let isConditional = false; let firstCheck = true; - for (const key of Object.keys(exports)) { + for (const key of ObjectKeys(exports)) { const curIsConditional = key[0] !== '.'; if (firstCheck) { firstCheck = false; @@ -487,7 +496,7 @@ function applyExports(basePath, expansion) { pkgExports = { '.': pkgExports }; if (typeof pkgExports === 'object') { - if (ObjectPrototype.hasOwnProperty(pkgExports, mappingKey)) { + if (ObjectPrototypeHasOwnProperty(pkgExports, mappingKey)) { const mapping = pkgExports[mappingKey]; return resolveExportsTarget(pathToFileURL(basePath + '/'), mapping, '', basePath, mappingKey); @@ -498,17 +507,17 @@ function applyExports(basePath, expansion) { return basePath; let dirMatch = ''; - for (const candidateKey of Object.keys(pkgExports)) { + for (const candidateKey of ObjectKeys(pkgExports)) { if (candidateKey[candidateKey.length - 1] !== '/') continue; if (candidateKey.length > dirMatch.length && - StringPrototype.startsWith(mappingKey, candidateKey)) { + StringPrototypeStartsWith(mappingKey, candidateKey)) { dirMatch = candidateKey; } } if (dirMatch !== '') { const mapping = pkgExports[dirMatch]; - const subpath = StringPrototype.slice(mappingKey, dirMatch.length); + const subpath = StringPrototypeSlice(mappingKey, dirMatch.length); return resolveExportsTarget(pathToFileURL(basePath + '/'), mapping, subpath, basePath, mappingKey); } @@ -532,7 +541,7 @@ function resolveExports(nmPath, request, absoluteRequest) { // The implementation's behavior is meant to mirror resolution in ESM. if (!absoluteRequest) { const [, name, expansion = ''] = - StringPrototype.match(request, EXPORTS_PATTERN) || []; + StringPrototypeMatch(request, EXPORTS_PATTERN) || []; if (!name) { return path.resolve(nmPath, request); } @@ -551,14 +560,14 @@ function resolveExportsTarget(pkgPath, target, subpath, basePath, mappingKey) { const resolvedTarget = new URL(target, pkgPath); const pkgPathPath = pkgPath.pathname; const resolvedTargetPath = resolvedTarget.pathname; - if (StringPrototype.startsWith(resolvedTargetPath, pkgPathPath) && - StringPrototype.indexOf(resolvedTargetPath, '/node_modules/', - pkgPathPath.length - 1) === -1) { + if (StringPrototypeStartsWith(resolvedTargetPath, pkgPathPath) && + StringPrototypeIndexOf(resolvedTargetPath, '/node_modules/', + pkgPathPath.length - 1) === -1) { const resolved = new URL(subpath, resolvedTarget); const resolvedPath = resolved.pathname; - if (StringPrototype.startsWith(resolvedPath, resolvedTargetPath) && - StringPrototype.indexOf(resolvedPath, '/node_modules/', - pkgPathPath.length - 1) === -1) { + if (StringPrototypeStartsWith(resolvedPath, resolvedTargetPath) && + StringPrototypeIndexOf(resolvedPath, '/node_modules/', + pkgPathPath.length - 1) === -1) { return fileURLToPath(resolved); } } @@ -575,7 +584,7 @@ function resolveExportsTarget(pkgPath, target, subpath, basePath, mappingKey) { } } else if (typeof target === 'object' && target !== null) { if (experimentalConditionalExports && - ObjectPrototype.hasOwnProperty(target, 'require')) { + ObjectPrototypeHasOwnProperty(target, 'require')) { try { return resolveExportsTarget(pkgPath, target.require, subpath, basePath, mappingKey); @@ -584,7 +593,7 @@ function resolveExportsTarget(pkgPath, target, subpath, basePath, mappingKey) { } } if (experimentalConditionalExports && - ObjectPrototype.hasOwnProperty(target, 'node')) { + ObjectPrototypeHasOwnProperty(target, 'node')) { try { return resolveExportsTarget(pkgPath, target.node, subpath, basePath, mappingKey); @@ -592,7 +601,7 @@ function resolveExportsTarget(pkgPath, target, subpath, basePath, mappingKey) { if (e.code !== 'MODULE_NOT_FOUND') throw e; } } - if (ObjectPrototype.hasOwnProperty(target, 'default')) { + if (ObjectPrototypeHasOwnProperty(target, 'default')) { try { return resolveExportsTarget(pkgPath, target.default, subpath, basePath, mappingKey); @@ -670,7 +679,7 @@ Module._findPath = function(request, paths, isMain) { if (!filename) { // Try it with each of the extensions if (exts === undefined) - exts = Object.keys(Module._extensions); + exts = ObjectKeys(Module._extensions); filename = tryExtensions(basePath, exts, isMain); } } @@ -678,7 +687,7 @@ Module._findPath = function(request, paths, isMain) { if (!filename && rc === 1) { // Directory. // try it with each of the extensions at "index" if (exts === undefined) - exts = Object.keys(Module._extensions); + exts = ObjectKeys(Module._extensions); filename = tryPackage(basePath, exts, isMain, request); } @@ -838,8 +847,8 @@ const CircularRequirePrototypeWarningProxy = new Proxy({}, { }, getOwnPropertyDescriptor(target, prop) { - if (ObjectPrototype.hasOwnProperty(target, prop)) - return Object.getOwnPropertyDescriptor(target, prop); + if (ObjectPrototypeHasOwnProperty(target, prop)) + return ObjectGetOwnPropertyDescriptor(target, prop); emitCircularRequireWarning(prop); return undefined; } @@ -851,14 +860,14 @@ const PublicObjectPrototype = global.Object.prototype; function getExportsForCircularRequire(module) { if (module.exports && - Object.getPrototypeOf(module.exports) === PublicObjectPrototype && + ObjectGetPrototypeOf(module.exports) === PublicObjectPrototype && // Exclude transpiled ES6 modules / TypeScript code because those may // employ unusual patterns for accessing 'module.exports'. That should be // okay because ES6 modules have a different approach to circular // dependencies anyway. !module.exports.__esModule) { // This is later unset once the module is done loading. - Object.setPrototypeOf(module.exports, CircularRequirePrototypeWarningProxy); + ObjectSetPrototypeOf(module.exports, CircularRequirePrototypeWarningProxy); } return module.exports; @@ -941,9 +950,9 @@ Module._load = function(request, parent, isMain) { delete relativeResolveCache[relResolveCacheIdentifier]; } } else if (module.exports && - Object.getPrototypeOf(module.exports) === + ObjectGetPrototypeOf(module.exports) === CircularRequirePrototypeWarningProxy) { - Object.setPrototypeOf(module.exports, PublicObjectPrototype); + ObjectSetPrototypeOf(module.exports, PublicObjectPrototype); } } @@ -1225,7 +1234,7 @@ Module._extensions['.json'] = function(module, filename) { } try { - module.exports = JSON.parse(stripBOM(content)); + module.exports = JSONParse(stripBOM(content)); } catch (err) { err.message = filename + ': ' + err.message; throw err; diff --git a/lib/internal/modules/esm/create_dynamic_module.js b/lib/internal/modules/esm/create_dynamic_module.js index 804420c920..f8e00fd2ad 100644 --- a/lib/internal/modules/esm/create_dynamic_module.js +++ b/lib/internal/modules/esm/create_dynamic_module.js @@ -1,11 +1,16 @@ 'use strict'; -const { ArrayPrototype, JSON, Object } = primordials; +const { + ArrayPrototypeJoin, + ArrayPrototypeMap, + JSONStringify, + ObjectCreate, +} = primordials; const debug = require('internal/util/debuglog').debuglog('esm'); function createImport(impt, index) { - const imptPath = JSON.stringify(impt); + const imptPath = JSONStringify(impt); return `import * as $import_${index} from ${imptPath}; import.meta.imports[${imptPath}] = $import_${index};`; } @@ -23,8 +28,8 @@ import.meta.exports.${name} = { const createDynamicModule = (imports, exports, url = '', evaluate) => { debug('creating ESM facade for %s with exports: %j', url, exports); const source = ` -${ArrayPrototype.join(ArrayPrototype.map(imports, createImport), '\n')} -${ArrayPrototype.join(ArrayPrototype.map(exports, createExport), '\n')} +${ArrayPrototypeJoin(ArrayPrototypeMap(imports, createImport), '\n')} +${ArrayPrototypeJoin(ArrayPrototypeMap(exports, createExport), '\n')} import.meta.done(); `; const { ModuleWrap, callbackMap } = internalBinding('module_wrap'); @@ -32,12 +37,12 @@ import.meta.done(); const readyfns = new Set(); const reflect = { - exports: Object.create(null), + exports: ObjectCreate(null), onReady: (cb) => { readyfns.add(cb); }, }; if (imports.length) - reflect.imports = Object.create(null); + reflect.imports = ObjectCreate(null); callbackMap.set(m, { initializeImportMeta: (meta, wrap) => { diff --git a/lib/internal/modules/esm/default_resolve.js b/lib/internal/modules/esm/default_resolve.js index 5271c6a0fe..a0d9a14dda 100644 --- a/lib/internal/modules/esm/default_resolve.js +++ b/lib/internal/modules/esm/default_resolve.js @@ -1,5 +1,9 @@ 'use strict'; +const { + SafeMap, +} = primordials; + const internalFS = require('internal/fs/utils'); const { NativeModule } = require('internal/bootstrap/loaders'); const { extname } = require('path'); @@ -19,8 +23,6 @@ const { URL, pathToFileURL, fileURLToPath } = require('internal/url'); const { ERR_INPUT_TYPE_NOT_ALLOWED, ERR_UNKNOWN_FILE_EXTENSION } = require('internal/errors').codes; -const { SafeMap } = primordials; - const realpathCache = new SafeMap(); // const TYPE_NONE = 0; diff --git a/lib/internal/modules/esm/loader.js b/lib/internal/modules/esm/loader.js index 875fb97f91..97f5793529 100644 --- a/lib/internal/modules/esm/loader.js +++ b/lib/internal/modules/esm/loader.js @@ -1,6 +1,10 @@ 'use strict'; -const { FunctionPrototype } = primordials; +const { + FunctionPrototypeBind, + ObjectSetPrototypeOf, + SafeMap, +} = primordials; const { ERR_INVALID_RETURN_PROPERTY, @@ -26,11 +30,6 @@ const { getOptionValue } = require('internal/options'); const debug = require('internal/util/debuglog').debuglog('esm'); -const { - Object, - SafeMap -} = primordials; - /* A Loader instance is used as the main entry point for loading ES modules. * Currently, this is a singleton -- there is only one used for loading * the main module and everything in its dependency graph. */ @@ -137,10 +136,10 @@ class Loader { hook({ resolve, dynamicInstantiate }) { // Use .bind() to avoid giving access to the Loader instance when called. if (resolve !== undefined) - this._resolve = FunctionPrototype.bind(resolve, null); + this._resolve = FunctionPrototypeBind(resolve, null); if (dynamicInstantiate !== undefined) { this._dynamicInstantiate = - FunctionPrototype.bind(dynamicInstantiate, null); + FunctionPrototypeBind(dynamicInstantiate, null); } } @@ -182,6 +181,6 @@ class Loader { } } -Object.setPrototypeOf(Loader.prototype, null); +ObjectSetPrototypeOf(Loader.prototype, null); exports.Loader = Loader; diff --git a/lib/internal/modules/esm/module_job.js b/lib/internal/modules/esm/module_job.js index df1edc3810..e4a9040217 100644 --- a/lib/internal/modules/esm/module_job.js +++ b/lib/internal/modules/esm/module_job.js @@ -1,9 +1,9 @@ 'use strict'; const { - Object, + ObjectSetPrototypeOf, SafeSet, - SafePromise + SafePromise, } = primordials; const { ModuleWrap } = internalBinding('module_wrap'); @@ -109,5 +109,5 @@ class ModuleJob { return { module, result: module.evaluate(timeout, breakOnSigint) }; } } -Object.setPrototypeOf(ModuleJob.prototype, null); +ObjectSetPrototypeOf(ModuleJob.prototype, null); module.exports = ModuleJob; diff --git a/lib/internal/modules/esm/module_map.js b/lib/internal/modules/esm/module_map.js index 41adc0079a..9b7d86581e 100644 --- a/lib/internal/modules/esm/module_map.js +++ b/lib/internal/modules/esm/module_map.js @@ -2,7 +2,7 @@ const ModuleJob = require('internal/modules/esm/module_job'); const { - SafeMap + SafeMap, } = primordials; const debug = require('internal/util/debuglog').debuglog('esm'); const { ERR_INVALID_ARG_TYPE } = require('internal/errors').codes; diff --git a/lib/internal/modules/esm/translators.js b/lib/internal/modules/esm/translators.js index 34a9a140dd..d4103ab9cd 100644 --- a/lib/internal/modules/esm/translators.js +++ b/lib/internal/modules/esm/translators.js @@ -3,10 +3,10 @@ /* global WebAssembly */ const { - JSON, - Object, + JSONParse, + ObjectKeys, SafeMap, - StringPrototype + StringPrototypeReplace, } = primordials; const { Buffer } = require('buffer'); @@ -29,7 +29,6 @@ const { ERR_UNKNOWN_BUILTIN_MODULE } = require('internal/errors').codes; const readFileAsync = promisify(fs.readFile); -const JsonParse = JSON.parse; const { maybeCacheSourceMap } = require('internal/source_map/source_map_cache'); const moduleWrap = internalBinding('module_wrap'); const { ModuleWrap } = moduleWrap; @@ -101,7 +100,7 @@ translators.set('commonjs', function commonjsStrategy(url, isMain) { return cached; } const module = CJSModule._cache[ - isWindows ? StringPrototype.replace(pathname, winSepRegEx, '\\') : pathname + isWindows ? StringPrototypeReplace(pathname, winSepRegEx, '\\') : pathname ]; if (module && module.loaded) { const exports = module.exports; @@ -141,7 +140,7 @@ translators.set('json', async function jsonStrategy(url) { let module; if (pathname) { modulePath = isWindows ? - StringPrototype.replace(pathname, winSepRegEx, '\\') : pathname; + StringPrototypeReplace(pathname, winSepRegEx, '\\') : pathname; module = CJSModule._cache[modulePath]; if (module && module.loaded) { const exports = module.exports; @@ -164,7 +163,7 @@ translators.set('json', async function jsonStrategy(url) { } } try { - const exports = JsonParse(stripBOM(content)); + const exports = JSONParse(stripBOM(content)); module = { exports, loaded: true @@ -204,7 +203,7 @@ translators.set('wasm', async function(url) { return createDynamicModule(imports, exports, url, (reflect) => { const { exports } = new WebAssembly.Instance(compiled, reflect.imports); - for (const expt of Object.keys(exports)) + for (const expt of ObjectKeys(exports)) reflect.exports[expt].set(exports[expt]); }).module; }); diff --git a/lib/internal/per_context/domexception.js b/lib/internal/per_context/domexception.js index 3852567ac6..9b26631904 100644 --- a/lib/internal/per_context/domexception.js +++ b/lib/internal/per_context/domexception.js @@ -1,10 +1,11 @@ 'use strict'; const { + ObjectDefineProperties, + ObjectDefineProperty, SafeWeakMap, SafeMap, - Object, - Symbol + SymbolToStringTag, } = primordials; class ERR_INVALID_THIS extends TypeError { @@ -73,8 +74,8 @@ class DOMException extends Error { } } -Object.defineProperties(DOMException.prototype, { - [Symbol.toStringTag]: { configurable: true, value: 'DOMException' }, +ObjectDefineProperties(DOMException.prototype, { + [SymbolToStringTag]: { configurable: true, value: 'DOMException' }, name: { enumerable: true, configurable: true }, message: { enumerable: true, configurable: true }, code: { enumerable: true, configurable: true } @@ -112,8 +113,8 @@ function forEachCode(fn) { forEachCode((name, codeName, value) => { const desc = { enumerable: true, value }; - Object.defineProperty(DOMException, codeName, desc); - Object.defineProperty(DOMException.prototype, codeName, desc); + ObjectDefineProperty(DOMException, codeName, desc); + ObjectDefineProperty(DOMException.prototype, codeName, desc); }); exports.DOMException = DOMException; diff --git a/lib/internal/per_context/primordials.js b/lib/internal/per_context/primordials.js index 7e02a9e316..6957019490 100644 --- a/lib/internal/per_context/primordials.js +++ b/lib/internal/per_context/primordials.js @@ -37,14 +37,28 @@ function copyProps(src, dest) { } } -function copyPrototype(src, dest) { +function copyPropsRenamed(src, dest, prefix) { for (const key of Reflect.ownKeys(src)) { - if (!Reflect.getOwnPropertyDescriptor(dest, key)) { + if (typeof key === 'string') { + Reflect.defineProperty( + dest, + `${prefix}${key[0].toUpperCase()}${key.slice(1)}`, + Reflect.getOwnPropertyDescriptor(src, key)); + } + } +} + +function copyPrototype(src, dest, prefix) { + for (const key of Reflect.ownKeys(src)) { + if (typeof key === 'string') { const desc = Reflect.getOwnPropertyDescriptor(src, key); if (typeof desc.value === 'function') { desc.value = uncurryThis(desc.value); } - Reflect.defineProperty(dest, key, desc); + Reflect.defineProperty( + dest, + `${prefix}${key[0].toUpperCase()}${key.slice(1)}`, + desc); } } } @@ -83,13 +97,13 @@ primordials.SafePromise = makeSafe( 'Math', 'Reflect' ].forEach((name) => { - const target = primordials[name] = Object.create(null); - copyProps(global[name], target); + copyPropsRenamed(global[name], primordials, name); }); // Create copies of intrinsic objects [ 'Array', + 'ArrayBuffer', 'BigInt', 'Boolean', 'Date', @@ -102,18 +116,19 @@ primordials.SafePromise = makeSafe( 'Set', 'String', 'Symbol', + 'WeakMap', + 'WeakSet', ].forEach((name) => { const original = global[name]; - const target = primordials[name] = Object.setPrototypeOf({ + primordials[name] = Object.setPrototypeOf({ [name]: function(...args) { return new.target ? ReflectConstruct(original, args, new.target) : ReflectApply(original, this, args); } }[name], null); - copyProps(original, target); - const proto = primordials[name + 'Prototype'] = Object.create(null); - copyPrototype(original.prototype, proto); + copyPropsRenamed(original, primordials, name); + copyPrototype(original.prototype, primordials, `${name}Prototype`); }); Object.setPrototypeOf(primordials, null); diff --git a/lib/internal/policy/manifest.js b/lib/internal/policy/manifest.js index e8400b672e..d078ed092e 100644 --- a/lib/internal/policy/manifest.js +++ b/lib/internal/policy/manifest.js @@ -2,11 +2,13 @@ const { Map, - MapPrototype, - Object, - RegExpPrototype, + MapPrototypeSet, + ObjectEntries, + ObjectFreeze, + ObjectSetPrototypeOf, + RegExpPrototypeTest, SafeMap, - uncurryThis + uncurryThis, } = primordials; const { canBeRequiredByUsers @@ -28,7 +30,6 @@ const HashUpdate = uncurryThis(crypto.Hash.prototype.update); const HashDigest = uncurryThis(crypto.Hash.prototype.digest); const BufferEquals = uncurryThis(Buffer.prototype.equals); const BufferToString = uncurryThis(Buffer.prototype.toString); -const { entries } = Object; const kRelativeURLStringPattern = /^\.{0,2}\//; const { getOptionValue } = require('internal/options'); const shouldAbortOnUncaughtException = @@ -73,7 +74,7 @@ class Manifest { } this.#reaction = reaction; - const manifestEntries = entries(obj.resources); + const manifestEntries = ObjectEntries(obj.resources); const parsedURLs = new SafeMap(); for (let i = 0; i < manifestEntries.length; i++) { @@ -84,7 +85,7 @@ class Manifest { resourceURL = parsedURLs.get(resourceHREF); resourceHREF = resourceURL.href; } else if ( - RegExpPrototype.test(kRelativeURLStringPattern, resourceHREF) + RegExpPrototypeTest(kRelativeURLStringPattern, resourceHREF) ) { resourceURL = new URL(resourceHREF, manifestURL); resourceHREF = resourceURL.href; @@ -96,7 +97,7 @@ class Manifest { if (integrity != null) { debug(`Manifest contains integrity for url ${originalHREF}`); if (typeof integrity === 'string') { - const sri = Object.freeze(SRI.parse(integrity)); + const sri = ObjectFreeze(SRI.parse(integrity)); if (integrities.has(resourceHREF)) { const old = integrities.get(resourceHREF); let mismatch = false; @@ -156,7 +157,7 @@ class Manifest { parsedURLs.set(to, resolvedURL); parsedURLs.set(href, resolvedURL); return resolvedURL; - } else if (RegExpPrototype.test(kRelativeURLStringPattern, to)) { + } else if (RegExpPrototypeTest(kRelativeURLStringPattern, to)) { const resolvedURL = new URL(to, manifestURL); const href = resourceURL.href; parsedURLs.set(to, resolvedURL); @@ -180,7 +181,7 @@ class Manifest { 'dependencies'); } } - Object.freeze(this); + ObjectFreeze(this); } getRedirector(requester) { @@ -217,7 +218,7 @@ class Manifest { timingSafeEqual(digest, expected)) { return true; } - MapPrototype.set( + MapPrototypeSet( realIntegrities, algorithm, BufferToString(digest, 'base64') @@ -230,8 +231,8 @@ class Manifest { } // Lock everything down to avoid problems even if reference is leaked somehow -Object.setPrototypeOf(Manifest, null); -Object.setPrototypeOf(Manifest.prototype, null); -Object.freeze(Manifest); -Object.freeze(Manifest.prototype); -module.exports = Object.freeze({ Manifest }); +ObjectSetPrototypeOf(Manifest, null); +ObjectSetPrototypeOf(Manifest.prototype, null); +ObjectFreeze(Manifest); +ObjectFreeze(Manifest.prototype); +module.exports = ObjectFreeze({ Manifest }); diff --git a/lib/internal/policy/sri.js b/lib/internal/policy/sri.js index 877c96a6f7..38d7fc9e07 100644 --- a/lib/internal/policy/sri.js +++ b/lib/internal/policy/sri.js @@ -2,9 +2,12 @@ // Value of https://w3c.github.io/webappsec-subresource-integrity/#the-integrity-attribute const { - Object, - RegExpPrototype, - StringPrototype + ObjectDefineProperty, + ObjectFreeze, + ObjectSeal, + RegExpPrototypeExec, + RegExpPrototypeTest, + StringPrototypeSlice, } = primordials; // Returns [{algorithm, value (in base64 string), options,}] @@ -20,10 +23,9 @@ const kHASH_EXPRESSION = `(${kHASH_ALGO})-(${kHASH_VALUE})`; const kOPTION_EXPRESSION = `(${kVCHAR}*)`; const kHASH_WITH_OPTIONS = `${kHASH_EXPRESSION}(?:[?](${kOPTION_EXPRESSION}))?`; const kSRIPattern = RegExp(`(${kWSP}*)(?:${kHASH_WITH_OPTIONS})`, 'g'); -const { freeze } = Object; -Object.seal(kSRIPattern); +ObjectSeal(kSRIPattern); const kAllWSP = RegExp(`^${kWSP}*$`); -Object.seal(kAllWSP); +ObjectSeal(kAllWSP); const BufferFrom = require('buffer').Buffer.from; @@ -32,7 +34,7 @@ const parse = (str) => { let prevIndex = 0; let match; const entries = []; - while (match = RegExpPrototype.exec(kSRIPattern, str)) { + while (match = RegExpPrototypeExec(kSRIPattern, str)) { if (match.index !== prevIndex) { throw new ERR_SRI_PARSE(str, str.charAt(prevIndex), prevIndex); } @@ -41,10 +43,10 @@ const parse = (str) => { } // Avoid setters being fired - Object.defineProperty(entries, entries.length, { + ObjectDefineProperty(entries, entries.length, { enumerable: true, configurable: true, - value: freeze({ + value: ObjectFreeze({ __proto__: null, algorithm: match[2], value: BufferFrom(match[3], 'base64'), @@ -55,7 +57,7 @@ const parse = (str) => { } if (prevIndex !== str.length) { - if (!RegExpPrototype.test(kAllWSP, StringPrototype.slice(str, prevIndex))) { + if (!RegExpPrototypeTest(kAllWSP, StringPrototypeSlice(str, prevIndex))) { throw new ERR_SRI_PARSE(str, str.charAt(prevIndex), prevIndex); } } diff --git a/lib/internal/process/execution.js b/lib/internal/process/execution.js index eed554263c..44c67452f5 100644 --- a/lib/internal/process/execution.js +++ b/lib/internal/process/execution.js @@ -1,6 +1,8 @@ 'use strict'; -const { JSON } = primordials; +const { + JSONStringify, +} = primordials; const path = require('path'); @@ -64,7 +66,7 @@ function evalScript(name, body, breakFirstLine, print) { module.paths = CJSModule._nodeModulePaths(cwd); global.kVmBreakFirstLineSymbol = kVmBreakFirstLineSymbol; const script = ` - global.__filename = ${JSON.stringify(name)}; + global.__filename = ${JSONStringify(name)}; global.exports = exports; global.module = module; global.__dirname = __dirname; @@ -72,8 +74,8 @@ function evalScript(name, body, breakFirstLine, print) { const { kVmBreakFirstLineSymbol } = global; delete global.kVmBreakFirstLineSymbol; return require("vm").runInThisContext( - ${JSON.stringify(body)}, { - filename: ${JSON.stringify(name)}, + ${JSONStringify(body)}, { + filename: ${JSONStringify(name)}, displayErrors: true, [kVmBreakFirstLineSymbol]: ${!!breakFirstLine} });\n`; diff --git a/lib/internal/process/per_thread.js b/lib/internal/process/per_thread.js index 63ebf2afb6..fee66ee1a0 100644 --- a/lib/internal/process/per_thread.js +++ b/lib/internal/process/per_thread.js @@ -5,10 +5,13 @@ // thread and the worker threads. const { - Object, - RegExpPrototype, - SetPrototype, - StringPrototype + ObjectDefineProperties, + ObjectDefineProperty, + ObjectFreeze, + ObjectGetOwnPropertyDescriptors, + RegExpPrototypeTest, + SetPrototypeHas, + StringPrototypeReplace, } = primordials; const { @@ -271,15 +274,15 @@ function buildAllowedFlags() { } const trimLeadingDashes = - (flag) => StringPrototype.replace(flag, leadingDashesRegex, ''); + (flag) => StringPrototypeReplace(flag, leadingDashesRegex, ''); // Save these for comparison against flags provided to // process.allowedNodeEnvironmentFlags.has() which lack leading dashes. // Avoid interference w/ user code by flattening `Set.prototype` into // each object. - const nodeFlags = Object.defineProperties( + const nodeFlags = ObjectDefineProperties( new Set(allowedNodeEnvironmentFlags.map(trimLeadingDashes)), - Object.getOwnPropertyDescriptors(Set.prototype) + ObjectGetOwnPropertyDescriptors(Set.prototype) ); class NodeEnvironmentFlagsSet extends Set { @@ -288,7 +291,7 @@ function buildAllowedFlags() { // The super constructor consumes `add`, but // disallow any future adds. - Object.defineProperty(this, 'add', { + ObjectDefineProperty(this, 'add', { value: () => this }); } @@ -311,21 +314,21 @@ function buildAllowedFlags() { // on a dummy option set and see whether it rejects the argument or // not. if (typeof key === 'string') { - key = StringPrototype.replace(key, replaceUnderscoresRegex, '-'); - if (RegExpPrototype.test(leadingDashesRegex, key)) { - key = StringPrototype.replace(key, trailingValuesRegex, ''); - return SetPrototype.has(this, key); + key = StringPrototypeReplace(key, replaceUnderscoresRegex, '-'); + if (RegExpPrototypeTest(leadingDashesRegex, key)) { + key = StringPrototypeReplace(key, trailingValuesRegex, ''); + return SetPrototypeHas(this, key); } - return SetPrototype.has(nodeFlags, key); + return SetPrototypeHas(nodeFlags, key); } return false; } } - Object.freeze(NodeEnvironmentFlagsSet.prototype.constructor); - Object.freeze(NodeEnvironmentFlagsSet.prototype); + ObjectFreeze(NodeEnvironmentFlagsSet.prototype.constructor); + ObjectFreeze(NodeEnvironmentFlagsSet.prototype); - return Object.freeze(new NodeEnvironmentFlagsSet( + return ObjectFreeze(new NodeEnvironmentFlagsSet( allowedNodeEnvironmentFlags )); } diff --git a/lib/internal/process/policy.js b/lib/internal/process/policy.js index d2501403c3..ea283a4497 100644 --- a/lib/internal/process/policy.js +++ b/lib/internal/process/policy.js @@ -1,6 +1,10 @@ 'use strict'; -const { JSON, Object, Reflect } = primordials; +const { + JSONParse, + ObjectFreeze, + ReflectSetPrototypeOf, +} = primordials; const { ERR_MANIFEST_TDZ, @@ -10,7 +14,7 @@ let manifest; let manifestSrc; let manifestURL; -module.exports = Object.freeze({ +module.exports = ObjectFreeze({ __proto__: null, setup(src, url) { manifestSrc = src; @@ -20,10 +24,10 @@ module.exports = Object.freeze({ return; } - const json = JSON.parse(src, (_, o) => { + const json = JSONParse(src, (_, o) => { if (o && typeof o === 'object') { - Reflect.setPrototypeOf(o, null); - Object.freeze(o); + ReflectSetPrototypeOf(o, null); + ObjectFreeze(o); } return o; }); diff --git a/lib/internal/process/promises.js b/lib/internal/process/promises.js index ab83377607..35ebb39115 100644 --- a/lib/internal/process/promises.js +++ b/lib/internal/process/promises.js @@ -1,6 +1,8 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperty, +} = primordials; const { tickInfo, @@ -222,7 +224,7 @@ function getErrorWithoutStack(name, message) { // eslint-disable-next-line no-restricted-syntax const err = new Error(message); Error.stackTraceLimit = tmp; - Object.defineProperty(err, 'name', { + ObjectDefineProperty(err, 'name', { value: name, enumerable: false, writable: true, diff --git a/lib/internal/process/report.js b/lib/internal/process/report.js index cc78aebbda..407cc12cb0 100644 --- a/lib/internal/process/report.js +++ b/lib/internal/process/report.js @@ -5,7 +5,9 @@ const { } = require('internal/errors').codes; const { validateSignalName, validateString } = require('internal/validators'); const nr = internalBinding('report'); -const { JSON } = primordials; +const { + JSONParse, +} = primordials; const report = { writeReport(file, err) { if (typeof file === 'object' && file !== null) { @@ -27,7 +29,7 @@ const report = { else if (err === null || typeof err !== 'object') throw new ERR_INVALID_ARG_TYPE('err', 'Object', err); - return JSON.parse(nr.getReport(err.stack)); + return JSONParse(nr.getReport(err.stack)); }, get directory() { return nr.getDirectory(); diff --git a/lib/internal/process/task_queues.js b/lib/internal/process/task_queues.js index 8906b4aa1e..b50dae2097 100644 --- a/lib/internal/process/task_queues.js +++ b/lib/internal/process/task_queues.js @@ -1,6 +1,8 @@ 'use strict'; -const { FunctionPrototype } = primordials; +const { + FunctionPrototypeBind, +} = primordials; const { // For easy access to the nextTick state in the C++ land, @@ -165,7 +167,7 @@ function queueMicrotask(callback) { const asyncResource = createMicrotaskResource(); asyncResource.callback = callback; - enqueueMicrotask(FunctionPrototype.bind(runMicrotask, asyncResource)); + enqueueMicrotask(FunctionPrototypeBind(runMicrotask, asyncResource)); } module.exports = { diff --git a/lib/internal/repl.js b/lib/internal/repl.js index cb368ea612..a5f5cd25f2 100644 --- a/lib/internal/repl.js +++ b/lib/internal/repl.js @@ -1,11 +1,13 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectCreate, +} = primordials; const REPL = require('repl'); const { kStandaloneREPL } = require('internal/repl/utils'); -module.exports = Object.create(REPL); +module.exports = ObjectCreate(REPL); module.exports.createInternalRepl = createRepl; function createRepl(env, opts, cb) { diff --git a/lib/internal/repl/await.js b/lib/internal/repl/await.js index 1c7dba2efd..b437221ca2 100644 --- a/lib/internal/repl/await.js +++ b/lib/internal/repl/await.js @@ -1,6 +1,8 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectKeys, +} = primordials; const acorn = require('internal/deps/acorn/acorn/dist/acorn'); const walk = require('internal/deps/acorn/acorn-walk/dist/walk'); @@ -72,7 +74,7 @@ const visitorsWithoutAncestors = { }; const visitors = {}; -for (const nodeType of Object.keys(walk.base)) { +for (const nodeType of ObjectKeys(walk.base)) { const callback = visitorsWithoutAncestors[nodeType] || walk.base[nodeType]; visitors[nodeType] = (node, state, c) => { const isNew = node !== state.ancestors[state.ancestors.length - 1]; diff --git a/lib/internal/source_map/source_map_cache.js b/lib/internal/source_map/source_map_cache.js index 340615eb6c..8211e51e3e 100644 --- a/lib/internal/source_map/source_map_cache.js +++ b/lib/internal/source_map/source_map_cache.js @@ -1,26 +1,21 @@ 'use strict'; const { - JSON, - Object: { - create: ObjectCreate, - keys: ObjectKeys, - getOwnPropertyDescriptor: ObjectGetOwnPropertyDescriptor, - }, - ObjectPrototype: { - hasOwnProperty: ObjectHasOwnProperty - }, - MapPrototype: { - entries: MapEntries - }, uncurryThis + JSONParse, + ObjectCreate, + ObjectKeys, + ObjectGetOwnPropertyDescriptor, + ObjectPrototypeHasOwnProperty, + MapPrototypeEntries, + WeakMapPrototypeGet, + uncurryThis, } = primordials; -const MapIteratorNext = uncurryThis(MapEntries(new Map()).next); -const WeakMapGet = uncurryThis(WeakMap.prototype.get); +const MapIteratorNext = uncurryThis(MapPrototypeEntries(new Map()).next); function ObjectGetValueSafe(obj, key) { const desc = ObjectGetOwnPropertyDescriptor(obj, key); - return ObjectHasOwnProperty(desc, 'value') ? desc.value : undefined; + return ObjectPrototypeHasOwnProperty(desc, 'value') ? desc.value : undefined; } // See https://sourcemaps.info/spec.html for SourceMap V3 specification. @@ -115,7 +110,7 @@ function lineLengths(content) { function sourceMapFromFile(sourceMapFile) { try { const content = fs.readFileSync(sourceMapFile, 'utf8'); - const data = JSON.parse(content); + const data = JSONParse(content); return sourcesToAbsolute(dirname(sourceMapFile), data); } catch (err) { debug(err.stack); @@ -134,7 +129,7 @@ function sourceMapFromDataUrl(basePath, url) { const decodedData = base64 ? Buffer.from(data, 'base64').toString('utf8') : data; try { - const parsedData = JSON.parse(decodedData); + const parsedData = JSONParse(decodedData); return sourcesToAbsolute(basePath, parsedData); } catch (err) { debug(err.stack); @@ -182,7 +177,7 @@ function rekeySourceMap(cjsModuleInstance, newInstance) { function sourceMapCacheToObject() { const obj = ObjectCreate(null); - const it = MapEntries(esmSourceMapCache); + const it = MapPrototypeEntries(esmSourceMapCache); let entry; while (!(entry = MapIteratorNext(it)).done) { const k = entry.value[0]; @@ -211,7 +206,7 @@ function appendCJSCache(obj) { for (let i = 0; i < cjsModules.length; i++) { const key = cjsModules[i]; const module = ObjectGetValueSafe(cjsModuleCache, key); - const value = WeakMapGet(cjsSourceMapCache, module); + const value = WeakMapPrototypeGet(cjsSourceMapCache, module); if (value) { // This is okay because `obj` has a null prototype. obj[`file://${key}`] = { diff --git a/lib/internal/streams/async_iterator.js b/lib/internal/streams/async_iterator.js index 07f2191e71..e05813e5df 100644 --- a/lib/internal/streams/async_iterator.js +++ b/lib/internal/streams/async_iterator.js @@ -1,6 +1,10 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectCreate, + ObjectGetPrototypeOf, + ObjectSetPrototypeOf, +} = primordials; const finished = require('internal/streams/end-of-stream'); @@ -49,10 +53,10 @@ function wrapForNext(lastPromise, iter) { }; } -const AsyncIteratorPrototype = Object.getPrototypeOf( - Object.getPrototypeOf(async function* () {}).prototype); +const AsyncIteratorPrototype = ObjectGetPrototypeOf( + ObjectGetPrototypeOf(async function* () {}).prototype); -const ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf({ +const ReadableStreamAsyncIteratorPrototype = ObjectSetPrototypeOf({ get stream() { return this[kStream]; }, @@ -135,7 +139,7 @@ const ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf({ }, AsyncIteratorPrototype); const createReadableStreamAsyncIterator = (stream) => { - const iterator = Object.create(ReadableStreamAsyncIteratorPrototype, { + const iterator = ObjectCreate(ReadableStreamAsyncIteratorPrototype, { [kStream]: { value: stream, writable: true }, [kLastResolve]: { value: null, writable: true }, [kLastReject]: { value: null, writable: true }, diff --git a/lib/internal/streams/lazy_transform.js b/lib/internal/streams/lazy_transform.js index 0036bf306c..6584159095 100644 --- a/lib/internal/streams/lazy_transform.js +++ b/lib/internal/streams/lazy_transform.js @@ -3,7 +3,11 @@ // for the stream, one conventional and one non-conventional. 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperties, + ObjectDefineProperty, + ObjectSetPrototypeOf, +} = primordials; const stream = require('stream'); @@ -18,8 +22,8 @@ function LazyTransform(options) { this.writable = true; this.readable = true; } -Object.setPrototypeOf(LazyTransform.prototype, stream.Transform.prototype); -Object.setPrototypeOf(LazyTransform, stream.Transform); +ObjectSetPrototypeOf(LazyTransform.prototype, stream.Transform.prototype); +ObjectSetPrototypeOf(LazyTransform, stream.Transform); function makeGetter(name) { return function() { @@ -36,7 +40,7 @@ function makeGetter(name) { function makeSetter(name) { return function(val) { - Object.defineProperty(this, name, { + ObjectDefineProperty(this, name, { value: val, enumerable: true, configurable: true, @@ -45,7 +49,7 @@ function makeSetter(name) { }; } -Object.defineProperties(LazyTransform.prototype, { +ObjectDefineProperties(LazyTransform.prototype, { _readableState: { get: makeGetter('_readableState'), set: makeSetter('_readableState'), diff --git a/lib/internal/streams/legacy.js b/lib/internal/streams/legacy.js index 062eabec38..702e3c56ba 100644 --- a/lib/internal/streams/legacy.js +++ b/lib/internal/streams/legacy.js @@ -1,14 +1,16 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectSetPrototypeOf, +} = primordials; const EE = require('events'); function Stream() { EE.call(this); } -Object.setPrototypeOf(Stream.prototype, EE.prototype); -Object.setPrototypeOf(Stream, EE); +ObjectSetPrototypeOf(Stream.prototype, EE.prototype); +ObjectSetPrototypeOf(Stream, EE); Stream.prototype.pipe = function(dest, options) { const source = this; diff --git a/lib/internal/streams/state.js b/lib/internal/streams/state.js index a3f5e67286..aa16a0a6b8 100644 --- a/lib/internal/streams/state.js +++ b/lib/internal/streams/state.js @@ -1,6 +1,8 @@ 'use strict'; -const { Math } = primordials; +const { + MathFloor, +} = primordials; const { ERR_INVALID_OPT_VALUE } = require('internal/errors').codes; @@ -20,7 +22,7 @@ function getHighWaterMark(state, options, duplexKey, isDuplex) { const name = isDuplex ? duplexKey : 'highWaterMark'; throw new ERR_INVALID_OPT_VALUE(name, hwm); } - return Math.floor(hwm); + return MathFloor(hwm); } // Default value diff --git a/lib/internal/timers.js b/lib/internal/timers.js index 4067c2ee0b..e55e17b537 100644 --- a/lib/internal/timers.js +++ b/lib/internal/timers.js @@ -72,7 +72,11 @@ // timers within (or creation of a new list). However, these operations combined // have shown to be trivial in comparison to other timers architectures. -const { Math, Object } = primordials; +const { + MathMax, + MathTrunc, + ObjectCreate, +} = primordials; const { scheduleTimer, @@ -137,7 +141,7 @@ const timerListQueue = new PriorityQueue(compareTimersLists, setPosition); // // - key = time in milliseconds // - value = linked list -const timerListMap = Object.create(null); +const timerListMap = ObjectCreate(null); function initAsyncResource(resource, type) { const asyncId = resource[async_id_symbol] = newAsyncId(); @@ -308,7 +312,7 @@ function insert(item, refed, start) { return; // Truncate so that accuracy of sub-millisecond timers is not assumed. - msecs = Math.trunc(msecs); + msecs = MathTrunc(msecs); item._idleStart = start; @@ -490,7 +494,7 @@ function getTimerCallbacks(runNextTicks) { // Check if this loop iteration is too early for the next timer. // This happens if there are more timers scheduled for later in the list. if (diff < msecs) { - list.expiry = Math.max(timer._idleStart + msecs, now + 1); + list.expiry = MathMax(timer._idleStart + msecs, now + 1); list.id = timerListId++; timerListQueue.percolateDown(1); debug('%d list wait because diff is %d', msecs, diff); diff --git a/lib/internal/tls.js b/lib/internal/tls.js index 8bf9330352..ee43801638 100644 --- a/lib/internal/tls.js +++ b/lib/internal/tls.js @@ -1,11 +1,13 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectCreate, +} = primordials; // Example: // C=US\nST=CA\nL=SF\nO=Joyent\nOU=Node.js\nCN=ca1\nemailAddress=ry@clouds.org function parseCertString(s) { - const out = Object.create(null); + const out = ObjectCreate(null); const parts = s.split('\n'); for (let i = 0, len = parts.length; i < len; i++) { const sepIndex = parts[i].indexOf('='); diff --git a/lib/internal/trace_events_async_hooks.js b/lib/internal/trace_events_async_hooks.js index 4485b7a8c8..87ee63d8ba 100644 --- a/lib/internal/trace_events_async_hooks.js +++ b/lib/internal/trace_events_async_hooks.js @@ -1,6 +1,10 @@ 'use strict'; -const { Object, SafeMap, SafeSet } = primordials; +const { + ObjectKeys, + SafeMap, + SafeSet, +} = primordials; const { trace } = internalBinding('trace_events'); const async_wrap = internalBinding('async_wrap'); @@ -20,7 +24,7 @@ const kEnabled = Symbol('enabled'); // Embedder C++ API can't be emitted from async_wrap.cc. Thus they are // emitted using the JavaScript API. To prevent emitting the same event // twice the async_wrap.Providers list is used to filter the events. -const nativeProviders = new SafeSet(Object.keys(async_wrap.Providers)); +const nativeProviders = new SafeSet(ObjectKeys(async_wrap.Providers)); const typeMemory = new SafeMap(); function createHook() { diff --git a/lib/internal/url.js b/lib/internal/url.js index 860fa4d7ad..b4c047be52 100644 --- a/lib/internal/url.js +++ b/lib/internal/url.js @@ -1,6 +1,15 @@ 'use strict'; -const { Object, Reflect } = primordials; +const { + ObjectCreate, + ObjectDefineProperties, + ObjectDefineProperty, + ObjectGetOwnPropertySymbols, + ObjectGetPrototypeOf, + ObjectKeys, + ReflectGetOwnPropertyDescriptor, + ReflectOwnKeys, +} = primordials; const { inspect } = require('internal/util/inspect'); const { @@ -74,8 +83,8 @@ const searchParams = Symbol('query'); const kFormat = Symbol('format'); // https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object -const IteratorPrototype = Object.getPrototypeOf( - Object.getPrototypeOf([][Symbol.iterator]()) +const IteratorPrototype = ObjectGetPrototypeOf( + ObjectGetPrototypeOf([][Symbol.iterator]()) ); const unpairedSurrogateRe = @@ -164,10 +173,10 @@ class URLSearchParams { // Record // Need to use reflection APIs for full spec compliance. this[searchParams] = []; - const keys = Reflect.ownKeys(init); + const keys = ReflectOwnKeys(init); for (let i = 0; i < keys.length; i++) { const key = keys[i]; - const desc = Reflect.getOwnPropertyDescriptor(init, key); + const desc = ReflectGetOwnPropertyDescriptor(init, key); if (desc !== undefined && desc.enumerable) { const typedKey = toUSVString(key); const typedValue = toUSVString(init[key]); @@ -338,7 +347,7 @@ class URL { [inspect.custom](depth, opts) { if (this == null || - Object.getPrototypeOf(this[context]) !== URLContext.prototype) { + ObjectGetPrototypeOf(this[context]) !== URLContext.prototype) { throw new ERR_INVALID_THIS('URL'); } @@ -347,7 +356,7 @@ class URL { const ctor = getConstructorOf(this); - const obj = Object.create({ + const obj = ObjectCreate({ constructor: ctor === null ? URL : ctor }); @@ -374,7 +383,7 @@ class URL { } } -Object.defineProperties(URL.prototype, { +ObjectDefineProperties(URL.prototype, { [kFormat]: { enumerable: false, configurable: false, @@ -846,7 +855,7 @@ function serializeParams(array) { // Mainly to mitigate func-name-matching ESLint rule function defineIDLClass(proto, classStr, obj) { // https://heycam.github.io/webidl/#dfn-class-string - Object.defineProperty(proto, Symbol.toStringTag, { + ObjectDefineProperty(proto, Symbol.toStringTag, { writable: false, enumerable: false, configurable: true, @@ -854,16 +863,16 @@ function defineIDLClass(proto, classStr, obj) { }); // https://heycam.github.io/webidl/#es-operations - for (const key of Object.keys(obj)) { - Object.defineProperty(proto, key, { + for (const key of ObjectKeys(obj)) { + ObjectDefineProperty(proto, key, { writable: true, enumerable: true, configurable: true, value: obj[key] }); } - for (const key of Object.getOwnPropertySymbols(obj)) { - Object.defineProperty(proto, key, { + for (const key of ObjectGetOwnPropertySymbols(obj)) { + ObjectDefineProperty(proto, key, { writable: true, enumerable: false, configurable: true, @@ -1137,7 +1146,7 @@ defineIDLClass(URLSearchParams.prototype, 'URLSearchParams', { }); // https://heycam.github.io/webidl/#es-iterable-entries -Object.defineProperty(URLSearchParams.prototype, Symbol.iterator, { +ObjectDefineProperty(URLSearchParams.prototype, Symbol.iterator, { writable: true, configurable: true, value: URLSearchParams.prototype.entries @@ -1145,7 +1154,7 @@ Object.defineProperty(URLSearchParams.prototype, Symbol.iterator, { // https://heycam.github.io/webidl/#dfn-default-iterator-object function createSearchParamsIterator(target, kind) { - const iterator = Object.create(URLSearchParamsIteratorPrototype); + const iterator = ObjectCreate(URLSearchParamsIteratorPrototype); iterator[context] = { target, kind, @@ -1155,12 +1164,12 @@ function createSearchParamsIterator(target, kind) { } // https://heycam.github.io/webidl/#dfn-iterator-prototype-object -const URLSearchParamsIteratorPrototype = Object.create(IteratorPrototype); +const URLSearchParamsIteratorPrototype = ObjectCreate(IteratorPrototype); defineIDLClass(URLSearchParamsIteratorPrototype, 'URLSearchParams Iterator', { next() { if (!this || - Object.getPrototypeOf(this) !== URLSearchParamsIteratorPrototype) { + ObjectGetPrototypeOf(this) !== URLSearchParamsIteratorPrototype) { throw new ERR_INVALID_THIS('URLSearchParamsIterator'); } @@ -1402,7 +1411,7 @@ function constructUrl(flags, protocol, username, password, ctx.fragment = fragment; ctx.host = host; - const url = Object.create(URL.prototype); + const url = ObjectCreate(URL.prototype); url[context] = ctx; const params = new URLSearchParams(); url[searchParams] = params; diff --git a/lib/internal/util.js b/lib/internal/util.js index 58502f3b7a..b7609becef 100644 --- a/lib/internal/util.js +++ b/lib/internal/util.js @@ -1,6 +1,15 @@ 'use strict'; -const { Object, Reflect } = primordials; +const { + ObjectCreate, + ObjectDefineProperties, + ObjectDefineProperty, + ObjectGetOwnPropertyDescriptor, + ObjectGetOwnPropertyDescriptors, + ObjectGetPrototypeOf, + ObjectSetPrototypeOf, + ReflectConstruct, +} = primordials; const { codes: { ERR_INVALID_ARG_TYPE, @@ -65,13 +74,13 @@ function deprecate(fn, msg, code) { } } if (new.target) { - return Reflect.construct(fn, args, new.target); + return ReflectConstruct(fn, args, new.target); } return fn.apply(this, args); } // The wrapper will keep the same prototype as fn to maintain prototype chain - Object.setPrototypeOf(deprecated, fn); + ObjectSetPrototypeOf(deprecated, fn); if (fn.prototype) { // Setting this (rather than using Object.setPrototype, as above) ensures // that calling the unwrapped constructor gives an instanceof the wrapped @@ -195,14 +204,14 @@ function cachedResult(fn) { // B() instanceof B // true function createClassWrapper(type) { function fn(...args) { - return Reflect.construct(type, args, new.target || type); + return ReflectConstruct(type, args, new.target || type); } // Mask the wrapper function name and length values - Object.defineProperties(fn, { + ObjectDefineProperties(fn, { name: { value: type.name }, length: { value: type.length } }); - Object.setPrototypeOf(fn, type); + ObjectSetPrototypeOf(fn, type); fn.prototype = type.prototype; return fn; } @@ -212,7 +221,7 @@ function getSignalsToNamesMapping() { if (signalsToNamesMapping !== undefined) return signalsToNamesMapping; - signalsToNamesMapping = Object.create(null); + signalsToNamesMapping = ObjectCreate(null); for (const key in signals) { signalsToNamesMapping[signals[key]] = key; } @@ -234,14 +243,14 @@ function convertToValidSignal(signal) { function getConstructorOf(obj) { while (obj) { - const descriptor = Object.getOwnPropertyDescriptor(obj, 'constructor'); + const descriptor = ObjectGetOwnPropertyDescriptor(obj, 'constructor'); if (descriptor !== undefined && typeof descriptor.value === 'function' && descriptor.value.name !== '') { return descriptor.value; } - obj = Object.getPrototypeOf(obj); + obj = ObjectGetPrototypeOf(obj); } return null; @@ -264,7 +273,7 @@ function promisify(original) { if (typeof fn !== 'function') { throw new ERR_INVALID_ARG_TYPE('util.promisify.custom', 'Function', fn); } - return Object.defineProperty(fn, kCustomPromisifiedSymbol, { + return ObjectDefineProperty(fn, kCustomPromisifiedSymbol, { value: fn, enumerable: false, writable: false, configurable: true }); } @@ -291,14 +300,14 @@ function promisify(original) { }); } - Object.setPrototypeOf(fn, Object.getPrototypeOf(original)); + ObjectSetPrototypeOf(fn, ObjectGetPrototypeOf(original)); - Object.defineProperty(fn, kCustomPromisifiedSymbol, { + ObjectDefineProperty(fn, kCustomPromisifiedSymbol, { value: fn, enumerable: false, writable: false, configurable: true }); - return Object.defineProperties( + return ObjectDefineProperties( fn, - Object.getOwnPropertyDescriptors(original) + ObjectGetOwnPropertyDescriptors(original) ); } diff --git a/lib/internal/util/comparisons.js b/lib/internal/util/comparisons.js index 52cd11429e..3af44f9bf5 100644 --- a/lib/internal/util/comparisons.js +++ b/lib/internal/util/comparisons.js @@ -1,19 +1,20 @@ 'use strict'; const { - BigIntPrototype, - BooleanPrototype, - DatePrototype, - Number, - NumberPrototype, - Object, - ObjectPrototype: { - hasOwnProperty, - propertyIsEnumerable, - toString: objectToString - }, - StringPrototype, - SymbolPrototype + BigIntPrototypeValueOf, + BooleanPrototypeValueOf, + DatePrototypeGetTime, + NumberIsNaN, + NumberPrototypeValueOf, + ObjectGetOwnPropertySymbols, + ObjectGetPrototypeOf, + ObjectIs, + ObjectKeys, + ObjectPrototypeHasOwnProperty, + ObjectPrototypePropertyIsEnumerable, + ObjectPrototypeToString, + StringPrototypeValueOf, + SymbolPrototypeValueOf, } = primordials; const { compare } = internalBinding('buffer'); @@ -83,24 +84,24 @@ function areEqualArrayBuffers(buf1, buf2) { function isEqualBoxedPrimitive(val1, val2) { if (isNumberObject(val1)) { return isNumberObject(val2) && - Object.is(NumberPrototype.valueOf(val1), - NumberPrototype.valueOf(val2)); + ObjectIs(NumberPrototypeValueOf(val1), + NumberPrototypeValueOf(val2)); } if (isStringObject(val1)) { return isStringObject(val2) && - StringPrototype.valueOf(val1) === StringPrototype.valueOf(val2); + StringPrototypeValueOf(val1) === StringPrototypeValueOf(val2); } if (isBooleanObject(val1)) { return isBooleanObject(val2) && - BooleanPrototype.valueOf(val1) === BooleanPrototype.valueOf(val2); + BooleanPrototypeValueOf(val1) === BooleanPrototypeValueOf(val2); } if (isBigIntObject(val1)) { return isBigIntObject(val2) && - BigIntPrototype.valueOf(val1) === BigIntPrototype.valueOf(val2); + BigIntPrototypeValueOf(val1) === BigIntPrototypeValueOf(val2); } if (isSymbolObject(val1)) { return isSymbolObject(val2) && - SymbolPrototype.valueOf(val1) === SymbolPrototype.valueOf(val2); + SymbolPrototypeValueOf(val1) === SymbolPrototypeValueOf(val2); } return false; } @@ -129,19 +130,19 @@ function innerDeepEqual(val1, val2, strict, memos) { if (val1 === val2) { if (val1 !== 0) return true; - return strict ? Object.is(val1, val2) : true; + return strict ? ObjectIs(val1, val2) : true; } // Check more closely if val1 and val2 are equal. if (strict) { if (typeof val1 !== 'object') { - return typeof val1 === 'number' && Number.isNaN(val1) && - Number.isNaN(val2); + return typeof val1 === 'number' && NumberIsNaN(val1) && + NumberIsNaN(val2); } if (typeof val2 !== 'object' || val1 === null || val2 === null) { return false; } - if (Object.getPrototypeOf(val1) !== Object.getPrototypeOf(val2)) { + if (ObjectGetPrototypeOf(val1) !== ObjectGetPrototypeOf(val2)) { return false; } } else { @@ -156,8 +157,8 @@ function innerDeepEqual(val1, val2, strict, memos) { return false; } } - const val1Tag = objectToString(val1); - const val2Tag = objectToString(val2); + const val1Tag = ObjectPrototypeToString(val1); + const val2Tag = ObjectPrototypeToString(val2); if (val1Tag !== val2Tag) { return false; @@ -179,7 +180,7 @@ function innerDeepEqual(val1, val2, strict, memos) { return keyCheck(val1, val2, strict, memos, kNoIterator); } if (isDate(val1)) { - if (DatePrototype.getTime(val1) !== DatePrototype.getTime(val2)) { + if (DatePrototypeGetTime(val1) !== DatePrototypeGetTime(val2)) { return false; } } else if (isRegExp(val1)) { @@ -233,7 +234,7 @@ function innerDeepEqual(val1, val2, strict, memos) { } function getEnumerables(val, keys) { - return keys.filter((k) => propertyIsEnumerable(val, k)); + return keys.filter((k) => ObjectPrototypePropertyIsEnumerable(val, k)); } function keyCheck(val1, val2, strict, memos, iterationType, aKeys) { @@ -245,8 +246,8 @@ function keyCheck(val1, val2, strict, memos, iterationType, aKeys) { // d) For Sets and Maps, equal contents // Note: this accounts for both named and indexed properties on Arrays. if (arguments.length === 5) { - aKeys = Object.keys(val1); - const bKeys = Object.keys(val2); + aKeys = ObjectKeys(val1); + const bKeys = ObjectKeys(val2); // The pair must have the same number of owned properties. if (aKeys.length !== bKeys.length) { @@ -257,34 +258,34 @@ function keyCheck(val1, val2, strict, memos, iterationType, aKeys) { // Cheap key test let i = 0; for (; i < aKeys.length; i++) { - if (!hasOwnProperty(val2, aKeys[i])) { + if (!ObjectPrototypeHasOwnProperty(val2, aKeys[i])) { return false; } } if (strict && arguments.length === 5) { - const symbolKeysA = Object.getOwnPropertySymbols(val1); + const symbolKeysA = ObjectGetOwnPropertySymbols(val1); if (symbolKeysA.length !== 0) { let count = 0; for (i = 0; i < symbolKeysA.length; i++) { const key = symbolKeysA[i]; - if (propertyIsEnumerable(val1, key)) { - if (!propertyIsEnumerable(val2, key)) { + if (ObjectPrototypePropertyIsEnumerable(val1, key)) { + if (!ObjectPrototypePropertyIsEnumerable(val2, key)) { return false; } aKeys.push(key); count++; - } else if (propertyIsEnumerable(val2, key)) { + } else if (ObjectPrototypePropertyIsEnumerable(val2, key)) { return false; } } - const symbolKeysB = Object.getOwnPropertySymbols(val2); + const symbolKeysB = ObjectGetOwnPropertySymbols(val2); if (symbolKeysA.length !== symbolKeysB.length && getEnumerables(val2, symbolKeysB).length !== count) { return false; } } else { - const symbolKeysB = Object.getOwnPropertySymbols(val2); + const symbolKeysB = ObjectGetOwnPropertySymbols(val2); if (symbolKeysB.length !== 0 && getEnumerables(val2, symbolKeysB).length !== 0) { return false; @@ -362,7 +363,7 @@ function findLooseMatchingPrimitives(prim) { // a regular number and not NaN. // Fall through case 'number': - if (Number.isNaN(prim)) { + if (NumberIsNaN(prim)) { return false; } } @@ -519,24 +520,24 @@ function objEquiv(a, b, strict, keys, memos, iterationType) { } } else if (iterationType === kIsArray) { for (; i < a.length; i++) { - if (hasOwnProperty(a, i)) { - if (!hasOwnProperty(b, i) || + if (ObjectPrototypeHasOwnProperty(a, i)) { + if (!ObjectPrototypeHasOwnProperty(b, i) || !innerDeepEqual(a[i], b[i], strict, memos)) { return false; } - } else if (hasOwnProperty(b, i)) { + } else if (ObjectPrototypeHasOwnProperty(b, i)) { return false; } else { // Array is sparse. - const keysA = Object.keys(a); + const keysA = ObjectKeys(a); for (; i < keysA.length; i++) { const key = keysA[i]; - if (!hasOwnProperty(b, key) || + if (!ObjectPrototypeHasOwnProperty(b, key) || !innerDeepEqual(a[key], b[key], strict, memos)) { return false; } } - if (keysA.length !== Object.keys(b).length) { + if (keysA.length !== ObjectKeys(b).length) { return false; } return true; diff --git a/lib/internal/util/inspect.js b/lib/internal/util/inspect.js index cc7f23f321..3e93a41795 100644 --- a/lib/internal/util/inspect.js +++ b/lib/internal/util/inspect.js @@ -1,23 +1,42 @@ 'use strict'; const { - BigIntPrototype, - BooleanPrototype, - DatePrototype, - ErrorPrototype, - JSON, - MapPrototype, - Math, - NumberPrototype, - Object, - ObjectPrototype: { - hasOwnProperty, - propertyIsEnumerable - }, - RegExpPrototype, - SetPrototype, - StringPrototype, - SymbolPrototype, + ArrayIsArray, + BigIntPrototypeValueOf, + BooleanPrototypeValueOf, + DatePrototypeGetTime, + DatePrototypeToISOString, + DatePrototypeToString, + ErrorPrototypeToString, + JSONStringify, + MapPrototypeEntries, + MathFloor, + MathMax, + MathMin, + MathRound, + MathSqrt, + NumberPrototypeValueOf, + ObjectAssign, + ObjectCreate, + ObjectDefineProperties, + ObjectDefineProperty, + ObjectGetOwnPropertyDescriptor, + ObjectGetOwnPropertyDescriptors, + ObjectGetOwnPropertyNames, + ObjectGetOwnPropertySymbols, + ObjectGetPrototypeOf, + ObjectIs, + ObjectKeys, + ObjectPrototypeHasOwnProperty, + ObjectPrototypePropertyIsEnumerable, + ObjectSeal, + RegExpPrototypeToString, + SetPrototypeValues, + StringPrototypeValueOf, + SymbolPrototypeToString, + SymbolPrototypeValueOf, + SymbolIterator, + SymbolToStringTag, uncurryThis } = primordials; @@ -94,10 +113,10 @@ const { NativeModule } = require('internal/bootstrap/loaders'); let hexSlice; const builtInObjects = new Set( - Object.getOwnPropertyNames(global).filter((e) => /^([A-Z][a-z]+)+$/.test(e)) + ObjectGetOwnPropertyNames(global).filter((e) => /^([A-Z][a-z]+)+$/.test(e)) ); -const inspectDefaultOptions = Object.seal({ +const inspectDefaultOptions = ObjectSeal({ showHidden: false, depth: 2, colors: false, @@ -155,7 +174,7 @@ const meta = [ function getUserOptions(ctx) { const obj = { stylize: ctx.stylize }; - for (const key of Object.keys(inspectDefaultOptions)) { + for (const key of ObjectKeys(inspectDefaultOptions)) { obj[key] = ctx[key]; } if (ctx.userOptions === undefined) @@ -204,12 +223,14 @@ function inspect(value, opts) { if (typeof opts === 'boolean') { ctx.showHidden = opts; } else if (opts) { - const optKeys = Object.keys(opts); + const optKeys = ObjectKeys(opts); for (const key of optKeys) { // TODO(BridgeAR): Find a solution what to do about stylize. Either make // this function public or add a new API with a similar or better // functionality. - if (hasOwnProperty(inspectDefaultOptions, key) || key === 'stylize') { + if ( + ObjectPrototypeHasOwnProperty(inspectDefaultOptions, key) || + key === 'stylize') { ctx[key] = opts[key]; } else if (ctx.userOptions === undefined) { // This is required to pass through the actual user input. @@ -224,7 +245,7 @@ function inspect(value, opts) { } inspect.custom = customInspectSymbol; -Object.defineProperty(inspect, 'defaultOptions', { +ObjectDefineProperty(inspect, 'defaultOptions', { get() { return inspectDefaultOptions; }, @@ -232,12 +253,12 @@ Object.defineProperty(inspect, 'defaultOptions', { if (options === null || typeof options !== 'object') { throw new ERR_INVALID_ARG_TYPE('options', 'Object', options); } - return Object.assign(inspectDefaultOptions, options); + return ObjectAssign(inspectDefaultOptions, options); } }); // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics -inspect.colors = Object.assign(Object.create(null), { +inspect.colors = ObjectAssign(ObjectCreate(null), { bold: [1, 22], italic: [3, 23], underline: [4, 24], @@ -254,7 +275,7 @@ inspect.colors = Object.assign(Object.create(null), { }); // Don't use 'blue' not visible on cmd.exe -inspect.styles = Object.assign(Object.create(null), { +inspect.styles = ObjectAssign(ObjectCreate(null), { special: 'cyan', number: 'yellow', bigint: 'yellow', @@ -360,14 +381,14 @@ function getConstructorName(obj, ctx, recurseTimes) { let firstProto; const tmp = obj; while (obj) { - const descriptor = Object.getOwnPropertyDescriptor(obj, 'constructor'); + const descriptor = ObjectGetOwnPropertyDescriptor(obj, 'constructor'); if (descriptor !== undefined && typeof descriptor.value === 'function' && descriptor.value.name !== '') { return descriptor.value.name; } - obj = Object.getPrototypeOf(obj); + obj = ObjectGetPrototypeOf(obj); if (firstProto === undefined) { firstProto = obj; } @@ -413,9 +434,9 @@ function getPrefix(constructor, tag, fallback) { // Look up the keys of the object. function getKeys(value, showHidden) { let keys; - const symbols = Object.getOwnPropertySymbols(value); + const symbols = ObjectGetOwnPropertySymbols(value); if (showHidden) { - keys = Object.getOwnPropertyNames(value); + keys = ObjectGetOwnPropertyNames(value); if (symbols.length !== 0) keys.push(...symbols); } else { @@ -425,14 +446,15 @@ function getKeys(value, showHidden) { // TODO(devsnek): track https://github.com/tc39/ecma262/issues/1209 // and modify this logic as needed. try { - keys = Object.keys(value); + keys = ObjectKeys(value); } catch (err) { assert(isNativeError(err) && err.name === 'ReferenceError' && isModuleNamespaceObject(value)); - keys = Object.getOwnPropertyNames(value); + keys = ObjectGetOwnPropertyNames(value); } if (symbols.length !== 0) { - keys.push(...symbols.filter((key) => propertyIsEnumerable(value, key))); + const filter = (key) => ObjectPrototypePropertyIsEnumerable(value, key); + keys.push(...symbols.filter(filter)); } } return keys; @@ -497,12 +519,12 @@ function clazzWithNullPrototype(clazz, name) { } } class NullPrototype extends clazz { - get [Symbol.toStringTag]() { + get [SymbolToStringTag]() { return ''; } } - Object.defineProperty(NullPrototype.prototype.constructor, 'name', - { value: `[${name}: null prototype]` }); + ObjectDefineProperty(NullPrototype.prototype.constructor, 'name', + { value: `[${name}: null prototype]` }); lazyNullPrototypeCache.set(clazz, NullPrototype); return NullPrototype; } @@ -511,11 +533,11 @@ function noPrototypeIterator(ctx, value, recurseTimes) { let newVal; if (isSet(value)) { const clazz = clazzWithNullPrototype(Set, 'Set'); - newVal = new clazz(SetPrototype.values(value)); + newVal = new clazz(SetPrototypeValues(value)); } else if (isMap(value)) { const clazz = clazzWithNullPrototype(Map, 'Map'); - newVal = new clazz(MapPrototype.entries(value)); - } else if (Array.isArray(value)) { + newVal = new clazz(MapPrototypeEntries(value)); + } else if (ArrayIsArray(value)) { const clazz = clazzWithNullPrototype(Array, 'Array'); newVal = new clazz(value.length); } else if (isTypedArray(value)) { @@ -524,7 +546,7 @@ function noPrototypeIterator(ctx, value, recurseTimes) { newVal = new clazz(value); } if (newVal !== undefined) { - Object.defineProperties(newVal, Object.getOwnPropertyDescriptors(value)); + ObjectDefineProperties(newVal, ObjectGetOwnPropertyDescriptors(value)); return formatRaw(ctx, newVal, recurseTimes); } } @@ -600,13 +622,15 @@ function formatRaw(ctx, value, recurseTimes, typedArray) { let keys; const constructor = getConstructorName(value, ctx, recurseTimes); - let tag = value[Symbol.toStringTag]; + let tag = value[SymbolToStringTag]; // Only list the tag in case it's non-enumerable / not an own property. // Otherwise we'd print this twice. if (typeof tag !== 'string' || (tag !== '' && - (ctx.showHidden ? hasOwnProperty : propertyIsEnumerable)( - value, Symbol.toStringTag + (ctx.showHidden ? + ObjectPrototypeHasOwnProperty : + ObjectPrototypePropertyIsEnumerable)( + value, SymbolToStringTag ))) { tag = ''; } @@ -620,9 +644,9 @@ function formatRaw(ctx, value, recurseTimes, typedArray) { let extrasType = kObjectType; // Iterators and the rest are split to reduce checks. - if (value[Symbol.iterator]) { + if (value[SymbolIterator]) { noIterator = false; - if (Array.isArray(value)) { + if (ArrayIsArray(value)) { keys = getOwnNonIndexProperties(value, filter); // Only set the constructor for non ordinary ("Array [...]") arrays. const prefix = getPrefix(constructor, tag, 'Array'); @@ -685,7 +709,7 @@ function formatRaw(ctx, value, recurseTimes, typedArray) { return ctx.stylize(base, 'special'); } else if (isRegExp(value)) { // Make RegExps say that they are RegExps - base = RegExpPrototype.toString( + base = RegExpPrototypeToString( constructor !== null ? value : new RegExp(value) ); const prefix = getPrefix(constructor, tag, 'RegExp'); @@ -695,9 +719,9 @@ function formatRaw(ctx, value, recurseTimes, typedArray) { return ctx.stylize(base, 'regexp'); } else if (isDate(value)) { // Make dates with properties first say the date - base = Number.isNaN(DatePrototype.getTime(value)) ? - DatePrototype.toString(value) : - DatePrototype.toISOString(value); + base = Number.isNaN(DatePrototypeGetTime(value)) ? + DatePrototypeToString(value) : + DatePrototypeToISOString(value); const prefix = getPrefix(constructor, tag, 'Date'); if (prefix !== 'Date ') base = `${prefix}${base}`; @@ -848,23 +872,23 @@ function getBoxedBase(value, ctx, keys, constructor, tag) { let fn; let type; if (isNumberObject(value)) { - fn = NumberPrototype; + fn = NumberPrototypeValueOf; type = 'Number'; } else if (isStringObject(value)) { - fn = StringPrototype; + fn = StringPrototypeValueOf; type = 'String'; // For boxed Strings, we have to remove the 0-n indexed entries, // since they just noisy up the output and are redundant // Make boxed primitive Strings look like such keys.splice(0, value.length); } else if (isBooleanObject(value)) { - fn = BooleanPrototype; + fn = BooleanPrototypeValueOf; type = 'Boolean'; } else if (isBigIntObject(value)) { - fn = BigIntPrototype; + fn = BigIntPrototypeValueOf; type = 'BigInt'; } else { - fn = SymbolPrototype; + fn = SymbolPrototypeValueOf; type = 'Symbol'; } let base = `[${type}`; @@ -875,7 +899,7 @@ function getBoxedBase(value, ctx, keys, constructor, tag) { base += ` (${constructor})`; } } - base += `: ${formatPrimitive(stylizeNoColor, fn.valueOf(value), ctx)}]`; + base += `: ${formatPrimitive(stylizeNoColor, fn(value), ctx)}]`; if (tag !== '' && tag !== constructor) { base += ` [${tag}]`; } @@ -912,7 +936,7 @@ function getFunctionBase(value, constructor, tag) { } function formatError(err, constructor, tag, ctx) { - let stack = err.stack || ErrorPrototype.toString(err); + let stack = err.stack || ErrorPrototypeToString(err); // A stack trace may contain arbitrary data. Only manipulate the output // for "regular errors" (errors that "look normal") for now. @@ -1015,22 +1039,22 @@ function groupArrayElements(ctx, output, value) { (totalLength / actualMax > 5 || maxLength <= 6)) { const approxCharHeights = 2.5; - const averageBias = Math.sqrt(actualMax - totalLength / output.length); - const biasedMax = Math.max(actualMax - 3 - averageBias, 1); + const averageBias = MathSqrt(actualMax - totalLength / output.length); + const biasedMax = MathMax(actualMax - 3 - averageBias, 1); // Dynamically check how many columns seem possible. - const columns = Math.min( + const columns = MathMin( // Ideally a square should be drawn. We expect a character to be about 2.5 // times as high as wide. This is the area formula to calculate a square // which contains n rectangles of size `actualMax * approxCharHeights`. // Divide that by `actualMax` to receive the correct number of columns. // The added bias increases the columns for short entries. - Math.round( - Math.sqrt( + MathRound( + MathSqrt( approxCharHeights * biasedMax * outputLength ) / biasedMax ), // Do not exceed the breakLength. - Math.floor((ctx.breakLength - ctx.indentationLvl) / actualMax), + MathFloor((ctx.breakLength - ctx.indentationLvl) / actualMax), // Limit array grouping for small `compact` modes as the user requested // minimal grouping. ctx.compact * 4, @@ -1064,7 +1088,7 @@ function groupArrayElements(ctx, output, value) { // Each iteration creates a single line of grouped entries. for (let i = 0; i < outputLength; i += columns) { // The last lines may contain less entries than columns. - const max = Math.min(i + columns, outputLength); + const max = MathMin(i + columns, outputLength); let str = ''; let j = i; for (; j < max - 1; j++) { @@ -1108,7 +1132,7 @@ function handleMaxCallStackSize(ctx, err, constructorName, indentationLvl) { function formatNumber(fn, value) { // Format -0 as '-0'. Checking `value === -0` won't distinguish 0 from -0. - return fn(Object.is(value, -0) ? '-0' : `${value}`, 'number'); + return fn(ObjectIs(value, -0) ? '-0' : `${value}`, 'number'); } function formatBigInt(fn, value) { @@ -1136,7 +1160,7 @@ function formatPrimitive(fn, value, ctx) { if (typeof value === 'undefined') return fn('undefined', 'undefined'); // es6 symbol primitive - return fn(SymbolPrototype.toString(value), 'symbol'); + return fn(SymbolPrototypeToString(value), 'symbol'); } function formatNamespaceObject(ctx, value, recurseTimes, keys) { @@ -1168,7 +1192,7 @@ function formatNamespaceObject(ctx, value, recurseTimes, keys) { // The array is sparse and/or has extra keys function formatSpecialArray(ctx, value, recurseTimes, maxLength, output, i) { - const keys = Object.keys(value); + const keys = ObjectKeys(value); let index = i; for (; i < keys.length && output.length < maxLength; i++) { const key = keys[i]; @@ -1215,7 +1239,7 @@ function formatArrayBuffer(ctx, value) { } if (hexSlice === undefined) hexSlice = uncurryThis(require('buffer').Buffer.prototype.hexSlice); - let str = hexSlice(buffer, 0, Math.min(ctx.maxArrayLength, buffer.length)) + let str = hexSlice(buffer, 0, MathMin(ctx.maxArrayLength, buffer.length)) .replace(/(.{2})/g, '$1 ').trim(); const remaining = buffer.length - ctx.maxArrayLength; if (remaining > 0) @@ -1225,13 +1249,13 @@ function formatArrayBuffer(ctx, value) { function formatArray(ctx, value, recurseTimes) { const valLen = value.length; - const len = Math.min(Math.max(0, ctx.maxArrayLength), valLen); + const len = MathMin(MathMax(0, ctx.maxArrayLength), valLen); const remaining = valLen - len; const output = []; for (var i = 0; i < len; i++) { // Special handle sparse arrays. - if (!hasOwnProperty(value, i)) { + if (!ObjectPrototypeHasOwnProperty(value, i)) { return formatSpecialArray(ctx, value, recurseTimes, len, output, i); } output.push(formatProperty(ctx, value, recurseTimes, i, kArrayType)); @@ -1242,7 +1266,7 @@ function formatArray(ctx, value, recurseTimes) { } function formatTypedArray(ctx, value, recurseTimes) { - const maxLength = Math.min(Math.max(0, ctx.maxArrayLength), value.length); + const maxLength = MathMin(MathMax(0, ctx.maxArrayLength), value.length); const remaining = value.length - maxLength; const output = new Array(maxLength); const elementFormatter = value.length > 0 && typeof value[0] === 'number' ? @@ -1280,7 +1304,7 @@ function formatSet(ctx, value, recurseTimes) { ctx.indentationLvl -= 2; // With `showHidden`, `length` will display as a hidden property for // arrays. For consistency's sake, do the same for `size`, even though this - // property isn't selected by Object.getOwnPropertyNames(). + // property isn't selected by ObjectGetOwnPropertyNames(). if (ctx.showHidden) output.push(`[size]: ${ctx.stylize(`${value.size}`, 'number')}`); return output; @@ -1301,8 +1325,8 @@ function formatMap(ctx, value, recurseTimes) { } function formatSetIterInner(ctx, recurseTimes, entries, state) { - const maxArrayLength = Math.max(ctx.maxArrayLength, 0); - const maxLength = Math.min(maxArrayLength, entries.length); + const maxArrayLength = MathMax(ctx.maxArrayLength, 0); + const maxLength = MathMin(maxArrayLength, entries.length); let output = new Array(maxLength); ctx.indentationLvl += 2; for (var i = 0; i < maxLength; i++) { @@ -1323,11 +1347,11 @@ function formatSetIterInner(ctx, recurseTimes, entries, state) { } function formatMapIterInner(ctx, recurseTimes, entries, state) { - const maxArrayLength = Math.max(ctx.maxArrayLength, 0); + const maxArrayLength = MathMax(ctx.maxArrayLength, 0); // Entries exist as [key1, val1, key2, val2, ...] const len = entries.length / 2; const remaining = len - maxArrayLength; - const maxLength = Math.min(maxArrayLength, len); + const maxLength = MathMin(maxArrayLength, len); let output = new Array(maxLength); let i = 0; ctx.indentationLvl += 2; @@ -1406,7 +1430,7 @@ function formatPromise(ctx, value, recurseTimes) { function formatProperty(ctx, value, recurseTimes, key, type) { let name, str; let extra = ' '; - const desc = Object.getOwnPropertyDescriptor(value, key) || + const desc = ObjectGetOwnPropertyDescriptor(value, key) || { value: value[key], enumerable: true }; if (desc.value !== undefined) { const diff = (type !== kObjectType || ctx.compact !== true) ? 2 : 3; @@ -1551,12 +1575,12 @@ const firstErrorLine = (error) => error.message.split('\n')[0]; let CIRCULAR_ERROR_MESSAGE; function tryStringify(arg) { try { - return JSON.stringify(arg); + return JSONStringify(arg); } catch (err) { // Populate the circular error message lazily if (!CIRCULAR_ERROR_MESSAGE) { try { - const a = {}; a.a = a; JSON.stringify(a); + const a = {}; a.a = a; JSONStringify(a); } catch (err) { CIRCULAR_ERROR_MESSAGE = firstErrorLine(err); } @@ -1611,13 +1635,14 @@ function formatWithOptionsInternal(inspectOptions, ...args) { tempArg === null || (typeof tempArg.toString === 'function' && // A direct own property. - (hasOwnProperty(tempArg, 'toString') || + (ObjectPrototypeHasOwnProperty(tempArg, 'toString') || // A direct own property on the constructor prototype in // case the constructor is not an built-in object. ((constr = tempArg.constructor) && !builtInObjects.has(constr.name) && constr.prototype && - hasOwnProperty(constr.prototype, 'toString'))))) { + ObjectPrototypeHasOwnProperty(constr.prototype, + 'toString'))))) { tempStr = String(tempArg); } else { tempStr = inspect(tempArg, { diff --git a/lib/internal/util/inspector.js b/lib/internal/util/inspector.js index 5230137fce..5f11eff21a 100644 --- a/lib/internal/util/inspector.js +++ b/lib/internal/util/inspector.js @@ -1,6 +1,8 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectKeys, +} = primordials; let session; function sendInspectorCommand(cb, onError) { @@ -36,7 +38,7 @@ function installConsoleExtensions(commandLineApi) { // Wrap a console implemented by Node.js with features from the VM inspector function wrapConsole(consoleFromNode, consoleFromVM) { const { consoleCall } = internalBinding('inspector'); - for (const key of Object.keys(consoleFromVM)) { + for (const key of ObjectKeys(consoleFromVM)) { // If global console has the same method as inspector console, // then wrap these two methods into one. Native wrapper will preserve // the original stack. diff --git a/lib/internal/util/types.js b/lib/internal/util/types.js index 3f05ad06ac..676f386a24 100644 --- a/lib/internal/util/types.js +++ b/lib/internal/util/types.js @@ -1,16 +1,19 @@ 'use strict'; -const { Object, uncurryThis } = primordials; +const { + ArrayBufferIsView, + ObjectGetOwnPropertyDescriptor, + ObjectGetPrototypeOf, + SymbolToStringTag, + uncurryThis, +} = primordials; -const TypedArrayPrototype = Object.getPrototypeOf(Uint8Array.prototype); +const TypedArrayPrototype = ObjectGetPrototypeOf(Uint8Array.prototype); const TypedArrayProto_toStringTag = uncurryThis( - Object.getOwnPropertyDescriptor(TypedArrayPrototype, - Symbol.toStringTag).get); - -// Cached to make sure no userland code can tamper with it. -const isArrayBufferView = ArrayBuffer.isView; + ObjectGetOwnPropertyDescriptor(TypedArrayPrototype, + SymbolToStringTag).get); function isTypedArray(value) { return TypedArrayProto_toStringTag(value) !== undefined; @@ -62,7 +65,7 @@ function isBigUint64Array(value) { module.exports = { ...internalBinding('types'), - isArrayBufferView, + isArrayBufferView: ArrayBufferIsView, isTypedArray, isUint8Array, isUint8ClampedArray, diff --git a/lib/internal/v8_prof_processor.js b/lib/internal/v8_prof_processor.js index 7a942d3225..d647d4749f 100644 --- a/lib/internal/v8_prof_processor.js +++ b/lib/internal/v8_prof_processor.js @@ -1,6 +1,8 @@ 'use strict'; -const { JSON } = primordials; +const { + JSONStringify, +} = primordials; const vm = require('vm'); @@ -32,7 +34,7 @@ if (process.platform === 'darwin') { } tickArguments.push.apply(tickArguments, process.argv.slice(1)); script = `(function(module, require) { - arguments = ${JSON.stringify(tickArguments)}; + arguments = ${JSONStringify(tickArguments)}; function write (s) { process.stdout.write(s) } function printErr(err) { console.error(err); } ${script} diff --git a/lib/internal/vm/module.js b/lib/internal/vm/module.js index 169313c8dd..c97556ceb8 100644 --- a/lib/internal/vm/module.js +++ b/lib/internal/vm/module.js @@ -1,6 +1,11 @@ 'use strict'; -const { Object, Symbol, SafePromise } = primordials; +const { + ObjectCreate, + ObjectDefineProperty, + Symbol, + SafePromise, +} = primordials; const { isContext } = internalBinding('contextify'); const { isModuleNamespaceObject } = require('internal/util/types'); @@ -89,7 +94,7 @@ class Module { context[kPerContextModuleId] += 1; } else { identifier = `${defaultModuleName}(0)`; - Object.defineProperty(context, kPerContextModuleId, { + ObjectDefineProperty(context, kPerContextModuleId, { value: 1, writable: true, enumerable: false, @@ -217,7 +222,7 @@ class Module { if (typeof depth === 'number' && depth < 0) return options.stylize(`[${ctor.name}]`, 'special'); - const o = Object.create({ constructor: ctor }); + const o = ObjectCreate({ constructor: ctor }); o.status = this.status; o.identifier = this.identifier; o.context = this.context; diff --git a/lib/internal/worker.js b/lib/internal/worker.js index 614f930105..699bf24346 100644 --- a/lib/internal/worker.js +++ b/lib/internal/worker.js @@ -2,7 +2,11 @@ /* global SharedArrayBuffer */ -const { Math, Object } = primordials; +const { + MathMax, + ObjectCreate, + ObjectEntries, +} = primordials; const EventEmitter = require('events'); const assert = require('internal/assert'); @@ -94,8 +98,8 @@ class Worker extends EventEmitter { let env; if (typeof options.env === 'object' && options.env !== null) { - env = Object.create(null); - for (const [ key, value ] of Object.entries(options.env)) + env = ObjectCreate(null); + for (const [ key, value ] of ObjectEntries(options.env)) env[key] = `${value}`; } else if (options.env == null) { env = process.env; @@ -318,7 +322,7 @@ function parseResourceLimits(obj) { if (typeof obj !== 'object' || obj === null) return ret; if (typeof obj.maxOldGenerationSizeMb === 'number') - ret[kMaxOldGenerationSizeMb] = Math.max(obj.maxOldGenerationSizeMb, 2); + ret[kMaxOldGenerationSizeMb] = MathMax(obj.maxOldGenerationSizeMb, 2); if (typeof obj.maxYoungGenerationSizeMb === 'number') ret[kMaxYoungGenerationSizeMb] = obj.maxYoungGenerationSizeMb; if (typeof obj.codeRangeSizeMb === 'number') diff --git a/lib/internal/worker/io.js b/lib/internal/worker/io.js index ba2150e530..a672dac94c 100644 --- a/lib/internal/worker/io.js +++ b/lib/internal/worker/io.js @@ -1,6 +1,13 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectAssign, + ObjectCreate, + ObjectDefineProperty, + ObjectGetOwnPropertyDescriptors, + ObjectGetPrototypeOf, + ObjectSetPrototypeOf, +} = primordials; const { handle_onclose: handleOnCloseSymbol, @@ -48,12 +55,12 @@ const messageTypes = { // not provide methods that are not present in the Browser and not documented // on our side (e.g. hasRef). // Save a copy of the original set of methods as a shallow clone. -const MessagePortPrototype = Object.create( - Object.getPrototypeOf(MessagePort.prototype), - Object.getOwnPropertyDescriptors(MessagePort.prototype)); +const MessagePortPrototype = ObjectCreate( + ObjectGetPrototypeOf(MessagePort.prototype), + ObjectGetOwnPropertyDescriptors(MessagePort.prototype)); // Set up the new inheritance chain. -Object.setPrototypeOf(MessagePort, EventEmitter); -Object.setPrototypeOf(MessagePort.prototype, EventEmitter.prototype); +ObjectSetPrototypeOf(MessagePort, EventEmitter); +ObjectSetPrototypeOf(MessagePort.prototype, EventEmitter.prototype); // Copy methods that are inherited from HandleWrap, because // changing the prototype of MessagePort.prototype implicitly removed them. MessagePort.prototype.ref = MessagePortPrototype.ref; @@ -73,7 +80,7 @@ MessagePort.prototype[kOnMessageListener] = function onmessage(event) { // This is for compatibility with the Web's MessagePort API. It makes sense to // provide it as an `EventEmitter` in Node.js, but if somebody overrides // `onmessage`, we'll switch over to the Web API model. -Object.defineProperty(MessagePort.prototype, 'onmessage', { +ObjectDefineProperty(MessagePort.prototype, 'onmessage', { enumerable: true, configurable: true, get() { @@ -96,7 +103,7 @@ function oninit() { setupPortReferencing(this, this, 'message'); } -Object.defineProperty(MessagePort.prototype, onInitSymbol, { +ObjectDefineProperty(MessagePort.prototype, onInitSymbol, { enumerable: true, writable: false, value: oninit @@ -107,7 +114,7 @@ function onclose() { this.emit('close'); } -Object.defineProperty(MessagePort.prototype, handleOnCloseSymbol, { +ObjectDefineProperty(MessagePort.prototype, handleOnCloseSymbol, { enumerable: false, writable: false, value: onclose @@ -119,7 +126,7 @@ MessagePort.prototype.close = function(cb) { MessagePortPrototype.close.call(this); }; -Object.defineProperty(MessagePort.prototype, inspect.custom, { +ObjectDefineProperty(MessagePort.prototype, inspect.custom, { enumerable: false, writable: false, value: function inspect() { // eslint-disable-line func-name-matching @@ -129,14 +136,14 @@ Object.defineProperty(MessagePort.prototype, inspect.custom, { // e.g. when accessing the prototype directly. ref = MessagePortPrototype.hasRef.call(this); } catch { return this; } - return Object.assign(Object.create(MessagePort.prototype), - ref === undefined ? { - active: false, - } : { - active: true, - refed: ref - }, - this); + return ObjectAssign(ObjectCreate(MessagePort.prototype), + ref === undefined ? { + active: false, + } : { + active: true, + refed: ref + }, + this); } }); diff --git a/lib/net.js b/lib/net.js index 2ff9bbd216..749895444b 100644 --- a/lib/net.js +++ b/lib/net.js @@ -22,10 +22,8 @@ 'use strict'; const { - Object: { - defineProperty: ObjectDefineProperty, - setPrototypeOf: ObjectSetPrototypeOf - } + ObjectDefineProperty, + ObjectSetPrototypeOf, } = primordials; const EventEmitter = require('events'); diff --git a/lib/os.js b/lib/os.js index d312c7d298..51520802d8 100644 --- a/lib/os.js +++ b/lib/os.js @@ -21,7 +21,9 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperties, +} = primordials; const { safeGetenv } = internalBinding('credentials'); const constants = internalBinding('constants').os; @@ -287,7 +289,7 @@ module.exports = { tmpDir: deprecate(tmpdir, tmpDirDeprecationMsg, 'DEP0022') }; -Object.defineProperties(module.exports, { +ObjectDefineProperties(module.exports, { constants: { configurable: false, enumerable: true, diff --git a/lib/perf_hooks.js b/lib/perf_hooks.js index 18b0332fea..ac4fc405c5 100644 --- a/lib/perf_hooks.js +++ b/lib/perf_hooks.js @@ -1,6 +1,10 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperties, + ObjectDefineProperty, + ObjectKeys, +} = primordials; const { ELDHistogram: _ELDHistogram, @@ -215,7 +219,7 @@ const nodeTiming = new PerformanceNodeTiming(); // Maintains a list of entries as a linked list stored in insertion order. class PerformanceObserverEntryList { constructor() { - Object.defineProperties(this, { + ObjectDefineProperties(this, { [kEntries]: { writable: true, enumerable: false, @@ -280,7 +284,7 @@ class PerformanceObserver extends AsyncResource { throw new ERR_INVALID_CALLBACK(callback); } super('PerformanceObserver'); - Object.defineProperties(this, { + ObjectDefineProperties(this, { [kTypes]: { enumerable: false, writable: true, @@ -312,7 +316,7 @@ class PerformanceObserver extends AsyncResource { disconnect() { const observerCountsGC = observerCounts[NODE_PERFORMANCE_ENTRY_TYPE_GC]; const types = this[kTypes]; - const keys = Object.keys(types); + const keys = ObjectKeys(types); for (var n = 0; n < keys.length; n++) { const item = types[keys[n]]; if (item) { @@ -413,13 +417,13 @@ class Performance { if (fn[kTimerified]) return fn[kTimerified]; const ret = timerify(fn, fn.length); - Object.defineProperty(fn, kTimerified, { + ObjectDefineProperty(fn, kTimerified, { enumerable: false, configurable: true, writable: false, value: ret }); - Object.defineProperties(ret, { + ObjectDefineProperties(ret, { [kTimerified]: { enumerable: false, configurable: true, @@ -610,7 +614,7 @@ module.exports = { monitorEventLoopDelay }; -Object.defineProperty(module.exports, 'constants', { +ObjectDefineProperty(module.exports, 'constants', { configurable: false, enumerable: true, value: constants diff --git a/lib/querystring.js b/lib/querystring.js index 40f6d3dafb..1573114e08 100644 --- a/lib/querystring.js +++ b/lib/querystring.js @@ -23,7 +23,10 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectCreate, + ObjectKeys, +} = primordials; const { Buffer } = require('buffer'); const { @@ -167,7 +170,7 @@ function stringify(obj, sep, eq, options) { } if (obj !== null && typeof obj === 'object') { - const keys = Object.keys(obj); + const keys = ObjectKeys(obj); const len = keys.length; const flast = len - 1; let fields = ''; @@ -233,7 +236,7 @@ function addKeyVal(obj, key, value, keyEncoded, valEncoded, decode) { // Parse a key/val string. function parse(qs, sep, eq, options) { - const obj = Object.create(null); + const obj = ObjectCreate(null); if (typeof qs !== 'string' || qs.length === 0) { return obj; diff --git a/lib/readline.js b/lib/readline.js index 13c70fbb8c..c29aabb82b 100644 --- a/lib/readline.js +++ b/lib/readline.js @@ -27,7 +27,13 @@ 'use strict'; -const { Math, Object } = primordials; +const { + MathCeil, + MathFloor, + MathMax, + ObjectDefineProperty, + ObjectSetPrototypeOf, +} = primordials; const { ERR_INVALID_CALLBACK, @@ -150,7 +156,7 @@ function Interface(input, output, completer, terminal) { this.historySize = historySize; this.removeHistoryDuplicates = !!removeHistoryDuplicates; this.crlfDelay = crlfDelay ? - Math.max(kMincrlfDelay, crlfDelay) : kMincrlfDelay; + MathMax(kMincrlfDelay, crlfDelay) : kMincrlfDelay; // Check arity, 2 - for async, 1 for sync if (typeof completer === 'function') { this.completer = completer.length === 2 ? @@ -251,10 +257,10 @@ function Interface(input, output, completer, terminal) { input.resume(); } -Object.setPrototypeOf(Interface.prototype, EventEmitter.prototype); -Object.setPrototypeOf(Interface, EventEmitter); +ObjectSetPrototypeOf(Interface.prototype, EventEmitter.prototype); +ObjectSetPrototypeOf(Interface, EventEmitter); -Object.defineProperty(Interface.prototype, 'columns', { +ObjectDefineProperty(Interface.prototype, 'columns', { configurable: true, enumerable: true, get: function() { @@ -507,7 +513,7 @@ Interface.prototype._tabComplete = function(lastKeypressWasTab) { const width = completions.reduce(function completionReducer(a, b) { return a.length > b.length ? a : b; }).length + 2; // 2 space padding - let maxColumns = Math.floor(self.columns / width); + let maxColumns = MathFloor(self.columns / width); if (!maxColumns || maxColumns === Infinity) { maxColumns = 1; } @@ -541,7 +547,7 @@ function handleGroup(self, group, width, maxColumns) { if (group.length === 0) { return; } - const minRows = Math.ceil(group.length / maxColumns); + const minRows = MathCeil(group.length / maxColumns); for (let row = 0; row < minRows; row++) { for (let col = 0; col < maxColumns; col++) { const idx = row * maxColumns + col; @@ -733,7 +739,7 @@ Interface.prototype._getDisplayPos = function(str) { } if (code === 0x0a) { // new line \n // row must be incremented by 1 even if offset = 0 or col = +Infinity - row += Math.ceil(offset / col) || 1; + row += MathCeil(offset / col) || 1; offset = 0; continue; } diff --git a/lib/repl.js b/lib/repl.js index 21c0505b85..8519eeffd6 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -42,7 +42,18 @@ 'use strict'; -const { Math, Object, ObjectPrototype } = primordials; +const { + MathMax, + ObjectAssign, + ObjectCreate, + ObjectDefineProperty, + ObjectGetOwnPropertyDescriptor, + ObjectGetOwnPropertyNames, + ObjectGetPrototypeOf, + ObjectKeys, + ObjectPrototypeHasOwnProperty, + ObjectSetPrototypeOf, +} = primordials; const { builtinLibs, @@ -235,7 +246,7 @@ function REPLServer(prompt, domainSet.add(this._domain); let rli = this; - Object.defineProperty(this, 'rli', { + ObjectDefineProperty(this, 'rli', { get: deprecate(() => rli, 'REPLServer.rli is deprecated', 'DEP0124'), set: deprecate((val) => rli = val, @@ -552,7 +563,7 @@ function REPLServer(prompt, self.lines.level = []; self.clearBufferedCommand(); - Object.defineProperty(this, 'bufferedCommand', { + ObjectDefineProperty(this, 'bufferedCommand', { get: deprecate(() => self[kBufferedCommandSymbol], 'REPLServer.bufferedCommand is deprecated', 'DEP0074'), @@ -580,7 +591,7 @@ function REPLServer(prompt, prompt }); - this.commands = Object.create(null); + this.commands = ObjectCreate(null); defineDefaultCommands(this); // Figure out which "writer" function to use @@ -591,7 +602,7 @@ function REPLServer(prompt, writer.options.colors = self.useColors; if (options[kStandaloneREPL]) { - Object.defineProperty(inspect, 'replDefaults', { + ObjectDefineProperty(inspect, 'replDefaults', { get() { return writer.options; }, @@ -599,7 +610,7 @@ function REPLServer(prompt, if (options === null || typeof options !== 'object') { throw new ERR_INVALID_ARG_TYPE('options', 'Object', options); } - return Object.assign(writer.options, options); + return ObjectAssign(writer.options, options); }, enumerable: true, configurable: true @@ -820,8 +831,8 @@ function REPLServer(prompt, self.displayPrompt(); } -Object.setPrototypeOf(REPLServer.prototype, Interface.prototype); -Object.setPrototypeOf(REPLServer, Interface); +ObjectSetPrototypeOf(REPLServer.prototype, Interface.prototype); +ObjectSetPrototypeOf(REPLServer, Interface); exports.REPLServer = REPLServer; @@ -884,16 +895,16 @@ REPLServer.prototype.createContext = function() { }, () => { context = vm.createContext(); }); - for (const name of Object.getOwnPropertyNames(global)) { + for (const name of ObjectGetOwnPropertyNames(global)) { // Only set properties on the context that do not exist as primordial. if (!(name in primordials)) { - Object.defineProperty(context, name, - Object.getOwnPropertyDescriptor(global, name)); + ObjectDefineProperty(context, name, + ObjectGetOwnPropertyDescriptor(global, name)); } } context.global = context; const _console = new Console(this.outputStream); - Object.defineProperty(context, 'console', { + ObjectDefineProperty(context, 'console', { configurable: true, writable: true, value: _console @@ -903,12 +914,12 @@ REPLServer.prototype.createContext = function() { const module = new CJSModule(''); module.paths = CJSModule._resolveLookupPaths('', parentModule) || []; - Object.defineProperty(context, 'module', { + ObjectDefineProperty(context, 'module', { configurable: true, writable: true, value: module }); - Object.defineProperty(context, 'require', { + ObjectDefineProperty(context, 'require', { configurable: true, writable: true, value: makeRequireFunction(module) @@ -926,7 +937,7 @@ REPLServer.prototype.resetContext = function() { this.lines = []; this.lines.level = []; - Object.defineProperty(this.context, '_', { + ObjectDefineProperty(this.context, '_', { configurable: true, get: () => this.last, set: (value) => { @@ -938,7 +949,7 @@ REPLServer.prototype.resetContext = function() { } }); - Object.defineProperty(this.context, '_error', { + ObjectDefineProperty(this.context, '_error', { configurable: true, get: () => this.lastError, set: (value) => { @@ -990,8 +1001,8 @@ function ArrayStream() { this.emit('data', `${data[n]}\n`); }; } -Object.setPrototypeOf(ArrayStream.prototype, Stream.prototype); -Object.setPrototypeOf(ArrayStream, Stream); +ObjectSetPrototypeOf(ArrayStream.prototype, Stream.prototype); +ObjectSetPrototypeOf(ArrayStream, Stream); ArrayStream.prototype.readable = true; ArrayStream.prototype.writable = true; ArrayStream.prototype.resume = function() {}; @@ -1092,7 +1103,7 @@ function complete(line, callback) { let filter; let match = line.match(/^\s*\.(\w*)$/); if (match) { - completionGroups.push(Object.keys(this.commands)); + completionGroups.push(ObjectKeys(this.commands)); completeOn = match[1]; if (match[1].length) { filter = match[1]; @@ -1101,7 +1112,7 @@ function complete(line, callback) { completionGroupsLoaded(); } else if (match = line.match(requireRE)) { // require('...') - const exts = Object.keys(this.context.require.extensions); + const exts = ObjectKeys(this.context.require.extensions); const indexRe = new RegExp('^index(?:' + exts.map(regexpEscape).join('|') + ')$'); const versionedFileNamesRe = /-\d+\.\d+/; @@ -1229,7 +1240,7 @@ function complete(line, callback) { if (this.useGlobal || vm.isContext(this.context)) { completionGroups.push(getGlobalLexicalScopeNames(this[kContextId])); let contextProto = this.context; - while (contextProto = Object.getPrototypeOf(contextProto)) { + while (contextProto = ObjectGetPrototypeOf(contextProto)) { completionGroups.push( filteredOwnPropertyNames.call(this, contextProto)); } @@ -1271,13 +1282,13 @@ function complete(line, callback) { let sentinel = 5; let p; if (typeof obj === 'object' || typeof obj === 'function') { - p = Object.getPrototypeOf(obj); + p = ObjectGetPrototypeOf(obj); } else { p = obj.constructor ? obj.constructor.prototype : null; } while (p !== null) { memberGroups.push(filteredOwnPropertyNames.call(this, p)); - p = Object.getPrototypeOf(p); + p = ObjectGetPrototypeOf(p); // Circular refs possible? Let's guard against that. sentinel--; if (sentinel <= 0) { @@ -1336,7 +1347,7 @@ function complete(line, callback) { group.sort(); for (let j = group.length - 1; j >= 0; j--) { const c = group[j]; - if (!ObjectPrototype.hasOwnProperty(uniq, c)) { + if (!ObjectPrototypeHasOwnProperty(uniq, c)) { completions.unshift(c); uniq[c] = true; } @@ -1532,9 +1543,9 @@ function defineDefaultCommands(repl) { repl.defineCommand('help', { help: 'Print this help message', action: function() { - const names = Object.keys(this.commands).sort(); + const names = ObjectKeys(this.commands).sort(); const longestNameLength = names.reduce( - (max, name) => Math.max(max, name.length), + (max, name) => MathMax(max, name.length), 0 ); for (let n = 0; n < names.length; n++) { @@ -1604,6 +1615,6 @@ function regexpEscape(s) { function Recoverable(err) { this.err = err; } -Object.setPrototypeOf(Recoverable.prototype, SyntaxError.prototype); -Object.setPrototypeOf(Recoverable, SyntaxError); +ObjectSetPrototypeOf(Recoverable.prototype, SyntaxError.prototype); +ObjectSetPrototypeOf(Recoverable, SyntaxError); exports.Recoverable = Recoverable; diff --git a/lib/string_decoder.js b/lib/string_decoder.js index 7df50eb017..a070b4303d 100644 --- a/lib/string_decoder.js +++ b/lib/string_decoder.js @@ -21,7 +21,9 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperties, +} = primordials; const { Buffer } = require('buffer'); const { @@ -95,7 +97,7 @@ StringDecoder.prototype.text = function text(buf, offset) { return this.write(buf.slice(offset)); }; -Object.defineProperties(StringDecoder.prototype, { +ObjectDefineProperties(StringDecoder.prototype, { lastChar: { configurable: true, enumerable: true, diff --git a/lib/timers.js b/lib/timers.js index 584f6bc952..68327e2c3e 100644 --- a/lib/timers.js +++ b/lib/timers.js @@ -21,7 +21,9 @@ 'use strict'; -const { Math } = primordials; +const { + MathTrunc, +} = primordials; const { immediateInfo, @@ -77,7 +79,7 @@ function unenroll(item) { // That function could then be used by http and other similar modules. if (item[kRefed]) { // Compliment truncation during insert(). - const msecs = Math.trunc(item._idleTimeout); + const msecs = MathTrunc(item._idleTimeout); const list = timerListMap[msecs]; if (list !== undefined && L.isEmpty(list)) { debug('unenroll: list empty'); diff --git a/lib/tls.js b/lib/tls.js index 5372aadccd..8c7e79572d 100644 --- a/lib/tls.js +++ b/lib/tls.js @@ -21,7 +21,10 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectDefineProperty, + ObjectFreeze, +} = primordials; const { ERR_TLS_CERT_ALTNAME_INVALID, @@ -82,10 +85,10 @@ exports.getCiphers = internalUtil.cachedResult( let rootCertificates; function cacheRootCertificates() { - rootCertificates = Object.freeze(getRootCertificates()); + rootCertificates = ObjectFreeze(getRootCertificates()); } -Object.defineProperty(exports, 'rootCertificates', { +ObjectDefineProperty(exports, 'rootCertificates', { configurable: false, enumerable: true, get: () => { diff --git a/lib/tty.js b/lib/tty.js index cc22a3b499..3b431a1d88 100644 --- a/lib/tty.js +++ b/lib/tty.js @@ -21,7 +21,9 @@ 'use strict'; -const { Object } = primordials; +const { + ObjectSetPrototypeOf, +} = primordials; const net = require('net'); const { TTY, isTTY } = internalBinding('tty_wrap'); @@ -63,8 +65,8 @@ function ReadStream(fd, options) { this.isTTY = true; } -Object.setPrototypeOf(ReadStream.prototype, net.Socket.prototype); -Object.setPrototypeOf(ReadStream, net.Socket); +ObjectSetPrototypeOf(ReadStream.prototype, net.Socket.prototype); +ObjectSetPrototypeOf(ReadStream, net.Socket); ReadStream.prototype.setRawMode = function(flag) { flag = !!flag; @@ -110,8 +112,8 @@ function WriteStream(fd) { } } -Object.setPrototypeOf(WriteStream.prototype, net.Socket.prototype); -Object.setPrototypeOf(WriteStream, net.Socket); +ObjectSetPrototypeOf(WriteStream.prototype, net.Socket.prototype); +ObjectSetPrototypeOf(WriteStream, net.Socket); WriteStream.prototype.isTTY = true; diff --git a/lib/url.js b/lib/url.js index fc3863f6ef..316b2a12ee 100644 --- a/lib/url.js +++ b/lib/url.js @@ -21,7 +21,11 @@ 'use strict'; -const { Object, SafeSet } = primordials; +const { + ObjectCreate, + ObjectKeys, + SafeSet, +} = primordials; const { toASCII } = require('internal/idna'); const { encodeStr, hexTable } = require('internal/querystring'); @@ -248,7 +252,7 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) { } } else if (parseQueryString) { this.search = null; - this.query = Object.create(null); + this.query = ObjectCreate(null); } return this; } @@ -437,7 +441,7 @@ Url.prototype.parse = function parse(url, parseQueryString, slashesDenoteHost) { } else if (parseQueryString) { // No query string, but parseQueryString still requested this.search = null; - this.query = Object.create(null); + this.query = ObjectCreate(null); } const useQuestionIdx = @@ -677,7 +681,7 @@ Url.prototype.resolveObject = function resolveObject(relative) { } const result = new Url(); - const tkeys = Object.keys(this); + const tkeys = ObjectKeys(this); for (let tk = 0; tk < tkeys.length; tk++) { const tkey = tkeys[tk]; result[tkey] = this[tkey]; @@ -696,7 +700,7 @@ Url.prototype.resolveObject = function resolveObject(relative) { // Hrefs like //foo/bar always cut to the protocol. if (relative.slashes && !relative.protocol) { // Take everything except the protocol from relative - const rkeys = Object.keys(relative); + const rkeys = ObjectKeys(relative); for (let rk = 0; rk < rkeys.length; rk++) { const rkey = rkeys[rk]; if (rkey !== 'protocol') @@ -723,7 +727,7 @@ Url.prototype.resolveObject = function resolveObject(relative) { // because that's known to be hostless. // anything else is assumed to be absolute. if (!slashedProtocol.has(relative.protocol)) { - const keys = Object.keys(relative); + const keys = ObjectKeys(relative); for (let v = 0; v < keys.length; v++) { const k = keys[v]; result[k] = relative[k]; diff --git a/lib/util.js b/lib/util.js index 5ac2516f73..438fa5f102 100644 --- a/lib/util.js +++ b/lib/util.js @@ -21,7 +21,15 @@ 'use strict'; -const { Object, ObjectPrototype, Reflect } = primordials; +const { + ObjectDefineProperties, + ObjectDefineProperty, + ObjectGetOwnPropertyDescriptors, + ObjectKeys, + ObjectPrototypeToString, + ObjectSetPrototypeOf, + ReflectApply, +} = primordials; const { codes: { @@ -85,7 +93,7 @@ function isObject(arg) { } function isError(e) { - return ObjectPrototype.toString(e) === '[object Error]' || e instanceof Error; + return ObjectPrototypeToString(e) === '[object Error]' || e instanceof Error; } function isFunction(arg) { @@ -149,19 +157,19 @@ function inherits(ctor, superCtor) { throw new ERR_INVALID_ARG_TYPE('superCtor.prototype', 'Object', superCtor.prototype); } - Object.defineProperty(ctor, 'super_', { + ObjectDefineProperty(ctor, 'super_', { value: superCtor, writable: true, configurable: true }); - Object.setPrototypeOf(ctor.prototype, superCtor.prototype); + ObjectSetPrototypeOf(ctor.prototype, superCtor.prototype); } function _extend(target, source) { // Don't do anything if source isn't an object if (source === null || typeof source !== 'object') return target; - const keys = Object.keys(source); + const keys = ObjectKeys(source); let i = keys.length; while (i--) { target[keys[i]] = source[keys[i]]; @@ -193,15 +201,15 @@ function callbackify(original) { if (typeof maybeCb !== 'function') { throw new ERR_INVALID_ARG_TYPE('last argument', 'Function', maybeCb); } - const cb = (...args) => { Reflect.apply(maybeCb, this, args); }; + const cb = (...args) => { ReflectApply(maybeCb, this, args); }; // In true node style we process the callback on `nextTick` with all the // implications (stack, `uncaughtException`, `async_hooks`) - Reflect.apply(original, this, args) + ReflectApply(original, this, args) .then((ret) => process.nextTick(cb, null, ret), (rej) => process.nextTick(callbackifyOnRejected, rej, cb)); } - const descriptors = Object.getOwnPropertyDescriptors(original); + const descriptors = ObjectGetOwnPropertyDescriptors(original); // It is possible to manipulate a functions `length` or `name` property. This // guards against the manipulation. if (typeof descriptors.length.value === 'number') { @@ -210,7 +218,7 @@ function callbackify(original) { if (typeof descriptors.name.value === 'string') { descriptors.name.value += 'Callbackified'; } - Object.defineProperties(callbackified, descriptors); + ObjectDefineProperties(callbackified, descriptors); return callbackified; } diff --git a/lib/v8.js b/lib/v8.js index 32c2f3aa1b..2156998d66 100644 --- a/lib/v8.js +++ b/lib/v8.js @@ -14,7 +14,9 @@ 'use strict'; -const { ObjectPrototype } = primordials; +const { + ObjectPrototypeToString, +} = primordials; const { Buffer } = require('buffer'); const { validateString } = require('internal/validators'); @@ -220,7 +222,7 @@ const arrayBufferViewTypeToIndex = new Map(); { const dummy = new ArrayBuffer(); for (const [i, ctor] of arrayBufferViewTypes.entries()) { - const tag = ObjectPrototype.toString(new ctor(dummy)); + const tag = ObjectPrototypeToString(new ctor(dummy)); arrayBufferViewTypeToIndex.set(tag, i); } } @@ -239,7 +241,7 @@ class DefaultSerializer extends Serializer { if (abView.constructor === Buffer) { i = bufferConstructorIndex; } else { - const tag = ObjectPrototype.toString(abView); + const tag = ObjectPrototypeToString(abView); i = arrayBufferViewTypeToIndex.get(tag); if (i === undefined) { diff --git a/lib/vm.js b/lib/vm.js index 8d44a92c80..d12a460df6 100644 --- a/lib/vm.js +++ b/lib/vm.js @@ -21,7 +21,10 @@ 'use strict'; -const { Array, ArrayPrototype } = primordials; +const { + ArrayIsArray, + ArrayPrototypeForEach, +} = primordials; const { ContextifyScript, @@ -309,11 +312,11 @@ function runInThisContext(code, options) { function compileFunction(code, params, options = {}) { validateString(code, 'code'); if (params !== undefined) { - if (!Array.isArray(params)) { + if (!ArrayIsArray(params)) { throw new ERR_INVALID_ARG_TYPE('params', 'Array', params); } - ArrayPrototype.forEach(params, - (param, i) => validateString(param, `params[${i}]`)); + ArrayPrototypeForEach(params, + (param, i) => validateString(param, `params[${i}]`)); } const { @@ -356,14 +359,14 @@ function compileFunction(code, params, options = {}) { ); } } - if (!Array.isArray(contextExtensions)) { + if (!ArrayIsArray(contextExtensions)) { throw new ERR_INVALID_ARG_TYPE( 'options.contextExtensions', 'Array', contextExtensions ); } - ArrayPrototype.forEach(contextExtensions, (extension, i) => { + ArrayPrototypeForEach(contextExtensions, (extension, i) => { if (typeof extension !== 'object') { throw new ERR_INVALID_ARG_TYPE( `options.contextExtensions[${i}]`, diff --git a/lib/zlib.js b/lib/zlib.js index 445a538035..4b34267318 100644 --- a/lib/zlib.js +++ b/lib/zlib.js @@ -21,7 +21,15 @@ 'use strict'; -const { Math, Object } = primordials; +const { + MathMax, + ObjectDefineProperties, + ObjectDefineProperty, + ObjectFreeze, + ObjectGetPrototypeOf, + ObjectKeys, + ObjectSetPrototypeOf, +} = primordials; const { codes: { @@ -80,7 +88,7 @@ const codes = { Z_VERSION_ERROR: constants.Z_VERSION_ERROR }; -const ckeys = Object.keys(codes); +const ckeys = ObjectKeys(codes); for (var ck = 0; ck < ckeys.length; ck++) { var ckey = ckeys[ck]; codes[codes[ckey]] = ckey; @@ -92,7 +100,7 @@ function zlibBuffer(engine, buffer, callback) { // Streams do not support non-Buffer ArrayBufferViews yet. Convert it to a // Buffer without copying. if (isArrayBufferView(buffer) && - Object.getPrototypeOf(buffer) !== Buffer.prototype) { + ObjectGetPrototypeOf(buffer) !== Buffer.prototype) { buffer = Buffer.from(buffer.buffer, buffer.byteOffset, buffer.byteLength); } else if (isAnyArrayBuffer(buffer)) { buffer = Buffer.from(buffer); @@ -267,10 +275,10 @@ function ZlibBase(opts, mode, handle, { flush, finishFlush, fullFlush }) { this.once('end', this.close); this._info = opts && opts.info; } -Object.setPrototypeOf(ZlibBase.prototype, Transform.prototype); -Object.setPrototypeOf(ZlibBase, Transform); +ObjectSetPrototypeOf(ZlibBase.prototype, Transform.prototype); +ObjectSetPrototypeOf(ZlibBase, Transform); -Object.defineProperty(ZlibBase.prototype, '_closed', { +ObjectDefineProperty(ZlibBase.prototype, '_closed', { configurable: true, enumerable: true, get() { @@ -282,7 +290,7 @@ Object.defineProperty(ZlibBase.prototype, '_closed', { // perspective, but it is inconsistent with all other streams exposed by Node.js // that have this concept, where it stands for the number of bytes read // *from* the stream (that is, net.Socket/tls.Socket & file system streams). -Object.defineProperty(ZlibBase.prototype, 'bytesRead', { +ObjectDefineProperty(ZlibBase.prototype, 'bytesRead', { configurable: true, enumerable: true, get: deprecate(function() { @@ -661,8 +669,8 @@ function Zlib(opts, mode) { this._level = level; this._strategy = strategy; } -Object.setPrototypeOf(Zlib.prototype, ZlibBase.prototype); -Object.setPrototypeOf(Zlib, ZlibBase); +ObjectSetPrototypeOf(Zlib.prototype, ZlibBase.prototype); +ObjectSetPrototypeOf(Zlib, ZlibBase); // This callback is used by `.params()` to wait until a full flush happened // before adjusting the parameters. In particular, the call to the native @@ -697,32 +705,32 @@ function Deflate(opts) { return new Deflate(opts); Zlib.call(this, opts, DEFLATE); } -Object.setPrototypeOf(Deflate.prototype, Zlib.prototype); -Object.setPrototypeOf(Deflate, Zlib); +ObjectSetPrototypeOf(Deflate.prototype, Zlib.prototype); +ObjectSetPrototypeOf(Deflate, Zlib); function Inflate(opts) { if (!(this instanceof Inflate)) return new Inflate(opts); Zlib.call(this, opts, INFLATE); } -Object.setPrototypeOf(Inflate.prototype, Zlib.prototype); -Object.setPrototypeOf(Inflate, Zlib); +ObjectSetPrototypeOf(Inflate.prototype, Zlib.prototype); +ObjectSetPrototypeOf(Inflate, Zlib); function Gzip(opts) { if (!(this instanceof Gzip)) return new Gzip(opts); Zlib.call(this, opts, GZIP); } -Object.setPrototypeOf(Gzip.prototype, Zlib.prototype); -Object.setPrototypeOf(Gzip, Zlib); +ObjectSetPrototypeOf(Gzip.prototype, Zlib.prototype); +ObjectSetPrototypeOf(Gzip, Zlib); function Gunzip(opts) { if (!(this instanceof Gunzip)) return new Gunzip(opts); Zlib.call(this, opts, GUNZIP); } -Object.setPrototypeOf(Gunzip.prototype, Zlib.prototype); -Object.setPrototypeOf(Gunzip, Zlib); +ObjectSetPrototypeOf(Gunzip.prototype, Zlib.prototype); +ObjectSetPrototypeOf(Gunzip, Zlib); function DeflateRaw(opts) { if (opts && opts.windowBits === 8) opts.windowBits = 9; @@ -730,24 +738,24 @@ function DeflateRaw(opts) { return new DeflateRaw(opts); Zlib.call(this, opts, DEFLATERAW); } -Object.setPrototypeOf(DeflateRaw.prototype, Zlib.prototype); -Object.setPrototypeOf(DeflateRaw, Zlib); +ObjectSetPrototypeOf(DeflateRaw.prototype, Zlib.prototype); +ObjectSetPrototypeOf(DeflateRaw, Zlib); function InflateRaw(opts) { if (!(this instanceof InflateRaw)) return new InflateRaw(opts); Zlib.call(this, opts, INFLATERAW); } -Object.setPrototypeOf(InflateRaw.prototype, Zlib.prototype); -Object.setPrototypeOf(InflateRaw, Zlib); +ObjectSetPrototypeOf(InflateRaw.prototype, Zlib.prototype); +ObjectSetPrototypeOf(InflateRaw, Zlib); function Unzip(opts) { if (!(this instanceof Unzip)) return new Unzip(opts); Zlib.call(this, opts, UNZIP); } -Object.setPrototypeOf(Unzip.prototype, Zlib.prototype); -Object.setPrototypeOf(Unzip, Zlib); +ObjectSetPrototypeOf(Unzip.prototype, Zlib.prototype); +ObjectSetPrototypeOf(Unzip, Zlib); function createConvenienceMethod(ctor, sync) { if (sync) { @@ -765,7 +773,7 @@ function createConvenienceMethod(ctor, sync) { } } -const kMaxBrotliParam = Math.max(...Object.keys(constants).map((key) => { +const kMaxBrotliParam = MathMax(...ObjectKeys(constants).map((key) => { return key.startsWith('BROTLI_PARAM_') ? constants[key] : 0; })); @@ -781,7 +789,7 @@ function Brotli(opts, mode) { brotliInitParamsArray.fill(-1); if (opts && opts.params) { - for (const origKey of Object.keys(opts.params)) { + for (const origKey of ObjectKeys(opts.params)) { const key = +origKey; if (Number.isNaN(key) || key < 0 || key > kMaxBrotliParam || (brotliInitParamsArray[key] | 0) !== -1) { @@ -809,24 +817,24 @@ function Brotli(opts, mode) { ZlibBase.call(this, opts, mode, handle, brotliDefaultOpts); } -Object.setPrototypeOf(Brotli.prototype, Zlib.prototype); -Object.setPrototypeOf(Brotli, Zlib); +ObjectSetPrototypeOf(Brotli.prototype, Zlib.prototype); +ObjectSetPrototypeOf(Brotli, Zlib); function BrotliCompress(opts) { if (!(this instanceof BrotliCompress)) return new BrotliCompress(opts); Brotli.call(this, opts, BROTLI_ENCODE); } -Object.setPrototypeOf(BrotliCompress.prototype, Brotli.prototype); -Object.setPrototypeOf(BrotliCompress, Brotli); +ObjectSetPrototypeOf(BrotliCompress.prototype, Brotli.prototype); +ObjectSetPrototypeOf(BrotliCompress, Brotli); function BrotliDecompress(opts) { if (!(this instanceof BrotliDecompress)) return new BrotliDecompress(opts); Brotli.call(this, opts, BROTLI_DECODE); } -Object.setPrototypeOf(BrotliDecompress.prototype, Brotli.prototype); -Object.setPrototypeOf(BrotliDecompress, Brotli); +ObjectSetPrototypeOf(BrotliDecompress.prototype, Brotli.prototype); +ObjectSetPrototypeOf(BrotliDecompress, Brotli); function createProperty(ctor) { @@ -841,7 +849,7 @@ function createProperty(ctor) { // Legacy alias on the C++ wrapper object. This is not public API, so we may // want to runtime-deprecate it at some point. There's no hurry, though. -Object.defineProperty(binding.Zlib.prototype, 'jsref', { +ObjectDefineProperty(binding.Zlib.prototype, 'jsref', { get() { return this[owner_symbol]; }, set(v) { return this[owner_symbol] = v; } }); @@ -879,7 +887,7 @@ module.exports = { brotliDecompressSync: createConvenienceMethod(BrotliDecompress, true), }; -Object.defineProperties(module.exports, { +ObjectDefineProperties(module.exports, { createDeflate: createProperty(Deflate), createInflate: createProperty(Inflate), createDeflateRaw: createProperty(DeflateRaw), @@ -897,17 +905,17 @@ Object.defineProperties(module.exports, { codes: { enumerable: true, writable: false, - value: Object.freeze(codes) + value: ObjectFreeze(codes) } }); // These should be considered deprecated // expose all the zlib constants -const bkeys = Object.keys(constants); +const bkeys = ObjectKeys(constants); for (var bk = 0; bk < bkeys.length; bk++) { var bkey = bkeys[bk]; if (bkey.startsWith('BROTLI')) continue; - Object.defineProperty(module.exports, bkey, { + ObjectDefineProperty(module.exports, bkey, { enumerable: false, value: constants[bkey], writable: false }); }