@@ -859,7 +859,12 @@ function shallowCopy(src, dst) {
859
859
860
860
return dst || src ;
861
861
}
862
-
862
+ function equalsCacheContains ( cache , o1 , o2 ) {
863
+ for ( var i = 0 , ii = cache . length ; i < ii ; i += 2 ) {
864
+ if ( cache [ i ] === o1 && cache [ i + 1 ] === o2 ) return true ;
865
+ }
866
+ return false ;
867
+ }
863
868
864
869
/**
865
870
* @ngdoc function
@@ -890,24 +895,27 @@ function shallowCopy(src, dst) {
890
895
* @param {* } o2 Object or value to compare.
891
896
* @returns {boolean } True if arguments are equal.
892
897
*/
893
- function equals ( o1 , o2 ) {
898
+ function equals ( o1 , o2 , cache ) {
894
899
if ( o1 === o2 ) return true ;
895
900
if ( o1 === null || o2 === null ) return false ;
896
901
if ( o1 !== o1 && o2 !== o2 ) return true ; // NaN === NaN
902
+ cache = cache || [ ] ;
903
+ if ( equalsCacheContains ( cache , o1 , o2 ) ) return true ;
904
+ cache . push ( o1 , o2 ) ;
897
905
var t1 = typeof o1 , t2 = typeof o2 , length , key , keySet ;
898
906
if ( t1 == t2 ) {
899
907
if ( t1 == 'object' ) {
900
908
if ( isArray ( o1 ) ) {
901
909
if ( ! isArray ( o2 ) ) return false ;
902
910
if ( ( length = o1 . length ) == o2 . length ) {
903
911
for ( key = 0 ; key < length ; key ++ ) {
904
- if ( ! equals ( o1 [ key ] , o2 [ key ] ) ) return false ;
912
+ if ( ! equals ( o1 [ key ] , o2 [ key ] , cache ) ) return false ;
905
913
}
906
914
return true ;
907
915
}
908
916
} else if ( isDate ( o1 ) ) {
909
917
if ( ! isDate ( o2 ) ) return false ;
910
- return equals ( o1 . getTime ( ) , o2 . getTime ( ) ) ;
918
+ return equals ( o1 . getTime ( ) , o2 . getTime ( ) , cache ) ;
911
919
} else if ( isRegExp ( o1 ) ) {
912
920
return isRegExp ( o2 ) ? o1 . toString ( ) == o2 . toString ( ) : false ;
913
921
} else {
@@ -916,7 +924,7 @@ function equals(o1, o2) {
916
924
keySet = { } ;
917
925
for ( key in o1 ) {
918
926
if ( key . charAt ( 0 ) === '$' || isFunction ( o1 [ key ] ) ) continue ;
919
- if ( ! equals ( o1 [ key ] , o2 [ key ] ) ) return false ;
927
+ if ( ! equals ( o1 [ key ] , o2 [ key ] , cache ) ) return false ;
920
928
keySet [ key ] = true ;
921
929
}
922
930
for ( key in o2 ) {
0 commit comments