Skip to content

Commit 757c104

Browse files
authored
tools: add prefer-proto rule
fixup: add support for `Object.create(null)` fixup: extend to any 1-argument Object.create call fixup: add tests PR-URL: #46083 Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Geoffrey Booth <[email protected]> Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Mohammed Keyvanzadeh <[email protected]> Reviewed-By: Darshan Sen <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Jacob Smith <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]>
1 parent 5d9a9a6 commit 757c104

File tree

87 files changed

+307
-231
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+307
-231
lines changed

.eslintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ module.exports = {
314314
// Custom rules from eslint-plugin-node-core
315315
'node-core/no-unescaped-regexp-dot': 'error',
316316
'node-core/no-duplicate-requires': 'error',
317+
'node-core/prefer-proto': 'error',
317318
},
318319
globals: {
319320
ByteLengthQueuingStrategy: 'readable',

benchmark/es/map-bench.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ function runObject(n) {
2525
}
2626

2727
function runNullProtoObject(n) {
28-
const m = Object.create(null);
28+
const m = { __proto__: null };
2929
bench.start();
3030
for (let i = 0; i < n; i++) {
3131
m[`i${i}`] = i;
@@ -51,7 +51,7 @@ function runNullProtoLiteralObject(n) {
5151
}
5252

5353
function StorageObject() {}
54-
StorageObject.prototype = Object.create(null);
54+
StorageObject.prototype = { __proto__: null };
5555

5656
function runStorageObject(n) {
5757
const m = new StorageObject();

doc/api/assert.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,7 @@ const obj3 = {
664664
b: 1,
665665
},
666666
};
667-
const obj4 = Object.create(obj1);
667+
const obj4 = { __proto__: obj1 };
668668

669669
assert.deepEqual(obj1, obj1);
670670
// OK
@@ -699,7 +699,7 @@ const obj3 = {
699699
b: 1,
700700
},
701701
};
702-
const obj4 = Object.create(obj1);
702+
const obj4 = { __proto__: obj1 };
703703

704704
assert.deepEqual(obj1, obj1);
705705
// OK
@@ -1623,7 +1623,7 @@ const obj3 = {
16231623
b: 1,
16241624
},
16251625
};
1626-
const obj4 = Object.create(obj1);
1626+
const obj4 = { __proto__: obj1 };
16271627

16281628
assert.notDeepEqual(obj1, obj1);
16291629
// AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }
@@ -1656,7 +1656,7 @@ const obj3 = {
16561656
b: 1,
16571657
},
16581658
};
1659-
const obj4 = Object.create(obj1);
1659+
const obj4 = { __proto__: obj1 };
16601660

16611661
assert.notDeepEqual(obj1, obj1);
16621662
// AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }

