@@ -115,6 +115,10 @@ const meta = [
115115 '' , '' , '' , '' , '' , '' , '' , '' , '' , '' ,
116116 '' , '' , '' , '' , '' , '' , '' , '\\\\'
117117] ;
118+ // Constants to map the iterator state.
119+ const kWeak = 0 ;
120+ const kIterator = 1 ;
121+ const kMapEntries = 2 ;
118122
119123const escapeFn = ( str ) => meta [ str . charCodeAt ( 0 ) ] ;
120124
@@ -982,77 +986,83 @@ function formatMap(ctx, value, recurseTimes, keys) {
982986 return output ;
983987}
984988
985- function formatWeakSet ( ctx , value , recurseTimes , keys ) {
989+ function formatSetIterInner ( ctx , value , recurseTimes , keys , entries , state ) {
986990 const maxArrayLength = Math . max ( ctx . maxArrayLength , 0 ) ;
987- const [ entries ] = previewEntries ( value ) . slice ( 0 , maxArrayLength + 1 ) ;
988991 const maxLength = Math . min ( maxArrayLength , entries . length ) ;
989992 let output = new Array ( maxLength ) ;
990993 for ( var i = 0 ; i < maxLength ; ++ i )
991994 output [ i ] = formatValue ( ctx , entries [ i ] , recurseTimes ) ;
992- // Sort all entries to have a halfway reliable output (if more entries than
993- // retrieved ones exist, we can not reliably return the same output).
994- output = output . sort ( ) ;
995- if ( entries . length > maxArrayLength )
996- output . push ( '... more items' ) ;
995+ if ( state === kWeak ) {
996+ // Sort all entries to have a halfway reliable output (if more entries than
997+ // retrieved ones exist, we can not reliably return the same output).
998+ output = output . sort ( ) ;
999+ }
1000+ const remaining = entries . length - maxLength ;
1001+ if ( remaining > 0 ) {
1002+ output . push ( `... ${ remaining } more item${ remaining > 1 ? 's' : '' } ` ) ;
1003+ }
9971004 for ( i = 0 ; i < keys . length ; i ++ )
9981005 output . push ( formatProperty ( ctx , value , recurseTimes , keys [ i ] , 0 ) ) ;
9991006 return output ;
10001007}
10011008
1002- function formatWeakMap ( ctx , value , recurseTimes , keys ) {
1009+ function formatMapIterInner ( ctx , value , recurseTimes , keys , entries , state ) {
10031010 const maxArrayLength = Math . max ( ctx . maxArrayLength , 0 ) ;
1004- const [ entries ] = previewEntries ( value ) . slice ( 0 , ( maxArrayLength + 1 ) * 2 ) ;
10051011 // Entries exist as [key1, val1, key2, val2, ...]
1006- const remainder = entries . length / 2 > maxArrayLength ;
1007- const len = entries . length / 2 - ( remainder ? 1 : 0 ) ;
1012+ const len = entries . length / 2 ;
1013+ const remaining = len - maxArrayLength ;
10081014 const maxLength = Math . min ( maxArrayLength , len ) ;
10091015 let output = new Array ( maxLength ) ;
1010- for ( var i = 0 ; i < maxLength ; i ++ ) {
1016+ let start = '' ;
1017+ let end = '' ;
1018+ let middle = ' => ' ;
1019+ let i = 0 ;
1020+ if ( state === kMapEntries ) {
1021+ start = '[ ' ;
1022+ end = ' ]' ;
1023+ middle = ', ' ;
1024+ }
1025+ for ( ; i < maxLength ; i ++ ) {
10111026 const pos = i * 2 ;
1012- output [ i ] = `${ formatValue ( ctx , entries [ pos ] , recurseTimes ) } => ` +
1013- formatValue ( ctx , entries [ pos + 1 ] , recurseTimes ) ;
1027+ output [ i ] = `${ start } ${ formatValue ( ctx , entries [ pos ] , recurseTimes ) } ` +
1028+ `${ middle } ${ formatValue ( ctx , entries [ pos + 1 ] , recurseTimes ) } ${ end } ` ;
1029+ }
1030+ if ( state === kWeak ) {
1031+ // Sort all entries to have a halfway reliable output (if more entries
1032+ // than retrieved ones exist, we can not reliably return the same output).
1033+ output = output . sort ( ) ;
1034+ }
1035+ if ( remaining > 0 ) {
1036+ output . push ( `... ${ remaining } more item${ remaining > 1 ? 's' : '' } ` ) ;
10141037 }
1015- // Sort all entries to have a halfway reliable output (if more entries than
1016- // retrieved ones exist, we can not reliably return the same output).
1017- output = output . sort ( ) ;
1018- if ( remainder > 0 )
1019- output . push ( '... more items' ) ;
10201038 for ( i = 0 ; i < keys . length ; i ++ )
10211039 output . push ( formatProperty ( ctx , value , recurseTimes , keys [ i ] , 0 ) ) ;
10221040 return output ;
10231041}
10241042
1025- function zip2 ( list ) {
1026- const ret = Array ( list . length / 2 ) ;
1027- for ( var i = 0 ; i < ret . length ; ++ i )
1028- ret [ i ] = [ list [ 2 * i ] , list [ 2 * i + 1 ] ] ;
1029- return ret ;
1043+ function formatWeakSet ( ctx , value , recurseTimes , keys ) {
1044+ const entries = previewEntries ( value ) ;
1045+ return formatSetIterInner ( ctx , value , recurseTimes , keys , entries , kWeak ) ;
10301046}
10311047
1032- function formatCollectionIterator ( ctx , value , recurseTimes , keys ) {
1033- const output = [ ] ;
1034- var [ entries , isKeyValue ] = previewEntries ( value ) ;
1035- if ( isKeyValue )
1036- entries = zip2 ( entries ) ;
1037- for ( const entry of entries ) {
1038- if ( ctx . maxArrayLength === output . length ) {
1039- output . push ( '... more items' ) ;
1040- break ;
1041- }
1042- output . push ( formatValue ( ctx , entry , recurseTimes ) ) ;
1043- }
1044- for ( var n = 0 ; n < keys . length ; n ++ ) {
1045- output . push ( formatProperty ( ctx , value , recurseTimes , keys [ n ] , 0 ) ) ;
1046- }
1047- return output ;
1048+ function formatWeakMap ( ctx , value , recurseTimes , keys ) {
1049+ const entries = previewEntries ( value ) ;
1050+ return formatMapIterInner ( ctx , value , recurseTimes , keys , entries , kWeak ) ;
10481051}
10491052
1050- function formatMapIterator ( ctx , value , recurseTimes , keys ) {
1051- return formatCollectionIterator ( ctx , value , recurseTimes , keys ) ;
1053+ function formatSetIterator ( ctx , value , recurseTimes , keys ) {
1054+ const entries = previewEntries ( value ) ;
1055+ return formatSetIterInner ( ctx , value , recurseTimes , keys , entries , kIterator ) ;
10521056}
10531057
1054- function formatSetIterator ( ctx , value , recurseTimes , keys ) {
1055- return formatCollectionIterator ( ctx , value , recurseTimes , keys ) ;
1058+ function formatMapIterator ( ctx , value , recurseTimes , keys ) {
1059+ const [ entries , isKeyValue ] = previewEntries ( value , true ) ;
1060+ if ( isKeyValue ) {
1061+ return formatMapIterInner (
1062+ ctx , value , recurseTimes , keys , entries , kMapEntries ) ;
1063+ }
1064+
1065+ return formatSetIterInner ( ctx , value , recurseTimes , keys , entries , kIterator ) ;
10561066}
10571067
10581068function formatPromise ( ctx , value , recurseTimes , keys ) {
0 commit comments