@@ -274,32 +274,32 @@ module.exports = function() {
274274 else {
275275 var isOldKeyed = old [ 0 ] != null && old [ 0 ] . key != null
276276 var isKeyed = vnodes [ 0 ] != null && vnodes [ 0 ] . key != null
277- var start = 0 , oldStart = 0
278- if ( ! isOldKeyed ) while ( oldStart < old . length && old [ oldStart ] == null ) oldStart ++
279- if ( ! isKeyed ) while ( start < vnodes . length && vnodes [ start ] == null ) start ++
277+ var start = 0 , oldStart = 0 , o , v
280278 if ( isOldKeyed !== isKeyed ) {
281- removeNodes ( parent , old , oldStart , old . length )
282- createNodes ( parent , vnodes , start , vnodes . length , hooks , nextSibling , ns )
279+ removeNodes ( parent , old , 0 , old . length )
280+ createNodes ( parent , vnodes , 0 , vnodes . length , hooks , nextSibling , ns )
283281 } else if ( ! isKeyed ) {
284282 // Don't index past the end of either list (causes deopts).
285283 var commonLength = old . length < vnodes . length ? old . length : vnodes . length
286284 // Rewind if necessary to the first non-null index on either side.
287285 // We could alternatively either explicitly create or remove nodes when `start !== oldStart`
288286 // but that would be optimizing for sparse lists which are more rare than dense ones.
287+ while ( oldStart < old . length && old [ oldStart ] == null ) oldStart ++
288+ while ( start < vnodes . length && vnodes [ start ] == null ) start ++
289289 start = start < oldStart ? start : oldStart
290290 for ( ; start < commonLength ; start ++ ) {
291291 o = old [ start ]
292292 v = vnodes [ start ]
293293 if ( o === v || o == null && v == null ) continue
294- else if ( o == null ) createNode ( parent , v , hooks , ns , getNextSibling ( old , start + 1 , nextSibling ) )
294+ else if ( o == null ) createNode ( parent , v , hooks , ns , getNextSibling ( old , start + 1 , old . length , nextSibling ) )
295295 else if ( v == null ) removeNode ( parent , o )
296- else updateNode ( parent , o , v , hooks , getNextSibling ( old , start + 1 , nextSibling ) , ns )
296+ else updateNode ( parent , o , v , hooks , getNextSibling ( old , start + 1 , old . length , nextSibling ) , ns )
297297 }
298298 if ( old . length > commonLength ) removeNodes ( parent , old , start , old . length )
299299 if ( vnodes . length > commonLength ) createNodes ( parent , vnodes , start , vnodes . length , hooks , nextSibling , ns )
300300 } else {
301301 // keyed diff
302- var oldEnd = old . length - 1 , end = vnodes . length - 1 , map , o , v , oe , ve , topSibling
302+ var oldEnd = old . length - 1 , end = vnodes . length - 1 , oe , ve , topSibling
303303
304304 // bottom-up
305305 while ( oldEnd >= oldStart && end >= start ) {
@@ -316,13 +316,13 @@ module.exports = function() {
316316 v = vnodes [ start ]
317317 if ( o . key !== v . key ) break
318318 oldStart ++ , start ++
319- if ( o !== v ) updateNode ( parent , o , v , hooks , getNextSibling ( old , oldStart , nextSibling ) , ns )
319+ if ( o !== v ) updateNode ( parent , o , v , hooks , getNextSibling ( old , oldStart , oldEnd + 1 , nextSibling ) , ns )
320320 }
321321 // swaps and list reversals
322322 while ( oldEnd >= oldStart && end >= start ) {
323323 if ( start === end ) break
324324 if ( o . key !== ve . key || oe . key !== v . key ) break
325- topSibling = getNextSibling ( old , oldStart , nextSibling )
325+ topSibling = getNextSibling ( old , oldStart , oldEnd , nextSibling )
326326 moveDOM ( parent , oe , topSibling )
327327 if ( oe !== v ) updateNode ( parent , oe , v , hooks , topSibling , ns )
328328 if ( ++ start <= -- end ) moveDOM ( parent , o , nextSibling )
@@ -347,17 +347,18 @@ module.exports = function() {
347347 else if ( oldStart > oldEnd ) createNodes ( parent , vnodes , start , end + 1 , hooks , nextSibling , ns )
348348 else {
349349 // inspired by ivi https://github.com/ivijs/ivi/ by Boris Kaul
350- var originalNextSibling = nextSibling , vnodesLength = end - start + 1 , oldIndices = new Array ( vnodesLength ) , li = 0 , i = 0 , pos = 2147483647 , matched = 0 , map , lisIndices
351- for ( i = 0 ; i < vnodesLength ; i ++ ) oldIndices [ i ] = - 1
352- for ( i = end ; i >= start ; i -- ) {
353- if ( map == null ) map = getKeyMap ( old , oldStart , oldEnd + 1 )
354- ve = vnodes [ i ]
355- var oldIndex = map [ ve . key ]
356- if ( oldIndex != null ) {
357- pos = ( oldIndex < pos ) ? oldIndex : - 1 // becomes -1 if nodes were re-ordered
358- oldIndices [ i - start ] = oldIndex
359- oe = old [ oldIndex ]
360- old [ oldIndex ] = null
350+ var originalNextSibling = nextSibling , pos = 2147483647 , matched = 0
351+ var oldIndices = new Array ( end - start + 1 ) . fill ( - 1 )
352+ var map = Object . create ( null )
353+ for ( var i = start ; i <= end ; i ++ ) map [ vnodes [ i ] . key ] = i
354+ for ( var i = oldEnd ; i >= oldStart ; i -- ) {
355+ oe = old [ i ]
356+ var newIndex = map [ oe . key ]
357+ if ( newIndex != null ) {
358+ pos = ( newIndex < pos ) ? newIndex : - 1 // becomes -1 if nodes were re-ordered
359+ oldIndices [ newIndex - start ] = i
360+ ve = vnodes [ newIndex ]
361+ old [ i ] = null
361362 if ( oe !== ve ) updateNode ( parent , oe , ve , hooks , nextSibling , ns )
362363 if ( ve . dom != null ) nextSibling = ve . dom
363364 matched ++
@@ -370,22 +371,22 @@ module.exports = function() {
370371 if ( pos === - 1 ) {
371372 // the indices of the indices of the items that are part of the
372373 // longest increasing subsequence in the oldIndices list
373- lisIndices = makeLisIndices ( oldIndices )
374- li = lisIndices . length - 1
375- for ( i = end ; i >= start ; i -- ) {
376- v = vnodes [ i ]
377- if ( oldIndices [ i - start ] === - 1 ) createNode ( parent , v , hooks , ns , nextSibling )
374+ var lisIndices = makeLisIndices ( oldIndices )
375+ var li = lisIndices . length - 1
376+ for ( var i = end ; i >= start ; i -- ) {
377+ ve = vnodes [ i ]
378+ if ( oldIndices [ i - start ] === - 1 ) createNode ( parent , ve , hooks , ns , nextSibling )
378379 else {
379380 if ( lisIndices [ li ] === i - start ) li --
380- else moveDOM ( parent , v , nextSibling )
381+ else moveDOM ( parent , ve , nextSibling )
381382 }
382- if ( v . dom != null ) nextSibling = vnodes [ i ] . dom
383+ if ( ve . dom != null ) nextSibling = ve . dom
383384 }
384385 } else {
385- for ( i = end ; i >= start ; i -- ) {
386- v = vnodes [ i ]
387- if ( oldIndices [ i - start ] === - 1 ) createNode ( parent , v , hooks , ns , nextSibling )
388- if ( v . dom != null ) nextSibling = vnodes [ i ] . dom
386+ for ( var i = end ; i >= start ; i -- ) {
387+ ve = vnodes [ i ]
388+ if ( oldIndices [ i - start ] === - 1 ) createNode ( parent , ve , hooks , ns , nextSibling )
389+ if ( ve . dom != null ) nextSibling = ve . dom
389390 }
390391 }
391392 }
@@ -475,17 +476,6 @@ module.exports = function() {
475476 vnode . domSize = 0
476477 }
477478 }
478- function getKeyMap ( vnodes , start , end ) {
479- var map = Object . create ( null )
480- for ( ; start < end ; start ++ ) {
481- var vnode = vnodes [ start ]
482- if ( vnode != null ) {
483- var key = vnode . key
484- if ( key != null ) map [ key ] = start
485- }
486- }
487- return map
488- }
489479 // Lifted from ivi https://github.com/ivijs/ivi/
490480 // takes a list of unique numbers (-1 is special and can
491481 // occur multiple times) and returns an array with the indices
@@ -533,8 +523,8 @@ module.exports = function() {
533523 return result
534524 }
535525
536- function getNextSibling ( vnodes , i , nextSibling ) {
537- for ( ; i < vnodes . length ; i ++ ) {
526+ function getNextSibling ( vnodes , i , end , nextSibling ) {
527+ for ( ; i < end ; i ++ ) {
538528 if ( vnodes [ i ] != null && vnodes [ i ] . dom != null ) return vnodes [ i ] . dom
539529 }
540530 return nextSibling
0 commit comments