@@ -109,7 +109,6 @@ export class DefaultIterableDiffer implements IterableDiffer {
109109
110110 onDestroy ( ) { }
111111
112- // todo(vicb): optim for UnmodifiableListView (frozen arrays)
113112 check ( collection : any ) : boolean {
114113 this . _reset ( ) ;
115114
@@ -119,24 +118,27 @@ export class DefaultIterableDiffer implements IterableDiffer {
119118 var item ;
120119 var itemTrackBy ;
121120 if ( isArray ( collection ) ) {
122- var list = collection ;
123- this . _length = collection . length ;
124-
125- for ( index = 0 ; index < this . _length ; index ++ ) {
126- item = list [ index ] ;
127- itemTrackBy = this . _trackByFn ( index , item ) ;
128- if ( record === null || ! looseIdentical ( record . trackById , itemTrackBy ) ) {
129- record = this . _mismatch ( record , item , itemTrackBy , index ) ;
130- mayBeDirty = true ;
131- } else {
132- if ( mayBeDirty ) {
133- // TODO(misko): can we limit this to duplicates only?
134- record = this . _verifyReinsertion ( record , item , itemTrackBy , index ) ;
121+ if ( collection !== this . _collection || ! ListWrapper . isImmutable ( collection ) ) {
122+ var list = collection ;
123+ this . _length = collection . length ;
124+
125+ for ( index = 0 ; index < this . _length ; index ++ ) {
126+ item = list [ index ] ;
127+ itemTrackBy = this . _trackByFn ( index , item ) ;
128+ if ( record === null || ! looseIdentical ( record . trackById , itemTrackBy ) ) {
129+ record = this . _mismatch ( record , item , itemTrackBy , index ) ;
130+ mayBeDirty = true ;
131+ } else {
132+ if ( mayBeDirty ) {
133+ // TODO(misko): can we limit this to duplicates only?
134+ record = this . _verifyReinsertion ( record , item , itemTrackBy , index ) ;
135+ }
136+ if ( ! looseIdentical ( record . item , item ) ) this . _addIdentityChange ( record , item ) ;
135137 }
136- if ( ! looseIdentical ( record . item , item ) ) this . _addIdentityChange ( record , item ) ;
137- }
138138
139- record = record . _next ;
139+ record = record . _next ;
140+ }
141+ this . _truncate ( record ) ;
140142 }
141143 } else {
142144 index = 0 ;
@@ -156,9 +158,9 @@ export class DefaultIterableDiffer implements IterableDiffer {
156158 index ++ ;
157159 } ) ;
158160 this . _length = index ;
161+ this . _truncate ( record ) ;
159162 }
160163
161- this . _truncate ( record ) ;
162164 this . _collection = collection ;
163165 return this . isDirty ;
164166 }
0 commit comments