@@ -631,37 +631,34 @@ Expr = Sizzle.selectors = {
631631 var doneName = done ++ ;
632632
633633 return function ( elem ) {
634- var parent , diff ,
635- count = 0 ,
636- node = elem ;
634+ var node , diff ,
635+ childkey = doneName + "." + dirruns + "." ,
636+ parent = elem . parentNode ,
637+ sizset = elem . sizset ;
637638
638639 if ( first === 1 && last === 0 ) {
639640 return true ;
640641 }
641642
642- parent = elem . parentNode ;
643-
644- if ( parent && ( parent [ expando ] !== doneName || ! elem . sizset ) ) {
643+ if ( typeof sizset === "string" && sizset . indexOf ( childkey ) === 0 ) {
644+ diff = sizset . substr ( childkey . length ) ;
645+ } else if ( parent ) {
646+ diff = 0 ;
645647 for ( node = parent . firstChild ; node ; node = node . nextSibling ) {
646648 if ( node . nodeType === 1 ) {
647- node . sizset = ++ count ;
648- if ( node === elem ) {
649+ node . sizset = childkey + ( ++ diff ) ;
650+ if ( elem === node ) {
649651 break ;
650652 }
651653 }
652654 }
653-
654- parent [ expando ] = doneName ;
655655 }
656656
657- diff = elem . sizset - last ;
657+ diff -= last ;
658658
659- if ( first === 0 ) {
660- return diff === 0 ;
661-
662- } else {
663- return ( diff % first === 0 && diff / first >= 0 ) ;
664- }
659+ return first === 0 ?
660+ diff === 0 :
661+ diff % first === 0 && diff / first >= 0 ;
665662 } ;
666663 }
667664
@@ -1125,8 +1122,8 @@ function addCombinator( matcher, combinator ) {
11251122 // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
11261123 if ( ! xml ) {
11271124 var cache ,
1128- dirkey = doneName + "." + dirruns ,
1129- cachedkey = dirkey + "." + cachedruns ;
1125+ dirkey = doneName + "." + dirruns + "." ,
1126+ cachedkey = dirkey + cachedruns ;
11301127 while ( ( elem = elem [ dir ] ) ) {
11311128 if ( elem . nodeType === 1 ) {
11321129 if ( ( cache = elem [ expando ] ) === cachedkey ) {
0 commit comments