lib/_http_agent.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ const {
3232
FunctionPrototypeCall,
3333
NumberIsNaN,
3434
NumberParseInt,
35-
ObjectCreate,
3635
ObjectKeys,
3736
ObjectSetPrototypeOf,
3837
ObjectValues,
@@ -111,9 +110,9 @@ function Agent(options) {
111110

112111
// Don't confuse net and make it think that we're connecting to a pipe
113112
this.options.path = null;
114-
this.requests = ObjectCreate(null);
115-
this.sockets = ObjectCreate(null);
116-
this.freeSockets = ObjectCreate(null);
113+
this.requests = { __proto__: null };
114+
this.sockets = { __proto__: null };
115+
this.freeSockets = { __proto__: null };
117116
this.keepAliveMsecs = this.options.keepAliveMsecs || 1000;
118117
this.keepAlive = this.options.keepAlive || false;
119118
this.maxSockets = this.options.maxSockets || Agent.defaultMaxSockets;

lib/_http_outgoing.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ const {
2828
MathAbs,
2929
MathFloor,
3030
NumberPrototypeToString,
31-
ObjectCreate,
3231
ObjectDefineProperty,
3332
ObjectKeys,
3433
ObjectValues,
@@ -217,7 +216,7 @@ ObjectDefineProperty(OutgoingMessage.prototype, '_headers', {
217216
if (val == null) {
218217
this[kOutHeaders] = null;
219218
} else if (typeof val === 'object') {
220-
const headers = this[kOutHeaders] = ObjectCreate(null);
219+
const headers = this[kOutHeaders] = { __proto__: null };
221220
const keys = ObjectKeys(val);
222221
// Retain for(;;) loop for performance reasons
223222
// Refs: https://github.com/nodejs/node/pull/30958
@@ -244,7 +243,7 @@ ObjectDefineProperty(OutgoingMessage.prototype, '_headerNames', {
244243
get: internalUtil.deprecate(function() {
245244
const headers = this[kOutHeaders];
246245
if (headers !== null) {
247-
const out = ObjectCreate(null);
246+
const out = { __proto__: null };
248247
const keys = ObjectKeys(headers);
249248
// Retain for(;;) loop for performance reasons
250249
// Refs: https://github.com/nodejs/node/pull/30958
@@ -667,7 +666,7 @@ OutgoingMessage.prototype.setHeader = function setHeader(name, value) {
667666

668667
let headers = this[kOutHeaders];
669668
if (headers === null)
670-
this[kOutHeaders] = headers = ObjectCreate(null);
669+
this[kOutHeaders] = headers = { __proto__: null };
671670

672671
headers[StringPrototypeToLowerCase(name)] = [name, value];
673672
return this;
@@ -764,7 +763,7 @@ OutgoingMessage.prototype.getRawHeaderNames = function getRawHeaderNames() {
764763
// Returns a shallow copy of the current outgoing headers.
765764
OutgoingMessage.prototype.getHeaders = function getHeaders() {
766765
const headers = this[kOutHeaders];
767-
const ret = ObjectCreate(null);
766+
const ret = { __proto__: null };
768767
if (headers) {
769768
const keys = ObjectKeys(headers);
770769
// Retain for(;;) loop for performance reasons

lib/_tls_common.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ const tls = require('tls');
2626
const {
2727
ArrayPrototypePush,
2828
JSONParse,
29-
ObjectCreate,
3029
RegExpPrototypeSymbolReplace,
3130
} = primordials;
3231

@@ -131,7 +130,7 @@ function translatePeerCertificate(c) {
131130
}
132131
if (c.infoAccess != null) {
133132
const info = c.infoAccess;
134-
c.infoAccess = ObjectCreate(null);
133+
c.infoAccess = { __proto__: null };
135134

136135
// XXX: More key validation?
137136
RegExpPrototypeSymbolReplace(/([^\n:]*):([^\n]*)(?:\n|$)/g, info,

lib/buffer.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ const {
3333
NumberIsNaN,
3434
NumberMAX_SAFE_INTEGER,
3535
NumberMIN_SAFE_INTEGER,
36-
ObjectCreate,
3736
ObjectDefineProperties,
3837
ObjectDefineProperty,
3938
ObjectSetPrototypeOf,
@@ -146,7 +145,7 @@ const constants = ObjectDefineProperties({}, {
146145
Buffer.poolSize = 8 * 1024;
147146
let poolSize, poolOffset, allocPool;
148147

149-
const encodingsMap = ObjectCreate(null);
148+
const encodingsMap = { __proto__: null };
150149
for (let i = 0; i < encodings.length; ++i)
151150
encodingsMap[encodings[i]] = i;
152151

@@ -845,7 +844,7 @@ Buffer.prototype[customInspectSymbol] = function inspect(recurseTimes, ctx) {
845844
if (ctx) {
846845
let extras = false;
847846
const filter = ctx.showHidden ? ALL_PROPERTIES : ONLY_ENUMERABLE;
848-
const obj = ObjectCreate(null);
847+
const obj = { __proto__: null };
849848
ArrayPrototypeForEach(getOwnNonIndexProperties(this, filter),
850849
(key) => {
851850
extras = true;

lib/diagnostics_channel.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ const {
44
ArrayPrototypeIndexOf,
55
ArrayPrototypePush,
66
ArrayPrototypeSplice,
7-
ObjectCreate,
87
ObjectGetPrototypeOf,
98
ObjectSetPrototypeOf,
109
SymbolHasInstance,
@@ -92,7 +91,7 @@ class Channel {
9291
publish() {}
9392
}
9493

95-
const channels = ObjectCreate(null);
94+
const channels = { __proto__: null };
9695

9796
function channel(name) {
9897
let channel;

lib/events.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ const {
3535
FunctionPrototypeCall,
3636
NumberIsNaN,
3737
NumberMAX_SAFE_INTEGER,
38-
ObjectCreate,
3938
ObjectDefineProperty,
4039
ObjectDefineProperties,
4140
ObjectGetPrototypeOf,
@@ -344,7 +343,7 @@ EventEmitter.init = function(opts) {
344343

345344
if (this._events === undefined ||
346345
this._events === ObjectGetPrototypeOf(this)._events) {
347-
this._events = ObjectCreate(null);
346+
this._events = { __proto__: null };
348347
this._eventsCount = 0;
349348
}
350349

@@ -553,7 +552,7 @@ function _addListener(target, type, listener, prepend) {
553552

554553
events = target._events;
555554
if (events === undefined) {
556-
events = target._events = ObjectCreate(null);
555+
events = target._events = { __proto__: null };
557556
target._eventsCount = 0;
558557
} else {
559558
// To avoid recursion in the case that type === "newListener"! Before
@@ -691,7 +690,7 @@ EventEmitter.prototype.removeListener =
691690

692691
if (list === listener || list.listener === listener) {
693692
if (--this._eventsCount === 0)
694-
this._events = ObjectCreate(null);
693+
this._events = { __proto__: null };
695694
else {
696695
delete events[type];
697696
if (events.removeListener)
@@ -746,11 +745,11 @@ EventEmitter.prototype.removeAllListeners =
746745
// Not listening for removeListener, no need to emit
747746
if (events.removeListener === undefined) {
748747
if (arguments.length === 0) {
749-
this._events = ObjectCreate(null);
748+
this._events = { __proto__: null };
750749
this._eventsCount = 0;
751750
} else if (events[type] !== undefined) {
752751
if (--this._eventsCount === 0)
753-
this._events = ObjectCreate(null);
752+
this._events = { __proto__: null };
754753
else
755754
delete events[type];
756755
}
@@ -764,7 +763,7 @@ EventEmitter.prototype.removeAllListeners =
764763
this.removeAllListeners(key);
765764
}
766765
this.removeAllListeners('removeListener');
767-
this._events = ObjectCreate(null);
766+
this._events = { __proto__: null };
768767
this._eventsCount = 0;
769768
return this;
770769
}

lib/internal/assert/assertion_error.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ const {
66
Error,
77
ErrorCaptureStackTrace,
88
MathMax,
9-
ObjectCreate,
109
ObjectDefineProperty,
1110
ObjectGetPrototypeOf,
1211
ObjectKeys,
@@ -48,7 +47,7 @@ const kMaxShortLength = 12;
4847

4948
function copyError(source) {
5049
const keys = ObjectKeys(source);
51-
const target = ObjectCreate(ObjectGetPrototypeOf(source));
50+
const target = { __proto__: ObjectGetPrototypeOf(source) };
5251
for (const key of keys) {
5352
target[key] = source[key];
5453
}

0 commit comments

Comments
 (0)