@@ -302,136 +302,136 @@ function objectComparisonStart(val1, val2, mode, memos) {
302302 return false ;
303303 }
304304 return keyCheck ( val1 , val2 , mode , memos , kIsArray , keys2 ) ;
305- } else {
306- let val1Tag ;
307- if ( val1 [ SymbolToStringTag ] === undefined &&
308- ( val1Tag = ObjectPrototypeToString ( val1 ) ) === '[object Object]' ) {
309- if ( slowHasUnequalTag ( val1Tag , val1 , val2 ) ) {
310- return false ;
311- }
312- return keyCheck ( val1 , val2 , mode , memos , kNoIterator ) ;
313- } else if ( isSet ( val1 ) ) {
314- if ( ! isSet ( val2 ) ||
315- ( val1 . size !== val2 . size && ( mode !== kPartial || val1 . size < val2 . size ) ) ||
316- hasUnequalTag ( val1 , val2 ) ) {
317- return false ;
318- }
319- return keyCheck ( val1 , val2 , mode , memos , kIsSet ) ;
320- } else if ( isMap ( val1 ) ) {
321- if ( ! isMap ( val2 ) ||
322- ( val1 . size !== val2 . size && ( mode !== kPartial || val1 . size < val2 . size ) ) ||
323- hasUnequalTag ( val1 , val2 ) ) {
324- return false ;
325- }
326- return keyCheck ( val1 , val2 , mode , memos , kIsMap ) ;
327- } else if ( isArrayBufferView ( val1 ) ) {
328- if ( TypedArrayPrototypeGetSymbolToStringTag ( val1 ) !==
329- TypedArrayPrototypeGetSymbolToStringTag ( val2 ) ) {
330- return false ;
331- }
332- if ( mode === kPartial && val1 . byteLength !== val2 . byteLength ) {
333- if ( ! isPartialArrayBufferView ( val1 , val2 ) ) {
334- return false ;
335- }
336- } else if ( mode === kLoose &&
337- ( isFloat32Array ( val1 ) || isFloat64Array ( val1 ) || isFloat16Array ( val1 ) ) ) {
338- if ( ! areSimilarFloatArrays ( val1 , val2 ) ) {
339- return false ;
340- }
341- } else if ( ! areSimilarTypedArrays ( val1 , val2 ) ) {
342- return false ;
343- }
344- // Buffer.compare returns true, so val1.length === val2.length. If they both
345- // only contain numeric keys, we don't need to exam further than checking
346- // the symbols.
347- const filter = mode !== kLoose ? ONLY_ENUMERABLE : ONLY_ENUMERABLE | SKIP_SYMBOLS ;
348- const keys2 = getOwnNonIndexProperties ( val2 , filter ) ;
349- if ( mode !== kPartial &&
350- keys2 . length !== getOwnNonIndexProperties ( val1 , filter ) . length ) {
351- return false ;
352- }
353- return keyCheck ( val1 , val2 , mode , memos , kNoIterator , keys2 ) ;
354- } else if ( isDate ( val1 ) ) {
355- if ( ! isDate ( val2 ) ) {
356- return false ;
357- }
358- const time1 = DatePrototypeGetTime ( val1 ) ;
359- const time2 = DatePrototypeGetTime ( val2 ) ;
360- // eslint-disable-next-line no-self-compare
361- if ( time1 !== time2 && ( time1 === time1 || time2 === time2 ) ) {
362- return false ;
363- }
364- } else if ( isRegExp ( val1 ) ) {
365- if ( ! isRegExp ( val2 ) || ! areSimilarRegExps ( val1 , val2 ) || hasUnequalTag ( val1 , val2 ) ) {
366- return false ;
367- }
368- } else if ( isAnyArrayBuffer ( val1 ) ) {
369- if ( ! isAnyArrayBuffer ( val2 ) || hasUnequalTag ( val1 , val2 ) ) {
370- return false ;
371- }
372- if ( mode !== kPartial || val1 . byteLength === val2 . byteLength ) {
373- if ( ! areEqualArrayBuffers ( val1 , val2 ) ) {
374- return false ;
375- }
376- } else if ( ! isPartialUint8Array ( new Uint8Array ( val1 ) , new Uint8Array ( val2 ) ) ) {
377- return false ;
378- }
379- } else if ( slowHasUnequalTag ( val1Tag ?? ObjectPrototypeToString ( val1 ) , val1 , val2 ) ||
380- ArrayIsArray ( val2 ) ||
381- isArrayBufferView ( val2 ) ||
382- isSet ( val2 ) ||
383- isMap ( val2 ) ||
384- isDate ( val2 ) ||
385- isRegExp ( val2 ) ||
386- isAnyArrayBuffer ( val2 ) ) {
305+ }
306+
307+ let val1Tag ;
308+ if ( val1 [ SymbolToStringTag ] === undefined &&
309+ ( val1Tag = ObjectPrototypeToString ( val1 ) ) === '[object Object]' ) {
310+ if ( slowHasUnequalTag ( val1Tag , val1 , val2 ) ) {
387311 return false ;
388- } else if ( isError ( val1 ) ) {
389- // Do not compare the stack as it might differ even though the error itself
390- // is otherwise identical.
391- if ( ! isError ( val2 ) ||
392- ! isEnumerableOrIdentical ( val1 , val2 , 'message' , mode , memos ) ||
393- ! isEnumerableOrIdentical ( val1 , val2 , 'name' , mode , memos ) ||
394- ! isEnumerableOrIdentical ( val1 , val2 , 'cause' , mode , memos ) ||
395- ! isEnumerableOrIdentical ( val1 , val2 , 'errors' , mode , memos ) ) {
396- return false ;
397- }
398- const hasOwnVal2Cause = hasOwn ( val2 , 'cause' ) ;
399- if ( ( hasOwnVal2Cause !== hasOwn ( val1 , 'cause' ) && ( mode !== kPartial || hasOwnVal2Cause ) ) ) {
400- return false ;
401- }
402- } else if ( isBoxedPrimitive ( val1 ) ) {
403- if ( ! isEqualBoxedPrimitive ( val1 , val2 ) ) {
404- return false ;
405- }
406- } else if ( isURL ( val1 ) ) {
407- if ( ! isURL ( val2 ) || val1 . href !== val2 . href ) {
312+ }
313+ return keyCheck ( val1 , val2 , mode , memos , kNoIterator ) ;
314+ } else if ( isSet ( val1 ) ) {
315+ if ( ! isSet ( val2 ) ||
316+ ( val1 . size !== val2 . size && ( mode !== kPartial || val1 . size < val2 . size ) ) ||
317+ hasUnequalTag ( val1 , val2 ) ) {
318+ return false ;
319+ }
320+ return keyCheck ( val1 , val2 , mode , memos , kIsSet ) ;
321+ } else if ( isMap ( val1 ) ) {
322+ if ( ! isMap ( val2 ) ||
323+ ( val1 . size !== val2 . size && ( mode !== kPartial || val1 . size < val2 . size ) ) ||
324+ hasUnequalTag ( val1 , val2 ) ) {
325+ return false ;
326+ }
327+ return keyCheck ( val1 , val2 , mode , memos , kIsMap ) ;
328+ } else if ( isArrayBufferView ( val1 ) ) {
329+ if ( TypedArrayPrototypeGetSymbolToStringTag ( val1 ) !==
330+ TypedArrayPrototypeGetSymbolToStringTag ( val2 ) ) {
331+ return false ;
332+ }
333+ if ( mode === kPartial && val1 . byteLength !== val2 . byteLength ) {
334+ if ( ! isPartialArrayBufferView ( val1 , val2 ) ) {
408335 return false ;
409336 }
410- } else if ( isKeyObject ( val1 ) ) {
411- if ( ! isKeyObject ( val2 ) || ! val1 . equals ( val2 ) ) {
337+ } else if ( mode === kLoose &&
338+ ( isFloat32Array ( val1 ) || isFloat64Array ( val1 ) || isFloat16Array ( val1 ) ) ) {
339+ if ( ! areSimilarFloatArrays ( val1 , val2 ) ) {
412340 return false ;
413341 }
414- } else if ( isCryptoKey ( val1 ) ) {
415- if ( kKeyObject === undefined ) {
416- kKeyObject = require ( 'internal/crypto/util' ) . kKeyObject ;
417- ( { kExtractable, kAlgorithm, kKeyUsages } = require ( 'internal/crypto/keys' ) ) ;
418- }
419- if ( ! isCryptoKey ( val2 ) ||
420- val1 [ kExtractable ] !== val2 [ kExtractable ] ||
421- ! innerDeepEqual ( val1 [ kAlgorithm ] , val2 [ kAlgorithm ] , mode , memos ) ||
422- ! innerDeepEqual ( val1 [ kKeyUsages ] , val2 [ kKeyUsages ] , mode , memos ) ||
423- ! innerDeepEqual ( val1 [ kKeyObject ] , val2 [ kKeyObject ] , mode , memos )
424- ) {
342+ } else if ( ! areSimilarTypedArrays ( val1 , val2 ) ) {
343+ return false ;
344+ }
345+ // Buffer.compare returns true, so val1.length === val2.length. If they both
346+ // only contain numeric keys, we don't need to exam further than checking
347+ // the symbols.
348+ const filter = mode !== kLoose ? ONLY_ENUMERABLE : ONLY_ENUMERABLE | SKIP_SYMBOLS ;
349+ const keys2 = getOwnNonIndexProperties ( val2 , filter ) ;
350+ if ( mode !== kPartial &&
351+ keys2 . length !== getOwnNonIndexProperties ( val1 , filter ) . length ) {
352+ return false ;
353+ }
354+ return keyCheck ( val1 , val2 , mode , memos , kNoIterator , keys2 ) ;
355+ } else if ( isDate ( val1 ) ) {
356+ if ( ! isDate ( val2 ) ) {
357+ return false ;
358+ }
359+ const time1 = DatePrototypeGetTime ( val1 ) ;
360+ const time2 = DatePrototypeGetTime ( val2 ) ;
361+ // eslint-disable-next-line no-self-compare
362+ if ( time1 !== time2 && ( time1 === time1 || time2 === time2 ) ) {
363+ return false ;
364+ }
365+ } else if ( isRegExp ( val1 ) ) {
366+ if ( ! isRegExp ( val2 ) || ! areSimilarRegExps ( val1 , val2 ) || hasUnequalTag ( val1 , val2 ) ) {
367+ return false ;
368+ }
369+ } else if ( isAnyArrayBuffer ( val1 ) ) {
370+ if ( ! isAnyArrayBuffer ( val2 ) || hasUnequalTag ( val1 , val2 ) ) {
371+ return false ;
372+ }
373+ if ( mode !== kPartial || val1 . byteLength === val2 . byteLength ) {
374+ if ( ! areEqualArrayBuffers ( val1 , val2 ) ) {
425375 return false ;
426376 }
427- } else if ( isBoxedPrimitive ( val2 ) ||
428- isNativeError ( val2 ) ||
429- val2 instanceof Error ||
430- isWeakMap ( val1 ) ||
431- isWeakSet ( val1 ) ||
432- isPromise ( val1 ) ) {
377+ } else if ( ! isPartialUint8Array ( new Uint8Array ( val1 ) , new Uint8Array ( val2 ) ) ) {
378+ return false ;
379+ }
380+ } else if ( slowHasUnequalTag ( val1Tag ?? ObjectPrototypeToString ( val1 ) , val1 , val2 ) ||
381+ ArrayIsArray ( val2 ) ||
382+ isArrayBufferView ( val2 ) ||
383+ isSet ( val2 ) ||
384+ isMap ( val2 ) ||
385+ isDate ( val2 ) ||
386+ isRegExp ( val2 ) ||
387+ isAnyArrayBuffer ( val2 ) ) {
388+ return false ;
389+ } else if ( isError ( val1 ) ) {
390+ // Do not compare the stack as it might differ even though the error itself
391+ // is otherwise identical.
392+ if ( ! isError ( val2 ) ||
393+ ! isEnumerableOrIdentical ( val1 , val2 , 'message' , mode , memos ) ||
394+ ! isEnumerableOrIdentical ( val1 , val2 , 'name' , mode , memos ) ||
395+ ! isEnumerableOrIdentical ( val1 , val2 , 'cause' , mode , memos ) ||
396+ ! isEnumerableOrIdentical ( val1 , val2 , 'errors' , mode , memos ) ) {
433397 return false ;
434398 }
399+ const hasOwnVal2Cause = hasOwn ( val2 , 'cause' ) ;
400+ if ( ( hasOwnVal2Cause !== hasOwn ( val1 , 'cause' ) && ( mode !== kPartial || hasOwnVal2Cause ) ) ) {
401+ return false ;
402+ }
403+ } else if ( isBoxedPrimitive ( val1 ) ) {
404+ if ( ! isEqualBoxedPrimitive ( val1 , val2 ) ) {
405+ return false ;
406+ }
407+ } else if ( isURL ( val1 ) ) {
408+ if ( ! isURL ( val2 ) || val1 . href !== val2 . href ) {
409+ return false ;
410+ }
411+ } else if ( isKeyObject ( val1 ) ) {
412+ if ( ! isKeyObject ( val2 ) || ! val1 . equals ( val2 ) ) {
413+ return false ;
414+ }
415+ } else if ( isCryptoKey ( val1 ) ) {
416+ if ( kKeyObject === undefined ) {
417+ kKeyObject = require ( 'internal/crypto/util' ) . kKeyObject ;
418+ ( { kExtractable, kAlgorithm, kKeyUsages } = require ( 'internal/crypto/keys' ) ) ;
419+ }
420+ if ( ! isCryptoKey ( val2 ) ||
421+ val1 [ kExtractable ] !== val2 [ kExtractable ] ||
422+ ! innerDeepEqual ( val1 [ kAlgorithm ] , val2 [ kAlgorithm ] , mode , memos ) ||
423+ ! innerDeepEqual ( val1 [ kKeyUsages ] , val2 [ kKeyUsages ] , mode , memos ) ||
424+ ! innerDeepEqual ( val1 [ kKeyObject ] , val2 [ kKeyObject ] , mode , memos )
425+ ) {
426+ return false ;
427+ }
428+ } else if ( isBoxedPrimitive ( val2 ) ||
429+ isNativeError ( val2 ) ||
430+ val2 instanceof Error ||
431+ isWeakMap ( val1 ) ||
432+ isWeakSet ( val1 ) ||
433+ isPromise ( val1 ) ) {
434+ return false ;
435435 }
436436
437437 return keyCheck ( val1 , val2 , mode , memos , kNoIterator ) ;
0 commit comments