Skip to content

Commit ed69a3a

Browse files
ljharbRafaelGSS
authored andcommitted
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 Backport-PR-URL: #46239 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Geoffrey Booth <webadmin@geoffreybooth.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Mohammed Keyvanzadeh <mohammadkeyvanzade94@gmail.com> Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Jacob Smith <jacob@frende.me> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
1 parent 6cd7057 commit ed69a3a

87 files changed

Lines changed: 308 additions & 232 deletions

File tree

Some content is hidden

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

‎.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
functionrunNullProtoObject(n){
28-
constm=Object.create(null);
28+
constm={__proto__: null};
2929
bench.start();
3030
for(leti=0;i<n;i++){
3131
m[`i${i}`]=i;
@@ -51,7 +51,7 @@ function runNullProtoLiteralObject(n) {
5151
}
5252

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

5656
functionrunStorageObject(n){
5757
constm=newStorageObject();

‎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-
constobj4=Object.create(obj1);
667+
constobj4={ __proto__:obj1 };
668668

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

704704
assert.deepEqual(obj1, obj1);
705705
// OK
@@ -1623,7 +1623,7 @@ const obj3 = {
16231623
b:1,
16241624
},
16251625
};
1626-
constobj4=Object.create(obj1);
1626+
constobj4={ __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-
constobj4=Object.create(obj1);
1659+
constobj4={ __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
}elseif(typeofval==='object'){
220-
constheaders=this[kOutHeaders]=ObjectCreate(null);
219+
constheaders=this[kOutHeaders]={__proto__: null};
221220
constkeys=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
constheaders=this[kOutHeaders];
246245
if(headers!==null){
247-
constout=ObjectCreate(null);
246+
constout={__proto__: null};
248247
constkeys=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
letheaders=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
returnthis;
@@ -742,7 +741,7 @@ OutgoingMessage.prototype.getRawHeaderNames = function getRawHeaderNames() {
742741
// Returns a shallow copy of the current outgoing headers.
743742
OutgoingMessage.prototype.getHeaders=functiongetHeaders(){
744743
constheaders=this[kOutHeaders];
745-
constret=ObjectCreate(null);
744+
constret={__proto__: null};
746745
if(headers){
747746
constkeys=ObjectKeys(headers);
748747
// 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
constinfo=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
letpoolSize,poolOffset,allocPool;
148147

149-
constencodingsMap=ObjectCreate(null);
148+
constencodingsMap={__proto__: null};
150149
for(leti=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
letextras=false;
847846
constfilter=ctx.showHidden ? ALL_PROPERTIES : ONLY_ENUMERABLE;
848-
constobj=ObjectCreate(null);
847+
constobj={__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-
constchannels=ObjectCreate(null);
94+
constchannels={__proto__: null};
9695

9796
functionchannel(name){
9897
letchannel;

‎lib/events.js‎

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ const {
3333
FunctionPrototypeBind,
3434
FunctionPrototypeCall,
3535
NumberIsNaN,
36-
ObjectCreate,
3736
ObjectDefineProperty,
3837
ObjectDefineProperties,
3938
ObjectGetPrototypeOf,
@@ -338,7 +337,7 @@ EventEmitter.init = function(opts) {
338337

339338
if(this._events===undefined||
340339
this._events===ObjectGetPrototypeOf(this)._events){
341-
this._events=ObjectCreate(null);
340+
this._events={__proto__: null};
342341
this._eventsCount=0;
343342
}
344343

@@ -547,7 +546,7 @@ function _addListener(target, type, listener, prepend) {
547546

548547
events=target._events;
549548
if(events===undefined){
550-
events=target._events=ObjectCreate(null);
549+
events=target._events={__proto__: null};
551550
target._eventsCount=0;
552551
}else{
553552
// To avoid recursion in the case that type === "newListener"! Before
@@ -685,7 +684,7 @@ EventEmitter.prototype.removeListener =
685684

686685
if(list===listener||list.listener===listener){
687686
if(--this._eventsCount===0)
688-
this._events=ObjectCreate(null);
687+
this._events={__proto__: null};
689688
else{
690689
deleteevents[type];
691690
if(events.removeListener)
@@ -740,11 +739,11 @@ EventEmitter.prototype.removeAllListeners =
740739
// Not listening for removeListener, no need to emit
741740
if(events.removeListener===undefined){
742741
if(arguments.length===0){
743-
this._events=ObjectCreate(null);
742+
this._events={__proto__: null};
744743
this._eventsCount=0;
745744
}elseif(events[type]!==undefined){
746745
if(--this._eventsCount===0)
747-
this._events=ObjectCreate(null);
746+
this._events={__proto__: null};
748747
else
749748
deleteevents[type];
750749
}
@@ -758,7 +757,7 @@ EventEmitter.prototype.removeAllListeners =
758757
this.removeAllListeners(key);
759758
}
760759
this.removeAllListeners('removeListener');
761-
this._events=ObjectCreate(null);
760+
this._events={__proto__: null};
762761
this._eventsCount=0;
763762
returnthis;
764763
}

‎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
functioncopyError(source){
5049
constkeys=ObjectKeys(source);
51-
consttarget=ObjectCreate(ObjectGetPrototypeOf(source));
50+
consttarget={__proto__: ObjectGetPrototypeOf(source)};
5251
for(constkeyofkeys){
5352
target[key]=source[key];
5453
}

0 commit comments

Comments
 (0)