MCPcopy Index your code
hub / github.com/nodejs/node / handleCycles

Function handleCycles

lib/internal/util/comparisons.js:523–578  ·  view source on GitHub ↗
(val1, val2, mode, keys1, keys2, memos, iterationType)

Source from the content-addressed store, hash-verified

521}
522
523function handleCycles(val1, val2, mode, keys1, keys2, memos, iterationType) {
524 // Use memos to handle cycles.
525 if (memos === undefined) {
526 memos = {
527 set: undefined,
528 a: val1,
529 b: val2,
530 c: undefined,
531 d: undefined,
532 deep: false,
533 };
534 return objEquiv(val1, val2, mode, keys1, keys2, memos, iterationType);
535 }
536
537 if (memos.set === undefined) {
538 if (memos.deep === false) {
539 if (memos.a === val1) {
540 return memos.b === val2;
541 }
542 if (memos.b === val2) {
543 return false;
544 }
545 memos.c = val1;
546 memos.d = val2;
547 memos.deep = true;
548 const result = objEquiv(val1, val2, mode, keys1, keys2, memos, iterationType);
549 memos.deep = false;
550 if (memos.set !== undefined) {
551 memos.set.delete(memos.c);
552 memos.set.delete(memos.d);
553 }
554 return result;
555 }
556 memos.set = new SafeSet();
557 memos.set.add(memos.a);
558 memos.set.add(memos.b);
559 memos.set.add(memos.c);
560 memos.set.add(memos.d);
561 }
562
563 const { set } = memos;
564
565 const originalSize = set.size;
566 set.add(val1);
567 set.add(val2);
568 if (originalSize !== set.size - 2) {
569 return originalSize === set.size;
570 }
571
572 const areEq = objEquiv(val1, val2, mode, keys1, keys2, memos, iterationType);
573
574 set.delete(val1);
575 set.delete(val2);
576
577 return areEq;
578}
579
580// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Loose_equality_using

Callers 1

keyCheckFunction · 0.85

Calls 3

objEquivFunction · 0.85
deleteMethod · 0.65
addMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…